diff --git a/CommonClient.py b/CommonClient.py index 1aedd518b4..77ed85b5c6 100644 --- a/CommonClient.py +++ b/CommonClient.py @@ -355,6 +355,8 @@ class CommonContext: self.item_names = self.NameLookupDict(self, "item") self.location_names = self.NameLookupDict(self, "location") + self.versions = {} + self.checksums = {} self.jsontotextparser = JSONtoTextParser(self) self.rawjsontotextparser = RawJSONtoTextParser(self) @@ -454,6 +456,7 @@ class CommonContext: if kwargs: payload.update(kwargs) await self.send_msgs([payload]) + await self.send_msgs([{"cmd": "Get", "keys": ["_read_race_mode"]}]) async def console_input(self) -> str: if self.ui: @@ -570,26 +573,34 @@ class CommonContext: needed_updates.add(game) continue - local_version: int = network_data_package["games"].get(game, {}).get("version", 0) - local_checksum: typing.Optional[str] = network_data_package["games"].get(game, {}).get("checksum") - # no action required if local version is new enough - if (not remote_checksum and (remote_version > local_version or remote_version == 0)) \ - or remote_checksum != local_checksum: - cached_game = Utils.load_data_package_for_checksum(game, remote_checksum) - cache_version: int = cached_game.get("version", 0) - cache_checksum: typing.Optional[str] = cached_game.get("checksum") - # download remote version if cache is not new enough - if (not remote_checksum and (remote_version > cache_version or remote_version == 0)) \ - or remote_checksum != cache_checksum: - needed_updates.add(game) + cached_version: int = self.versions.get(game, 0) + cached_checksum: typing.Optional[str] = self.checksums.get(game) + # no action required if cached version is new enough + if (not remote_checksum and (remote_version > cached_version or remote_version == 0)) \ + or remote_checksum != cached_checksum: + local_version: int = network_data_package["games"].get(game, {}).get("version", 0) + local_checksum: typing.Optional[str] = network_data_package["games"].get(game, {}).get("checksum") + if ((remote_checksum or remote_version <= local_version and remote_version != 0) + and remote_checksum == local_checksum): + self.update_game(network_data_package["games"][game], game) else: - self.update_game(cached_game, game) + cached_game = Utils.load_data_package_for_checksum(game, remote_checksum) + cache_version: int = cached_game.get("version", 0) + cache_checksum: typing.Optional[str] = cached_game.get("checksum") + # download remote version if cache is not new enough + if (not remote_checksum and (remote_version > cache_version or remote_version == 0)) \ + or remote_checksum != cache_checksum: + needed_updates.add(game) + else: + self.update_game(cached_game, game) if needed_updates: await self.send_msgs([{"cmd": "GetDataPackage", "games": [game_name]} for game_name in needed_updates]) def update_game(self, game_package: dict, game: str): self.item_names.update_game(game, game_package["item_name_to_id"]) self.location_names.update_game(game, game_package["location_name_to_id"]) + self.versions[game] = game_package.get("version", 0) + self.checksums[game] = game_package.get("checksum") def update_data_package(self, data_package: dict): for game, game_data in data_package["games"].items(): diff --git a/Launcher.py b/Launcher.py index 42f93547cc..85e49da7e5 100644 --- a/Launcher.py +++ b/Launcher.py @@ -35,7 +35,9 @@ from Utils import is_frozen, user_path, local_path, init_logging, open_filename, def open_host_yaml(): - file = settings.get_settings().filename + s = settings.get_settings() + file = s.filename + s.save() assert file, "host.yaml missing" if is_linux: exe = which('sensible-editor') or which('gedit') or \ diff --git a/Main.py b/Main.py index 5a0f5c98bc..4008ca5e90 100644 --- a/Main.py +++ b/Main.py @@ -338,6 +338,7 @@ def main(args, seed=None, baked_server_options: Optional[Dict[str, object]] = No "seed_name": multiworld.seed_name, "spheres": spheres, "datapackage": data_package, + "race_mode": int(multiworld.is_race), } AutoWorld.call_all(multiworld, "modify_multidata", multidata) diff --git a/MultiServer.py b/MultiServer.py index e0b137fd68..bac35648cf 100644 --- a/MultiServer.py +++ b/MultiServer.py @@ -15,6 +15,7 @@ import math import operator import pickle import random +import shlex import threading import time import typing @@ -184,11 +185,9 @@ class Context: slot_info: typing.Dict[int, NetworkSlot] generator_version = Version(0, 0, 0) checksums: typing.Dict[str, str] - item_names: typing.Dict[str, typing.Dict[int, str]] = ( - collections.defaultdict(lambda: Utils.KeyedDefaultDict(lambda code: f'Unknown item (ID:{code})'))) + item_names: typing.Dict[str, typing.Dict[int, str]] item_name_groups: typing.Dict[str, typing.Dict[str, typing.Set[str]]] - location_names: typing.Dict[str, typing.Dict[int, str]] = ( - collections.defaultdict(lambda: Utils.KeyedDefaultDict(lambda code: f'Unknown location (ID:{code})'))) + location_names: typing.Dict[str, typing.Dict[int, str]] location_name_groups: typing.Dict[str, typing.Dict[str, typing.Set[str]]] all_item_and_group_names: typing.Dict[str, typing.Set[str]] all_location_and_group_names: typing.Dict[str, typing.Set[str]] @@ -197,7 +196,6 @@ class Context: """ each sphere is { player: { location_id, ... } } """ logger: logging.Logger - def __init__(self, host: str, port: int, server_password: str, password: str, location_check_points: int, hint_cost: int, item_cheat: bool, release_mode: str = "disabled", collect_mode="disabled", remaining_mode: str = "disabled", auto_shutdown: typing.SupportsFloat = 0, compatibility: int = 2, @@ -268,6 +266,10 @@ class Context: self.location_name_groups = {} self.all_item_and_group_names = {} self.all_location_and_group_names = {} + self.item_names = collections.defaultdict( + lambda: Utils.KeyedDefaultDict(lambda code: f'Unknown item (ID:{code})')) + self.location_names = collections.defaultdict( + lambda: Utils.KeyedDefaultDict(lambda code: f'Unknown location (ID:{code})')) self.non_hintable_names = collections.defaultdict(frozenset) self._load_game_data() @@ -427,6 +429,8 @@ class Context: use_embedded_server_options: bool): self.read_data = {} + # there might be a better place to put this. + self.read_data["race_mode"] = lambda: decoded_obj.get("race_mode", 0) mdata_ver = decoded_obj["minimum_versions"]["server"] if mdata_ver > version_tuple: raise RuntimeError(f"Supplied Multidata (.archipelago) requires a server of at least version {mdata_ver}," @@ -1150,7 +1154,10 @@ class CommandProcessor(metaclass=CommandMeta): if not raw: return try: - command = raw.split() + try: + command = shlex.split(raw, comments=False) + except ValueError: # most likely: "ValueError: No closing quotation" + command = raw.split() basecommand = command[0] if basecommand[0] == self.marker: method = self.commands.get(basecommand[1:].lower(), None) diff --git a/Utils.py b/Utils.py index d6709431d3..232fd4c5a0 100644 --- a/Utils.py +++ b/Utils.py @@ -423,7 +423,7 @@ class RestrictedUnpickler(pickle.Unpickler): if module == "NetUtils" and name in {"NetworkItem", "ClientStatus", "Hint", "SlotType", "NetworkSlot"}: return getattr(self.net_utils_module, name) # Options and Plando are unpickled by WebHost -> Generate - if module == "worlds.generic" and name in {"PlandoItem", "PlandoConnection"}: + if module == "worlds.generic" and name == "PlandoItem": if not self.generic_properties_module: self.generic_properties_module = importlib.import_module("worlds.generic") return getattr(self.generic_properties_module, name) @@ -434,7 +434,7 @@ class RestrictedUnpickler(pickle.Unpickler): else: mod = importlib.import_module(module) obj = getattr(mod, name) - if issubclass(obj, self.options_module.Option): + if issubclass(obj, (self.options_module.Option, self.options_module.PlandoConnection)): return obj # Forbid everything else. raise pickle.UnpicklingError(f"global '{module}.{name}' is forbidden") diff --git a/WebHostLib/generate.py b/WebHostLib/generate.py index dbe7dd9589..b19f3d4835 100644 --- a/WebHostLib/generate.py +++ b/WebHostLib/generate.py @@ -81,6 +81,7 @@ def start_generation(options: Dict[str, Union[dict, str]], meta: Dict[str, Any]) elif len(gen_options) > app.config["MAX_ROLL"]: flash(f"Sorry, generating of multiworlds is limited to {app.config['MAX_ROLL']} players. " f"If you have a larger group, please generate it yourself and upload it.") + return redirect(url_for(request.endpoint, **(request.view_args or {}))) elif len(gen_options) >= app.config["JOB_THRESHOLD"]: gen = Generation( options=pickle.dumps({name: vars(options) for name, options in gen_options.items()}), diff --git a/WebHostLib/misc.py b/WebHostLib/misc.py index 4784fcd9da..1f86e21066 100644 --- a/WebHostLib/misc.py +++ b/WebHostLib/misc.py @@ -5,6 +5,7 @@ from typing import Any, IO, Dict, Iterator, List, Tuple, Union import jinja2.exceptions from flask import request, redirect, url_for, render_template, Response, session, abort, send_from_directory from pony.orm import count, commit, db_session +from werkzeug.utils import secure_filename from worlds.AutoWorld import AutoWorldRegister from . import app, cache @@ -69,14 +70,28 @@ def tutorial_landing(): @app.route('/faq//') @cache.cached() -def faq(lang): - return render_template("faq.html", lang=lang) +def faq(lang: str): + import markdown + with open(os.path.join(app.static_folder, "assets", "faq", secure_filename(lang)+".md")) as f: + document = f.read() + return render_template( + "markdown_document.html", + title="Frequently Asked Questions", + html_from_markdown=markdown.markdown(document, extensions=["mdx_breakless_lists"]), + ) @app.route('/glossary//') @cache.cached() -def terms(lang): - return render_template("glossary.html", lang=lang) +def glossary(lang: str): + import markdown + with open(os.path.join(app.static_folder, "assets", "glossary", secure_filename(lang)+".md")) as f: + document = f.read() + return render_template( + "markdown_document.html", + title="Glossary", + html_from_markdown=markdown.markdown(document, extensions=["mdx_breakless_lists"]), + ) @app.route('/seed/') diff --git a/WebHostLib/requirements.txt b/WebHostLib/requirements.txt index c593cd63df..2020387053 100644 --- a/WebHostLib/requirements.txt +++ b/WebHostLib/requirements.txt @@ -9,3 +9,5 @@ bokeh>=3.1.1; python_version <= '3.8' bokeh>=3.4.3; python_version == '3.9' bokeh>=3.5.2; python_version >= '3.10' markupsafe>=2.1.5 +Markdown>=3.7 +mdx-breakless-lists>=1.0.1 diff --git a/WebHostLib/static/assets/faq.js b/WebHostLib/static/assets/faq.js deleted file mode 100644 index 1bf5e5a659..0000000000 --- a/WebHostLib/static/assets/faq.js +++ /dev/null @@ -1,51 +0,0 @@ -window.addEventListener('load', () => { - const tutorialWrapper = document.getElementById('faq-wrapper'); - new Promise((resolve, reject) => { - const ajax = new XMLHttpRequest(); - ajax.onreadystatechange = () => { - if (ajax.readyState !== 4) { return; } - if (ajax.status === 404) { - reject("Sorry, the tutorial is not available in that language yet."); - return; - } - if (ajax.status !== 200) { - reject("Something went wrong while loading the tutorial."); - return; - } - resolve(ajax.responseText); - }; - ajax.open('GET', `${window.location.origin}/static/assets/faq/` + - `faq_${tutorialWrapper.getAttribute('data-lang')}.md`, true); - ajax.send(); - }).then((results) => { - // Populate page with HTML generated from markdown - showdown.setOption('tables', true); - showdown.setOption('strikethrough', true); - showdown.setOption('literalMidWordUnderscores', true); - tutorialWrapper.innerHTML += (new showdown.Converter()).makeHtml(results); - adjustHeaderWidth(); - - // Reset the id of all header divs to something nicer - for (const header of document.querySelectorAll('h1, h2, h3, h4, h5, h6')) { - const headerId = header.innerText.replace(/\s+/g, '-').toLowerCase(); - header.setAttribute('id', headerId); - header.addEventListener('click', () => { - window.location.hash = `#${headerId}`; - header.scrollIntoView(); - }); - } - - // Manually scroll the user to the appropriate header if anchor navigation is used - document.fonts.ready.finally(() => { - if (window.location.hash) { - const scrollTarget = document.getElementById(window.location.hash.substring(1)); - scrollTarget?.scrollIntoView(); - } - }); - }).catch((error) => { - console.error(error); - tutorialWrapper.innerHTML = - `

This page is out of logic!

-

Click here to return to safety.

`; - }); -}); diff --git a/WebHostLib/static/assets/faq/faq_en.md b/WebHostLib/static/assets/faq/en.md similarity index 100% rename from WebHostLib/static/assets/faq/faq_en.md rename to WebHostLib/static/assets/faq/en.md diff --git a/WebHostLib/static/assets/glossary.js b/WebHostLib/static/assets/glossary.js deleted file mode 100644 index 04a2920086..0000000000 --- a/WebHostLib/static/assets/glossary.js +++ /dev/null @@ -1,51 +0,0 @@ -window.addEventListener('load', () => { - const tutorialWrapper = document.getElementById('glossary-wrapper'); - new Promise((resolve, reject) => { - const ajax = new XMLHttpRequest(); - ajax.onreadystatechange = () => { - if (ajax.readyState !== 4) { return; } - if (ajax.status === 404) { - reject("Sorry, the glossary page is not available in that language yet."); - return; - } - if (ajax.status !== 200) { - reject("Something went wrong while loading the glossary."); - return; - } - resolve(ajax.responseText); - }; - ajax.open('GET', `${window.location.origin}/static/assets/faq/` + - `glossary_${tutorialWrapper.getAttribute('data-lang')}.md`, true); - ajax.send(); - }).then((results) => { - // Populate page with HTML generated from markdown - showdown.setOption('tables', true); - showdown.setOption('strikethrough', true); - showdown.setOption('literalMidWordUnderscores', true); - tutorialWrapper.innerHTML += (new showdown.Converter()).makeHtml(results); - adjustHeaderWidth(); - - // Reset the id of all header divs to something nicer - for (const header of document.querySelectorAll('h1, h2, h3, h4, h5, h6')) { - const headerId = header.innerText.replace(/\s+/g, '-').toLowerCase(); - header.setAttribute('id', headerId); - header.addEventListener('click', () => { - window.location.hash = `#${headerId}`; - header.scrollIntoView(); - }); - } - - // Manually scroll the user to the appropriate header if anchor navigation is used - document.fonts.ready.finally(() => { - if (window.location.hash) { - const scrollTarget = document.getElementById(window.location.hash.substring(1)); - scrollTarget?.scrollIntoView(); - } - }); - }).catch((error) => { - console.error(error); - tutorialWrapper.innerHTML = - `

This page is out of logic!

-

Click here to return to safety.

`; - }); -}); diff --git a/WebHostLib/static/assets/faq/glossary_en.md b/WebHostLib/static/assets/glossary/en.md similarity index 100% rename from WebHostLib/static/assets/faq/glossary_en.md rename to WebHostLib/static/assets/glossary/en.md diff --git a/WebHostLib/static/assets/playerOptions.js b/WebHostLib/static/assets/playerOptions.js index d0f2e388c2..fbf96a3a71 100644 --- a/WebHostLib/static/assets/playerOptions.js +++ b/WebHostLib/static/assets/playerOptions.js @@ -288,6 +288,11 @@ const applyPresets = (presetName) => { } }); namedRangeSelect.value = trueValue; + // It is also possible for a preset to use an unnamed value. If this happens, set the dropdown to "Custom" + if (namedRangeSelect.selectedIndex == -1) + { + namedRangeSelect.value = "custom"; + } } // Handle options whose presets are "random" diff --git a/WebHostLib/static/static/backgrounds/cliffs/grass/cliff-bottom-left-corner.png b/WebHostLib/static/static/backgrounds/cliffs/grass/cliff-bottom-left-corner.png index 326670b7eb..2435222d24 100644 Binary files a/WebHostLib/static/static/backgrounds/cliffs/grass/cliff-bottom-left-corner.png and b/WebHostLib/static/static/backgrounds/cliffs/grass/cliff-bottom-left-corner.png differ diff --git a/WebHostLib/static/static/backgrounds/cliffs/grass/cliff-bottom-right-corner.png b/WebHostLib/static/static/backgrounds/cliffs/grass/cliff-bottom-right-corner.png index c8297d3457..3dcc6d1534 100644 Binary files a/WebHostLib/static/static/backgrounds/cliffs/grass/cliff-bottom-right-corner.png and b/WebHostLib/static/static/backgrounds/cliffs/grass/cliff-bottom-right-corner.png differ diff --git a/WebHostLib/static/static/backgrounds/cliffs/grass/cliff-bottom.png b/WebHostLib/static/static/backgrounds/cliffs/grass/cliff-bottom.png index 2a28958e09..7e58e4b0ce 100644 Binary files a/WebHostLib/static/static/backgrounds/cliffs/grass/cliff-bottom.png and b/WebHostLib/static/static/backgrounds/cliffs/grass/cliff-bottom.png differ diff --git a/WebHostLib/static/static/backgrounds/cliffs/grass/cliff-left.png b/WebHostLib/static/static/backgrounds/cliffs/grass/cliff-left.png index 9bc84ff603..2dabbf2986 100644 Binary files a/WebHostLib/static/static/backgrounds/cliffs/grass/cliff-left.png and b/WebHostLib/static/static/backgrounds/cliffs/grass/cliff-left.png differ diff --git a/WebHostLib/static/static/backgrounds/cliffs/grass/cliff-right.png b/WebHostLib/static/static/backgrounds/cliffs/grass/cliff-right.png index a1e9c7c8b6..afbf0dafb5 100644 Binary files a/WebHostLib/static/static/backgrounds/cliffs/grass/cliff-right.png and b/WebHostLib/static/static/backgrounds/cliffs/grass/cliff-right.png differ diff --git a/WebHostLib/static/static/backgrounds/cliffs/grass/cliff-top-left-corner.png b/WebHostLib/static/static/backgrounds/cliffs/grass/cliff-top-left-corner.png index a40bca60f0..2b5865573a 100644 Binary files a/WebHostLib/static/static/backgrounds/cliffs/grass/cliff-top-left-corner.png and b/WebHostLib/static/static/backgrounds/cliffs/grass/cliff-top-left-corner.png differ diff --git a/WebHostLib/static/static/backgrounds/cliffs/grass/cliff-top-right-corner.png b/WebHostLib/static/static/backgrounds/cliffs/grass/cliff-top-right-corner.png index b8a8c6a726..aeccd805f0 100644 Binary files a/WebHostLib/static/static/backgrounds/cliffs/grass/cliff-top-right-corner.png and b/WebHostLib/static/static/backgrounds/cliffs/grass/cliff-top-right-corner.png differ diff --git a/WebHostLib/static/static/backgrounds/cliffs/grass/cliff-top.png b/WebHostLib/static/static/backgrounds/cliffs/grass/cliff-top.png index bb6ccec3d5..1eb072ac08 100644 Binary files a/WebHostLib/static/static/backgrounds/cliffs/grass/cliff-top.png and b/WebHostLib/static/static/backgrounds/cliffs/grass/cliff-top.png differ diff --git a/WebHostLib/static/static/backgrounds/clouds/cloud-0001.png b/WebHostLib/static/static/backgrounds/clouds/cloud-0001.png index dba338f585..1015819bc8 100644 Binary files a/WebHostLib/static/static/backgrounds/clouds/cloud-0001.png and b/WebHostLib/static/static/backgrounds/clouds/cloud-0001.png differ diff --git a/WebHostLib/static/static/backgrounds/clouds/cloud-0002.png b/WebHostLib/static/static/backgrounds/clouds/cloud-0002.png index 33f09b19ce..7b479bfe7b 100644 Binary files a/WebHostLib/static/static/backgrounds/clouds/cloud-0002.png and b/WebHostLib/static/static/backgrounds/clouds/cloud-0002.png differ diff --git a/WebHostLib/static/static/backgrounds/clouds/cloud-0003.png b/WebHostLib/static/static/backgrounds/clouds/cloud-0003.png index f665015b0d..59844e31ac 100644 Binary files a/WebHostLib/static/static/backgrounds/clouds/cloud-0003.png and b/WebHostLib/static/static/backgrounds/clouds/cloud-0003.png differ diff --git a/WebHostLib/static/static/backgrounds/dirt.png b/WebHostLib/static/static/backgrounds/dirt.png index 4ac930edc6..db6bc34635 100644 Binary files a/WebHostLib/static/static/backgrounds/dirt.png and b/WebHostLib/static/static/backgrounds/dirt.png differ diff --git a/WebHostLib/static/static/backgrounds/footer/footer-0001.png b/WebHostLib/static/static/backgrounds/footer/footer-0001.png index b863a3d429..d15afe5f9e 100644 Binary files a/WebHostLib/static/static/backgrounds/footer/footer-0001.png and b/WebHostLib/static/static/backgrounds/footer/footer-0001.png differ diff --git a/WebHostLib/static/static/backgrounds/footer/footer-0002.png b/WebHostLib/static/static/backgrounds/footer/footer-0002.png index 90fdfe95d0..88d0659f69 100644 Binary files a/WebHostLib/static/static/backgrounds/footer/footer-0002.png and b/WebHostLib/static/static/backgrounds/footer/footer-0002.png differ diff --git a/WebHostLib/static/static/backgrounds/footer/footer-0003.png b/WebHostLib/static/static/backgrounds/footer/footer-0003.png index 5fc31d1ee9..9c4d9a4632 100644 Binary files a/WebHostLib/static/static/backgrounds/footer/footer-0003.png and b/WebHostLib/static/static/backgrounds/footer/footer-0003.png differ diff --git a/WebHostLib/static/static/backgrounds/footer/footer-0004.png b/WebHostLib/static/static/backgrounds/footer/footer-0004.png index 4a95ce9a3a..46519036eb 100644 Binary files a/WebHostLib/static/static/backgrounds/footer/footer-0004.png and b/WebHostLib/static/static/backgrounds/footer/footer-0004.png differ diff --git a/WebHostLib/static/static/backgrounds/footer/footer-0005.png b/WebHostLib/static/static/backgrounds/footer/footer-0005.png index 7b7cd502f3..58093f7efc 100644 Binary files a/WebHostLib/static/static/backgrounds/footer/footer-0005.png and b/WebHostLib/static/static/backgrounds/footer/footer-0005.png differ diff --git a/WebHostLib/static/static/backgrounds/grass-flowers.png b/WebHostLib/static/static/backgrounds/grass-flowers.png index 464fdbe581..ea39c54190 100644 Binary files a/WebHostLib/static/static/backgrounds/grass-flowers.png and b/WebHostLib/static/static/backgrounds/grass-flowers.png differ diff --git a/WebHostLib/static/static/backgrounds/grass.png b/WebHostLib/static/static/backgrounds/grass.png index b88c33dec4..6a99c4d943 100644 Binary files a/WebHostLib/static/static/backgrounds/grass.png and b/WebHostLib/static/static/backgrounds/grass.png differ diff --git a/WebHostLib/static/static/backgrounds/header/dirt-header.png b/WebHostLib/static/static/backgrounds/header/dirt-header.png index 7c9e298e22..4d478ec1aa 100644 Binary files a/WebHostLib/static/static/backgrounds/header/dirt-header.png and b/WebHostLib/static/static/backgrounds/header/dirt-header.png differ diff --git a/WebHostLib/static/static/backgrounds/header/grass-header.png b/WebHostLib/static/static/backgrounds/header/grass-header.png index c2acc58807..602d52d321 100644 Binary files a/WebHostLib/static/static/backgrounds/header/grass-header.png and b/WebHostLib/static/static/backgrounds/header/grass-header.png differ diff --git a/WebHostLib/static/static/backgrounds/header/ocean-header.png b/WebHostLib/static/static/backgrounds/header/ocean-header.png index a0ff51f924..10d8345af1 100644 Binary files a/WebHostLib/static/static/backgrounds/header/ocean-header.png and b/WebHostLib/static/static/backgrounds/header/ocean-header.png differ diff --git a/WebHostLib/static/static/backgrounds/header/party-time-header.png b/WebHostLib/static/static/backgrounds/header/party-time-header.png index 799f32f228..b033486b2a 100644 Binary files a/WebHostLib/static/static/backgrounds/header/party-time-header.png and b/WebHostLib/static/static/backgrounds/header/party-time-header.png differ diff --git a/WebHostLib/static/static/backgrounds/header/stone-header.png b/WebHostLib/static/static/backgrounds/header/stone-header.png index e0c9787e57..6e93a54b78 100644 Binary files a/WebHostLib/static/static/backgrounds/header/stone-header.png and b/WebHostLib/static/static/backgrounds/header/stone-header.png differ diff --git a/WebHostLib/static/static/backgrounds/ice.png b/WebHostLib/static/static/backgrounds/ice.png index fcf7299b35..c64f1b20f3 100644 Binary files a/WebHostLib/static/static/backgrounds/ice.png and b/WebHostLib/static/static/backgrounds/ice.png differ diff --git a/WebHostLib/static/static/backgrounds/jungle.png b/WebHostLib/static/static/backgrounds/jungle.png index e27d7e9920..c4ec5b9648 100644 Binary files a/WebHostLib/static/static/backgrounds/jungle.png and b/WebHostLib/static/static/backgrounds/jungle.png differ diff --git a/WebHostLib/static/static/backgrounds/ocean.png b/WebHostLib/static/static/backgrounds/ocean.png index 5c22c0b92a..e4dbdecb73 100644 Binary files a/WebHostLib/static/static/backgrounds/ocean.png and b/WebHostLib/static/static/backgrounds/ocean.png differ diff --git a/WebHostLib/static/static/backgrounds/party-time.png b/WebHostLib/static/static/backgrounds/party-time.png index ad00851ba4..3fcea8a46e 100644 Binary files a/WebHostLib/static/static/backgrounds/party-time.png and b/WebHostLib/static/static/backgrounds/party-time.png differ diff --git a/WebHostLib/static/static/backgrounds/stone.png b/WebHostLib/static/static/backgrounds/stone.png index 9e15a34375..2956beaaa8 100644 Binary files a/WebHostLib/static/static/backgrounds/stone.png and b/WebHostLib/static/static/backgrounds/stone.png differ diff --git a/WebHostLib/static/static/branding/header-logo-full.svg b/WebHostLib/static/static/branding/header-logo-full.svg new file mode 100644 index 0000000000..3e22500905 --- /dev/null +++ b/WebHostLib/static/static/branding/header-logo-full.svg @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WebHostLib/static/static/branding/header-logo.png b/WebHostLib/static/static/branding/header-logo.png index e5d7f9b4a0..5a3dbe7daf 100644 Binary files a/WebHostLib/static/static/branding/header-logo.png and b/WebHostLib/static/static/branding/header-logo.png differ diff --git a/WebHostLib/static/static/branding/header-logo.svg b/WebHostLib/static/static/branding/header-logo.svg index 3e22500905..ceedba4338 100644 --- a/WebHostLib/static/static/branding/header-logo.svg +++ b/WebHostLib/static/static/branding/header-logo.svg @@ -1,66 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/WebHostLib/static/static/branding/landing-logo.png b/WebHostLib/static/static/branding/landing-logo.png index 1f2b967a98..d4845a475d 100644 Binary files a/WebHostLib/static/static/branding/landing-logo.png and b/WebHostLib/static/static/branding/landing-logo.png differ diff --git a/WebHostLib/static/static/button-images/hamburger-menu-icon.png b/WebHostLib/static/static/button-images/hamburger-menu-icon.png index f1c9631635..c834501453 100644 Binary files a/WebHostLib/static/static/button-images/hamburger-menu-icon.png and b/WebHostLib/static/static/button-images/hamburger-menu-icon.png differ diff --git a/WebHostLib/static/static/button-images/island-button-a.png b/WebHostLib/static/static/button-images/island-button-a.png index f3872dfd6c..1ce420287f 100644 Binary files a/WebHostLib/static/static/button-images/island-button-a.png and b/WebHostLib/static/static/button-images/island-button-a.png differ diff --git a/WebHostLib/static/static/button-images/island-button-b.png b/WebHostLib/static/static/button-images/island-button-b.png index 65008eaf59..0df9bc1a49 100644 Binary files a/WebHostLib/static/static/button-images/island-button-b.png and b/WebHostLib/static/static/button-images/island-button-b.png differ diff --git a/WebHostLib/static/static/button-images/island-button-c.png b/WebHostLib/static/static/button-images/island-button-c.png index 9e5f9f50d2..86182c3627 100644 Binary files a/WebHostLib/static/static/button-images/island-button-c.png and b/WebHostLib/static/static/button-images/island-button-c.png differ diff --git a/WebHostLib/static/static/button-images/popover.png b/WebHostLib/static/static/button-images/popover.png index cbc8634104..e3247194b0 100644 Binary files a/WebHostLib/static/static/button-images/popover.png and b/WebHostLib/static/static/button-images/popover.png differ diff --git a/WebHostLib/static/static/decorations/island-a.png b/WebHostLib/static/static/decorations/island-a.png index d931aed0bd..9972a915f5 100644 Binary files a/WebHostLib/static/static/decorations/island-a.png and b/WebHostLib/static/static/decorations/island-a.png differ diff --git a/WebHostLib/static/static/decorations/island-b.png b/WebHostLib/static/static/decorations/island-b.png index d690228192..04eff72f05 100644 Binary files a/WebHostLib/static/static/decorations/island-b.png and b/WebHostLib/static/static/decorations/island-b.png differ diff --git a/WebHostLib/static/static/decorations/island-c.png b/WebHostLib/static/static/decorations/island-c.png index 790c7b01d5..e491d7b2c6 100644 Binary files a/WebHostLib/static/static/decorations/island-c.png and b/WebHostLib/static/static/decorations/island-c.png differ diff --git a/WebHostLib/static/static/decorations/rock-in-water.png b/WebHostLib/static/static/decorations/rock-in-water.png index 25c62acd24..1320bef7ce 100644 Binary files a/WebHostLib/static/static/decorations/rock-in-water.png and b/WebHostLib/static/static/decorations/rock-in-water.png differ diff --git a/WebHostLib/static/static/decorations/rock-single.png b/WebHostLib/static/static/decorations/rock-single.png index cc237d132e..c003abe0d1 100644 Binary files a/WebHostLib/static/static/decorations/rock-single.png and b/WebHostLib/static/static/decorations/rock-single.png differ diff --git a/WebHostLib/templates/faq.html b/WebHostLib/templates/faq.html deleted file mode 100644 index 76bdb96d2e..0000000000 --- a/WebHostLib/templates/faq.html +++ /dev/null @@ -1,17 +0,0 @@ -{% extends 'pageWrapper.html' %} - -{% block head %} - {% include 'header/grassHeader.html' %} - Frequently Asked Questions - - - -{% endblock %} - -{% block body %} -
- -
-{% endblock %} diff --git a/WebHostLib/templates/glossary.html b/WebHostLib/templates/glossary.html deleted file mode 100644 index 921f678157..0000000000 --- a/WebHostLib/templates/glossary.html +++ /dev/null @@ -1,17 +0,0 @@ -{% extends 'pageWrapper.html' %} - -{% block head %} - {% include 'header/grassHeader.html' %} - Glossary - - - -{% endblock %} - -{% block body %} -
- -
-{% endblock %} diff --git a/WebHostLib/templates/markdown_document.html b/WebHostLib/templates/markdown_document.html new file mode 100644 index 0000000000..07b3c8354d --- /dev/null +++ b/WebHostLib/templates/markdown_document.html @@ -0,0 +1,13 @@ +{% extends 'pageWrapper.html' %} + +{% block head %} + {% include 'header/grassHeader.html' %} + {{ title }} + +{% endblock %} + +{% block body %} +
+ {{ html_from_markdown | safe}} +
+{% endblock %} diff --git a/docs/network protocol.md b/docs/network protocol.md index f8080fecc8..4a96a43f81 100644 --- a/docs/network protocol.md +++ b/docs/network protocol.md @@ -268,6 +268,7 @@ Additional arguments added to the [Set](#Set) package that triggered this [SetRe These packets are sent purely from client to server. They are not accepted by clients. * [Connect](#Connect) +* [ConnectUpdate](#ConnectUpdate) * [Sync](#Sync) * [LocationChecks](#LocationChecks) * [LocationScouts](#LocationScouts) @@ -395,6 +396,7 @@ Some special keys exist with specific return data, all of them have the prefix ` | item_name_groups_{game_name} | dict\[str, list\[str\]\] | item_name_groups belonging to the requested game. | | location_name_groups_{game_name} | dict\[str, list\[str\]\] | location_name_groups belonging to the requested game. | | client_status_{team}_{slot} | [ClientStatus](#ClientStatus) | The current game status of the requested player. | +| race_mode | int | 0 if race mode is disabled, and 1 if it's enabled. | ### Set Used to write data to the server's data storage, that data can then be shared across worlds or just saved for later. Values for keys in the data storage can be retrieved with a [Get](#Get) package, or monitored with a [SetNotify](#SetNotify) package. diff --git a/kvui.py b/kvui.py index 536dce1220..74d8ad0673 100644 --- a/kvui.py +++ b/kvui.py @@ -243,6 +243,9 @@ class ServerLabel(HovererableLabel): f"\nYou currently have {ctx.hint_points} points." elif ctx.hint_cost == 0: text += "\n!hint is free to use." + if ctx.stored_data and "_read_race_mode" in ctx.stored_data: + text += "\nRace mode is enabled." \ + if ctx.stored_data["_read_race_mode"] else "\nRace mode is disabled." else: text += f"\nYou are not authenticated yet." diff --git a/test/general/test_options.py b/test/general/test_options.py index 2229b7ea7e..ee2f22a6dc 100644 --- a/test/general/test_options.py +++ b/test/general/test_options.py @@ -59,3 +59,12 @@ class TestOptions(unittest.TestCase): item_links = {1: ItemLinks.from_any(item_link_group), 2: ItemLinks.from_any(item_link_group)} for link in item_links.values(): self.assertEqual(link.value[0], item_link_group[0]) + + def test_pickle_dumps(self): + """Test options can be pickled into database for WebHost generation""" + import pickle + for gamename, world_type in AutoWorldRegister.world_types.items(): + if not world_type.hidden: + for option_key, option in world_type.options_dataclass.type_hints.items(): + with self.subTest(game=gamename, option=option_key): + pickle.dumps(option(option.default)) diff --git a/test/multiworld/test_multiworlds.py b/test/multiworld/test_multiworlds.py index 8415ac4c84..3c1d0e4544 100644 --- a/test/multiworld/test_multiworlds.py +++ b/test/multiworld/test_multiworlds.py @@ -71,7 +71,7 @@ class TestTwoPlayerMulti(MultiworldTestBase): for world in self.multiworld.worlds.values(): world.options.accessibility.value = Accessibility.option_full self.assertSteps(gen_steps) - with self.subTest("filling multiworld", seed=self.multiworld.seed): - distribute_items_restrictive(self.multiworld) - call_all(self.multiworld, "post_fill") - self.assertTrue(self.fulfills_accessibility(), "Collected all locations, but can't beat the game") + with self.subTest("filling multiworld", games=world_type.game, seed=self.multiworld.seed): + distribute_items_restrictive(self.multiworld) + call_all(self.multiworld, "post_fill") + self.assertTrue(self.fulfills_accessibility(), "Collected all locations, but can't beat the game") diff --git a/test/webhost/test_generate.py b/test/webhost/test_generate.py new file mode 100644 index 0000000000..5440f6e02b --- /dev/null +++ b/test/webhost/test_generate.py @@ -0,0 +1,73 @@ +import zipfile +from io import BytesIO + +from flask import url_for + +from . import TestBase + + +class TestGenerate(TestBase): + def test_valid_yaml(self) -> None: + """ + Verify that posting a valid yaml will start generating a game. + """ + with self.app.app_context(), self.app.test_request_context(): + yaml_data = """ + name: Player1 + game: Archipelago + Archipelago: {} + """ + response = self.client.post(url_for("generate"), + data={"file": (BytesIO(yaml_data.encode("utf-8")), "test.yaml")}, + follow_redirects=True) + self.assertEqual(response.status_code, 200) + self.assertTrue("/seed/" in response.request.path or + "/wait/" in response.request.path, + f"Response did not properly redirect ({response.request.path})") + + def test_empty_zip(self) -> None: + """ + Verify that posting an empty zip will give an error. + """ + with self.app.app_context(), self.app.test_request_context(): + zip_data = BytesIO() + zipfile.ZipFile(zip_data, "w").close() + zip_data.seek(0) + self.assertGreater(len(zip_data.read()), 0) + zip_data.seek(0) + response = self.client.post(url_for("generate"), + data={"file": (zip_data, "test.zip")}, + follow_redirects=True) + self.assertIn("user-message", response.text, + "Request did not call flash()") + self.assertIn("not find any valid files", response.text, + "Response shows unexpected error") + self.assertIn("generate-game-form", response.text, + "Response did not get user back to the form") + + def test_too_many_players(self) -> None: + """ + Verify that posting too many players will give an error. + """ + max_roll = self.app.config["MAX_ROLL"] + # validate that max roll has a sensible value, otherwise we probably changed how it works + self.assertIsInstance(max_roll, int) + self.assertGreater(max_roll, 1) + self.assertLess(max_roll, 100) + # create a yaml with max_roll+1 players and watch it fail + with self.app.app_context(), self.app.test_request_context(): + yaml_data = "---\n".join([ + f"name: Player{n}\n" + "game: Archipelago\n" + "Archipelago: {}\n" + for n in range(1, max_roll + 2) + ]) + response = self.client.post(url_for("generate"), + data={"file": (BytesIO(yaml_data.encode("utf-8")), "test.yaml")}, + follow_redirects=True) + self.assertIn("user-message", response.text, + "Request did not call flash()") + self.assertIn("limited to", response.text, + "Response shows unexpected error") + self.assertIn("generate-game-form", response.text, + "Response did not get user back to the form") diff --git a/worlds/aquaria/Regions.py b/worlds/aquaria/Regions.py index 3ec1fb880e..792d7b73df 100755 --- a/worlds/aquaria/Regions.py +++ b/worlds/aquaria/Regions.py @@ -738,9 +738,7 @@ class AquariaRegions: self.__connect_regions("Sun Temple left area", "Veil left of sun temple", self.sun_temple_l, self.veil_tr_l) self.__connect_regions("Sun Temple left area", "Sun Temple before boss area", - self.sun_temple_l, self.sun_temple_boss_path, - lambda state: _has_light(state, self.player) or - _has_sun_crystal(state, self.player)) + self.sun_temple_l, self.sun_temple_boss_path) self.__connect_regions("Sun Temple before boss area", "Sun Temple boss area", self.sun_temple_boss_path, self.sun_temple_boss, lambda state: _has_energy_attack_item(state, self.player)) @@ -775,14 +773,11 @@ class AquariaRegions: self.abyss_l, self.king_jellyfish_cave, lambda state: (_has_energy_form(state, self.player) and _has_beast_form(state, self.player)) or - _has_dual_form(state, self.player)) + _has_dual_form(state, self.player)) self.__connect_regions("Abyss left area", "Abyss right area", self.abyss_l, self.abyss_r) - self.__connect_one_way_regions("Abyss right area", "Abyss right area, transturtle", + self.__connect_regions("Abyss right area", "Abyss right area, transturtle", self.abyss_r, self.abyss_r_transturtle) - self.__connect_one_way_regions("Abyss right area, transturtle", "Abyss right area", - self.abyss_r_transturtle, self.abyss_r, - lambda state: _has_light(state, self.player)) self.__connect_regions("Abyss right area", "Inside the whale", self.abyss_r, self.whale, lambda state: _has_spirit_form(state, self.player) and @@ -1092,12 +1087,10 @@ class AquariaRegions: lambda state: _has_light(state, self.player)) add_rule(self.multiworld.get_entrance("Open Water bottom left area to Abyss left area", self.player), lambda state: _has_light(state, self.player)) - add_rule(self.multiworld.get_entrance("Sun Temple left area to Sun Temple right area", self.player), - lambda state: _has_light(state, self.player) or _has_sun_crystal(state, self.player)) - add_rule(self.multiworld.get_entrance("Sun Temple right area to Sun Temple left area", self.player), - lambda state: _has_light(state, self.player) or _has_sun_crystal(state, self.player)) add_rule(self.multiworld.get_entrance("Veil left of sun temple to Sun Temple left area", self.player), lambda state: _has_light(state, self.player) or _has_sun_crystal(state, self.player)) + add_rule(self.multiworld.get_entrance("Abyss right area, transturtle to Abyss right area", self.player), + lambda state: _has_light(state, self.player)) def __adjusting_manual_rules(self) -> None: add_rule(self.multiworld.get_location("Mithalas Cathedral, Mithalan Dress", self.player), @@ -1151,6 +1144,10 @@ class AquariaRegions: lambda state: state.has("Sun God beated", self.player)) add_rule(self.multiworld.get_location("The Body center area, breaking Li's cage", self.player), lambda state: _has_tongue_cleared(state, self.player)) + add_rule(self.multiworld.get_location( + "Open Water top right area, bulb in the small path before Mithalas", + self.player), lambda state: _has_bind_song(state, self.player) + ) def __no_progression_hard_or_hidden_location(self) -> None: self.multiworld.get_location("Energy Temple boss area, Fallen God Tooth", diff --git a/worlds/aquaria/__init__.py b/worlds/aquaria/__init__.py index 1fb04036d8..f79978f25f 100644 --- a/worlds/aquaria/__init__.py +++ b/worlds/aquaria/__init__.py @@ -130,12 +130,13 @@ class AquariaWorld(World): return result - def __pre_fill_item(self, item_name: str, location_name: str, precollected) -> None: + def __pre_fill_item(self, item_name: str, location_name: str, precollected, + itemClassification: ItemClassification = ItemClassification.useful) -> None: """Pre-assign an item to a location""" if item_name not in precollected: self.exclude.append(item_name) data = item_table[item_name] - item = AquariaItem(item_name, ItemClassification.useful, data.id, self.player) + item = AquariaItem(item_name, itemClassification, data.id, self.player) self.multiworld.get_location(location_name, self.player).place_locked_item(item) def get_filler_item_name(self): @@ -164,7 +165,8 @@ class AquariaWorld(World): self.__pre_fill_item("Transturtle Abyss right", "Abyss right area, Transturtle", precollected) self.__pre_fill_item("Transturtle Final Boss", "Final Boss area, Transturtle", precollected) # The last two are inverted because in the original game, they are special turtle that communicate directly - self.__pre_fill_item("Transturtle Simon Says", "Arnassi Ruins, Transturtle", precollected) + self.__pre_fill_item("Transturtle Simon Says", "Arnassi Ruins, Transturtle", precollected, + ItemClassification.progression) self.__pre_fill_item("Transturtle Arnassi Ruins", "Simon Says area, Transturtle", precollected) for name, data in item_table.items(): if name not in self.exclude: @@ -212,4 +214,8 @@ class AquariaWorld(World): "skip_first_vision": bool(self.options.skip_first_vision.value), "unconfine_home_water_energy_door": self.options.unconfine_home_water.value in [1, 3], "unconfine_home_water_transturtle": self.options.unconfine_home_water.value in [2, 3], + "bind_song_needed_to_get_under_rock_bulb": bool(self.options.bind_song_needed_to_get_under_rock_bulb), + "no_progression_hard_or_hidden_locations": bool(self.options.no_progression_hard_or_hidden_locations), + "light_needed_to_get_to_dark_places": bool(self.options.light_needed_to_get_to_dark_places), + "turtle_randomizer": self.options.turtle_randomizer.value, } diff --git a/worlds/aquaria/docs/setup_en.md b/worlds/aquaria/docs/setup_en.md index 34196757a3..8177725ded 100644 --- a/worlds/aquaria/docs/setup_en.md +++ b/worlds/aquaria/docs/setup_en.md @@ -8,6 +8,8 @@ ## Optional Software - For sending [commands](/tutorial/Archipelago/commands/en) like `!hint`: the TextClient from [the most recent Archipelago release](https://github.com/ArchipelagoMW/Archipelago/releases) +- [Aquaria AP Tracker](https://github.com/palex00/aquaria-ap-tracker/releases/latest), for use with +[PopTracker](https://github.com/black-sliver/PopTracker/releases/latest) ## Installation and execution Procedures @@ -113,3 +115,16 @@ sure that your executable has executable permission: ```bash chmod +x aquaria_randomizer ``` + +## Auto-Tracking + +Aquaria has a fully functional map tracker that supports auto-tracking. + +1. Download [Aquaria AP Tracker](https://github.com/palex00/aquaria-ap-tracker/releases/latest) and +[PopTracker](https://github.com/black-sliver/PopTracker/releases/latest). +2. Put the tracker pack into /packs/ in your PopTracker install. +3. Open PopTracker, and load the Aquaria pack. +4. For autotracking, click on the "AP" symbol at the top. +5. Enter the Archipelago server address (the one you connected your client to), slot name, and password. + +This pack will automatically prompt you to update if one is available. diff --git a/worlds/aquaria/docs/setup_fr.md b/worlds/aquaria/docs/setup_fr.md index 2c34f1e6a5..66b6d61197 100644 --- a/worlds/aquaria/docs/setup_fr.md +++ b/worlds/aquaria/docs/setup_fr.md @@ -2,9 +2,14 @@ ## Logiciels nécessaires -- Le jeu Aquaria original (trouvable sur la majorité des sites de ventes de jeux vidéo en ligne) -- Le client Randomizer d'Aquaria [Aquaria randomizer](https://github.com/tioui/Aquaria_Randomizer/releases) +- Une copie du jeu Aquaria non-modifiée (disponible sur la majorité des sites de ventes de jeux vidéos en ligne) +- Le client du Randomizer d'Aquaria [Aquaria randomizer] +(https://github.com/tioui/Aquaria_Randomizer/releases) + +## Logiciels optionnels + - De manière optionnel, pour pouvoir envoyer des [commandes](/tutorial/Archipelago/commands/en) comme `!hint`: utilisez le client texte de [la version la plus récente d'Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases) +- [Aquaria AP Tracker](https://github.com/palex00/aquaria-ap-tracker/releases/latest), pour utiliser avec [PopTracker](https://github.com/black-sliver/PopTracker/releases/latest) ## Procédures d'installation et d'exécution @@ -116,3 +121,15 @@ pour vous assurer que votre fichier est exécutable: ```bash chmod +x aquaria_randomizer ``` + +## Tracking automatique + +Aquaria a un tracker complet qui supporte le tracking automatique. + +1. Téléchargez [Aquaria AP Tracker](https://github.com/palex00/aquaria-ap-tracker/releases/latest) et [PopTracker](https://github.com/black-sliver/PopTracker/releases/latest). +2. Mettre le fichier compressé du tracker dans le sous-répertoire /packs/ du répertoire d'installation de PopTracker. +3. Lancez PopTracker, et ouvrez le pack d'Aquaria. +4. Pour activer le tracking automatique, cliquez sur le symbole "AP" dans le haut de la fenêtre. +5. Entrez l'adresse du serveur Archipelago (le serveur auquel vous avez connecté le client), le nom de votre slot, et le mot de passe (si un mot de passe est nécessaire). + +Le logiciel vous indiquera si une mise à jour du pack est disponible. diff --git a/worlds/dark_souls_3/__init__.py b/worlds/dark_souls_3/__init__.py index b51668539b..1aec6945eb 100644 --- a/worlds/dark_souls_3/__init__.py +++ b/worlds/dark_souls_3/__init__.py @@ -89,6 +89,7 @@ class DarkSouls3World(World): self.all_excluded_locations = set() def generate_early(self) -> None: + self.created_regions = set() self.all_excluded_locations.update(self.options.exclude_locations.value) # Inform Universal Tracker where Yhorm is being randomized to. @@ -294,6 +295,7 @@ class DarkSouls3World(World): new_region.locations.append(new_location) self.multiworld.regions.append(new_region) + self.created_regions.add(region_name) return new_region def create_items(self) -> None: @@ -1305,7 +1307,7 @@ class DarkSouls3World(World): def _add_entrance_rule(self, region: str, rule: Union[CollectionRule, str]) -> None: """Sets a rule for the entrance to the given region.""" assert region in location_tables - if not any(region == reg for reg in self.multiworld.regions.region_cache[self.player]): return + if region not in self.created_regions: return if isinstance(rule, str): if " -> " not in rule: assert item_dictionary[rule].classification == ItemClassification.progression diff --git a/worlds/hk/Options.py b/worlds/hk/Options.py index c1206d41ee..fc8eae1c0a 100644 --- a/worlds/hk/Options.py +++ b/worlds/hk/Options.py @@ -77,7 +77,7 @@ option_docstrings = { "RandomizeLoreTablets": "Randomize Lore items into the itempool, one per Lore Tablet, and place randomized item " "grants on the tablets themselves.\n You must still read the tablet to get the item.", "PreciseMovement": "Places skips into logic which require extremely precise player movement, possibly without " - "movement skills such as\n dash or hook.", + "movement skills such as\n dash or claw.", "ProficientCombat": "Places skips into logic which require proficient combat, possibly with limited items.", "BackgroundObjectPogos": "Places skips into logic for locations which are reachable via pogoing off of " "background objects.", diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index f01c82dd16..1b5acbe97a 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -325,7 +325,7 @@ class KDL3World(World): def generate_output(self, output_directory: str) -> None: try: - patch = KDL3ProcedurePatch() + patch = KDL3ProcedurePatch(player=self.player, player_name=self.player_name) patch_rom(self, patch) self.rom_name = patch.name diff --git a/worlds/kh2/__init__.py b/worlds/kh2/__init__.py index faf0bed885..2809460aed 100644 --- a/worlds/kh2/__init__.py +++ b/worlds/kh2/__init__.py @@ -101,7 +101,18 @@ class KH2World(World): if ability in self.goofy_ability_dict and self.goofy_ability_dict[ability] >= 1: self.goofy_ability_dict[ability] -= 1 - slot_data = self.options.as_dict("Goal", "FinalXemnas", "LuckyEmblemsRequired", "BountyRequired") + slot_data = self.options.as_dict( + "Goal", + "FinalXemnas", + "LuckyEmblemsRequired", + "BountyRequired", + "FightLogic", + "FinalFormLogic", + "AutoFormLogic", + "LevelDepth", + "DonaldGoofyStatsanity", + "CorSkipToggle" + ) slot_data.update({ "hitlist": [], # remove this after next update "PoptrackerVersionCheck": 4.3, diff --git a/worlds/ladx/LADXR/patches/owl.py b/worlds/ladx/LADXR/patches/owl.py index 47e575191a..20b8221604 100644 --- a/worlds/ladx/LADXR/patches/owl.py +++ b/worlds/ladx/LADXR/patches/owl.py @@ -81,23 +81,23 @@ talking: ; Give powder ld a, [$DB4C] - cp $10 + cp $20 jr nc, doNotGivePowder - ld a, $10 + ld a, $20 ld [$DB4C], a doNotGivePowder: ld a, [$DB4D] - cp $10 + cp $30 jr nc, doNotGiveBombs - ld a, $10 + ld a, $30 ld [$DB4D], a doNotGiveBombs: ld a, [$DB45] - cp $10 + cp $30 jr nc, doNotGiveArrows - ld a, $10 + ld a, $30 ld [$DB45], a doNotGiveArrows: diff --git a/worlds/messenger/rules.py b/worlds/messenger/rules.py index 85b73dec41..c354ad70ab 100644 --- a/worlds/messenger/rules.py +++ b/worlds/messenger/rules.py @@ -220,6 +220,8 @@ class MessengerRules: } self.location_rules = { + # hq + "Money Wrench": self.can_shop, # ninja village "Ninja Village Seal - Tree House": self.has_dart, diff --git a/worlds/messenger/test/test_shop.py b/worlds/messenger/test/test_shop.py index 971ff1763b..ce6fd19e33 100644 --- a/worlds/messenger/test/test_shop.py +++ b/worlds/messenger/test/test_shop.py @@ -1,5 +1,6 @@ from typing import Dict +from BaseClasses import CollectionState from . import MessengerTestBase from ..shop import SHOP_ITEMS, FIGURINES @@ -89,3 +90,15 @@ class PlandoTest(MessengerTestBase): self.assertTrue(loc in FIGURINES) self.assertEqual(len(figures), len(FIGURINES)) + + max_cost_state = CollectionState(self.multiworld) + self.assertFalse(self.world.get_location("Money Wrench").can_reach(max_cost_state)) + prog_shards = [] + for item in self.multiworld.itempool: + if "Time Shard " in item.name: + value = int(item.name.strip("Time Shard ()")) + if value >= 100: + prog_shards.append(item) + for shard in prog_shards: + max_cost_state.collect(shard, True) + self.assertTrue(self.world.get_location("Money Wrench").can_reach(max_cost_state)) diff --git a/worlds/minecraft/Structures.py b/worlds/minecraft/Structures.py index df3d944a6c..d4f62f3498 100644 --- a/worlds/minecraft/Structures.py +++ b/worlds/minecraft/Structures.py @@ -29,7 +29,7 @@ def shuffle_structures(self: "MinecraftWorld") -> None: # Connect plando structures first if self.options.plando_connections: - for conn in self.plando_connections: + for conn in self.options.plando_connections: set_pair(conn.entrance, conn.exit) # The algorithm tries to place the most restrictive structures first. This algorithm always works on the diff --git a/worlds/noita/items.py b/worlds/noita/items.py index 6b662fbee6..1cb7d96013 100644 --- a/worlds/noita/items.py +++ b/worlds/noita/items.py @@ -100,13 +100,13 @@ item_table: Dict[str, ItemData] = { "Wand (Tier 5)": ItemData(110010, "Wands", ItemClassification.useful, 1), "Wand (Tier 6)": ItemData(110011, "Wands", ItemClassification.useful, 1), "Kantele": ItemData(110012, "Wands", ItemClassification.useful), - "Fire Immunity Perk": ItemData(110013, "Perks", ItemClassification.progression, 1), - "Toxic Immunity Perk": ItemData(110014, "Perks", ItemClassification.progression, 1), - "Explosion Immunity Perk": ItemData(110015, "Perks", ItemClassification.progression, 1), - "Melee Immunity Perk": ItemData(110016, "Perks", ItemClassification.progression, 1), - "Electricity Immunity Perk": ItemData(110017, "Perks", ItemClassification.progression, 1), - "Tinker with Wands Everywhere Perk": ItemData(110018, "Perks", ItemClassification.progression, 1), - "All-Seeing Eye Perk": ItemData(110019, "Perks", ItemClassification.progression, 1), + "Fire Immunity Perk": ItemData(110013, "Perks", ItemClassification.progression | ItemClassification.useful, 1), + "Toxic Immunity Perk": ItemData(110014, "Perks", ItemClassification.progression | ItemClassification.useful, 1), + "Explosion Immunity Perk": ItemData(110015, "Perks", ItemClassification.progression | ItemClassification.useful, 1), + "Melee Immunity Perk": ItemData(110016, "Perks", ItemClassification.progression | ItemClassification.useful, 1), + "Electricity Immunity Perk": ItemData(110017, "Perks", ItemClassification.progression | ItemClassification.useful, 1), + "Tinker with Wands Everywhere Perk": ItemData(110018, "Perks", ItemClassification.progression | ItemClassification.useful, 1), + "All-Seeing Eye Perk": ItemData(110019, "Perks", ItemClassification.progression | ItemClassification.useful, 1), "Spatial Awareness Perk": ItemData(110020, "Perks", ItemClassification.progression), "Extra Life Perk": ItemData(110021, "Repeatable Perks", ItemClassification.useful, 1), "Orb": ItemData(110022, "Orbs", ItemClassification.progression_skip_balancing), diff --git a/worlds/oot/__init__.py b/worlds/oot/__init__.py index b93f60b2a0..c3925bf2a8 100644 --- a/worlds/oot/__init__.py +++ b/worlds/oot/__init__.py @@ -184,6 +184,10 @@ class OOTWorld(World): "Small Key Ring (Spirit Temple)", "Small Key Ring (Thieves Hideout)", "Small Key Ring (Water Temple)", "Boss Key (Fire Temple)", "Boss Key (Forest Temple)", "Boss Key (Ganons Castle)", "Boss Key (Shadow Temple)", "Boss Key (Spirit Temple)", "Boss Key (Water Temple)"}, + + # aliases + "Longshot": {"Progressive Hookshot"}, # fuzzy hinting thought Longshot was Slingshot + "Hookshot": {"Progressive Hookshot"}, # for consistency, mostly } location_name_groups = build_location_name_groups() diff --git a/worlds/pokemon_emerald/CHANGELOG.md b/worlds/pokemon_emerald/CHANGELOG.md index 6a1844e79f..2d7db0dad4 100644 --- a/worlds/pokemon_emerald/CHANGELOG.md +++ b/worlds/pokemon_emerald/CHANGELOG.md @@ -8,6 +8,9 @@ ### Fixes +- Fixed a rare issue where receiving a wonder trade could partially corrupt the save data, preventing the player from +receiving new items. +- Fixed the client spamming the "goal complete" status update to the server instead of sending it once. - Fixed a logic issue where the "Mauville City - Coin Case from Lady in House" location only required a Harbor Mail if the player randomized NPC gifts. - The Dig tutor has its compatibility percentage raised to 50% if the player's TM/tutor compatibility is set lower. diff --git a/worlds/pokemon_emerald/__init__.py b/worlds/pokemon_emerald/__init__.py index d281dde23c..a87f93ece5 100644 --- a/worlds/pokemon_emerald/__init__.py +++ b/worlds/pokemon_emerald/__init__.py @@ -177,7 +177,7 @@ class PokemonEmeraldWorld(World): for species_name in self.options.trainer_party_blacklist.value if species_name != "_Legendaries" } - if "_Legendaries" in self.options.starter_blacklist.value: + if "_Legendaries" in self.options.trainer_party_blacklist.value: self.blacklisted_opponent_pokemon |= LEGENDARY_POKEMON # In race mode we don't patch any item location information into the ROM diff --git a/worlds/pokemon_emerald/client.py b/worlds/pokemon_emerald/client.py index c91b7d3e26..5add7b3fca 100644 --- a/worlds/pokemon_emerald/client.py +++ b/worlds/pokemon_emerald/client.py @@ -117,6 +117,11 @@ LEGENDARY_NAMES = {k.lower(): v for k, v in { DEFEATED_LEGENDARY_FLAG_MAP = {data.constants[f"FLAG_DEFEATED_{name}"]: name for name in LEGENDARY_NAMES.values()} CAUGHT_LEGENDARY_FLAG_MAP = {data.constants[f"FLAG_CAUGHT_{name}"]: name for name in LEGENDARY_NAMES.values()} +SHOAL_CAVE_MAPS = tuple(data.constants[map_name] for map_name in [ + "MAP_SHOAL_CAVE_LOW_TIDE_ENTRANCE_ROOM", + "MAP_SHOAL_CAVE_LOW_TIDE_INNER_ROOM", +]) + class PokemonEmeraldClient(BizHawkClient): game = "Pokemon Emerald" @@ -414,13 +419,17 @@ class PokemonEmeraldClient(BizHawkClient): read_result = await bizhawk.guarded_read( ctx.bizhawk_ctx, - [(sb1_address + 0x4, 2, "System Bus")], - [guards["SAVE BLOCK 1"]] + [ + (sb1_address + 0x4, 2, "System Bus"), # Current map + (sb1_address + 0x1450 + (data.constants["FLAG_SYS_SHOAL_TIDE"] // 8), 1, "System Bus"), + ], + [guards["IN OVERWORLD"], guards["SAVE BLOCK 1"]] ) if read_result is None: # Save block moved return current_map = int.from_bytes(read_result[0], "big") + shoal_cave = int(read_result[1][0] & (1 << (data.constants["FLAG_SYS_SHOAL_TIDE"] % 8)) > 0) if current_map != self.current_map: self.current_map = current_map await ctx.send_msgs([{ @@ -429,6 +438,7 @@ class PokemonEmeraldClient(BizHawkClient): "data": { "type": "MapUpdate", "mapId": current_map, + **({"tide": shoal_cave} if current_map in SHOAL_CAVE_MAPS else {}), }, }]) @@ -545,11 +555,12 @@ class PokemonEmeraldClient(BizHawkClient): if trade_is_sent == 0 and wonder_trade_pokemon_data[19] == 2: # Game has wonder trade data to send. Send it to data storage, remove it from the game's memory, # and mark that the game is waiting on receiving a trade - Utils.async_start(self.wonder_trade_send(ctx, pokemon_data_to_json(wonder_trade_pokemon_data))) - await bizhawk.write(ctx.bizhawk_ctx, [ + success = await bizhawk.guarded_write(ctx.bizhawk_ctx, [ (sb1_address + 0x377C, bytes(0x50), "System Bus"), (sb1_address + 0x37CC, [1], "System Bus"), - ]) + ], [guards["SAVE BLOCK 1"]]) + if success: + Utils.async_start(self.wonder_trade_send(ctx, pokemon_data_to_json(wonder_trade_pokemon_data))) elif trade_is_sent != 0 and wonder_trade_pokemon_data[19] != 2: # Game is waiting on receiving a trade. if self.queued_received_trade is not None: diff --git a/worlds/timespinner/Options.py b/worlds/timespinner/Options.py index 20ad8132c4..f6a3dba3e3 100644 --- a/worlds/timespinner/Options.py +++ b/worlds/timespinner/Options.py @@ -417,13 +417,16 @@ class HiddenTraps(Traps): """List of traps that may be in the item pool to find""" visibility = Visibility.none -class OptionsHider: - @classmethod - def hidden(cls, option: Type[Option[Any]]) -> Type[Option]: - new_option = AssembleOptions(f"{option}Hidden", option.__bases__, vars(option).copy()) - new_option.visibility = Visibility.none - new_option.__doc__ = option.__doc__ - return new_option +class HiddenDeathLink(DeathLink): + """When you die, everyone who enabled death link dies. Of course, the reverse is true too.""" + visibility = Visibility.none + +def hidden(option: Type[Option[Any]]) -> Type[Option]: + new_option = AssembleOptions(f"{option.__name__}Hidden", option.__bases__, vars(option).copy()) + new_option.visibility = Visibility.none + new_option.__doc__ = option.__doc__ + globals()[f"{option.__name__}Hidden"] = new_option + return new_option class HasReplacedCamelCase(Toggle): """For internal use will display a warning message if true""" @@ -431,41 +434,41 @@ class HasReplacedCamelCase(Toggle): @dataclass class BackwardsCompatiableTimespinnerOptions(TimespinnerOptions): - StartWithJewelryBox: OptionsHider.hidden(StartWithJewelryBox) # type: ignore - DownloadableItems: OptionsHider.hidden(DownloadableItems) # type: ignore - EyeSpy: OptionsHider.hidden(EyeSpy) # type: ignore - StartWithMeyef: OptionsHider.hidden(StartWithMeyef) # type: ignore - QuickSeed: OptionsHider.hidden(QuickSeed) # type: ignore - SpecificKeycards: OptionsHider.hidden(SpecificKeycards) # type: ignore - Inverted: OptionsHider.hidden(Inverted) # type: ignore - GyreArchives: OptionsHider.hidden(GyreArchives) # type: ignore - Cantoran: OptionsHider.hidden(Cantoran) # type: ignore - LoreChecks: OptionsHider.hidden(LoreChecks) # type: ignore - BossRando: OptionsHider.hidden(BossRando) # type: ignore - DamageRando: OptionsHider.hidden(DamageRando) # type: ignore + StartWithJewelryBox: hidden(StartWithJewelryBox) # type: ignore + DownloadableItems: hidden(DownloadableItems) # type: ignore + EyeSpy: hidden(EyeSpy) # type: ignore + StartWithMeyef: hidden(StartWithMeyef) # type: ignore + QuickSeed: hidden(QuickSeed) # type: ignore + SpecificKeycards: hidden(SpecificKeycards) # type: ignore + Inverted: hidden(Inverted) # type: ignore + GyreArchives: hidden(GyreArchives) # type: ignore + Cantoran: hidden(Cantoran) # type: ignore + LoreChecks: hidden(LoreChecks) # type: ignore + BossRando: hidden(BossRando) # type: ignore + DamageRando: hidden(DamageRando) # type: ignore DamageRandoOverrides: HiddenDamageRandoOverrides - HpCap: OptionsHider.hidden(HpCap) # type: ignore - LevelCap: OptionsHider.hidden(LevelCap) # type: ignore - ExtraEarringsXP: OptionsHider.hidden(ExtraEarringsXP) # type: ignore - BossHealing: OptionsHider.hidden(BossHealing) # type: ignore - ShopFill: OptionsHider.hidden(ShopFill) # type: ignore - ShopWarpShards: OptionsHider.hidden(ShopWarpShards) # type: ignore - ShopMultiplier: OptionsHider.hidden(ShopMultiplier) # type: ignore - LootPool: OptionsHider.hidden(LootPool) # type: ignore - DropRateCategory: OptionsHider.hidden(DropRateCategory) # type: ignore - FixedDropRate: OptionsHider.hidden(FixedDropRate) # type: ignore - LootTierDistro: OptionsHider.hidden(LootTierDistro) # type: ignore - ShowBestiary: OptionsHider.hidden(ShowBestiary) # type: ignore - ShowDrops: OptionsHider.hidden(ShowDrops) # type: ignore - EnterSandman: OptionsHider.hidden(EnterSandman) # type: ignore - DadPercent: OptionsHider.hidden(DadPercent) # type: ignore - RisingTides: OptionsHider.hidden(RisingTides) # type: ignore + HpCap: hidden(HpCap) # type: ignore + LevelCap: hidden(LevelCap) # type: ignore + ExtraEarringsXP: hidden(ExtraEarringsXP) # type: ignore + BossHealing: hidden(BossHealing) # type: ignore + ShopFill: hidden(ShopFill) # type: ignore + ShopWarpShards: hidden(ShopWarpShards) # type: ignore + ShopMultiplier: hidden(ShopMultiplier) # type: ignore + LootPool: hidden(LootPool) # type: ignore + DropRateCategory: hidden(DropRateCategory) # type: ignore + FixedDropRate: hidden(FixedDropRate) # type: ignore + LootTierDistro: hidden(LootTierDistro) # type: ignore + ShowBestiary: hidden(ShowBestiary) # type: ignore + ShowDrops: hidden(ShowDrops) # type: ignore + EnterSandman: hidden(EnterSandman) # type: ignore + DadPercent: hidden(DadPercent) # type: ignore + RisingTides: hidden(RisingTides) # type: ignore RisingTidesOverrides: HiddenRisingTidesOverrides - UnchainedKeys: OptionsHider.hidden(UnchainedKeys) # type: ignore - PresentAccessWithWheelAndSpindle: OptionsHider.hidden(PresentAccessWithWheelAndSpindle) # type: ignore - TrapChance: OptionsHider.hidden(TrapChance) # type: ignore + UnchainedKeys: hidden(UnchainedKeys) # type: ignore + PresentAccessWithWheelAndSpindle: hidden(PresentAccessWithWheelAndSpindle) # type: ignore + TrapChance: hidden(TrapChance) # type: ignore Traps: HiddenTraps # type: ignore - DeathLink: OptionsHider.hidden(DeathLink) # type: ignore + DeathLink: HiddenDeathLink # type: ignore has_replaced_options: HasReplacedCamelCase def handle_backward_compatibility(self) -> None: diff --git a/worlds/timespinner/__init__.py b/worlds/timespinner/__init__.py index 66744cffdf..f241d44681 100644 --- a/worlds/timespinner/__init__.py +++ b/worlds/timespinner/__init__.py @@ -190,7 +190,7 @@ class TimespinnerWorld(World): if self.options.has_replaced_options: warning = \ - f"NOTICE: Timespinner options for player '{self.player_name}' where renamed from PasCalCase to snake_case, " \ + f"NOTICE: Timespinner options for player '{self.player_name}' were renamed from PascalCase to snake_case, " \ "please update your yaml" spoiler_handle.write("\n") diff --git a/worlds/tunic/__init__.py b/worlds/tunic/__init__.py index e5d50b1c7a..3df11d0806 100644 --- a/worlds/tunic/__init__.py +++ b/worlds/tunic/__init__.py @@ -321,6 +321,12 @@ class TunicWorld(World): if items_to_create[page] > 0: tunic_items.append(self.create_item(page, ItemClassification.useful)) items_to_create[page] = 0 + # if ice grapple logic is on, probably really want icebolt + elif self.options.ice_grappling: + page = "Pages 52-53 (Icebolt)" + if items_to_create[page] > 0: + tunic_items.append(self.create_item(page, ItemClassification.progression | ItemClassification.useful)) + items_to_create[page] = 0 if self.options.maskless: tunic_items.append(self.create_item("Scavenger Mask", ItemClassification.useful)) diff --git a/worlds/witness/__init__.py b/worlds/witness/__init__.py index b4b38c883e..c9848f2ffe 100644 --- a/worlds/witness/__init__.py +++ b/worlds/witness/__init__.py @@ -14,7 +14,7 @@ from .data import static_items as static_witness_items from .data import static_locations as static_witness_locations from .data import static_logic as static_witness_logic from .data.item_definition_classes import DoorItemDefinition, ItemData -from .data.utils import get_audio_logs +from .data.utils import cast_not_none, get_audio_logs from .hints import CompactHintData, create_all_hints, make_compact_hint_data, make_laser_hints from .locations import WitnessPlayerLocations from .options import TheWitnessOptions, witness_option_groups @@ -55,7 +55,7 @@ class WitnessWorld(World): item_name_to_id = { # ITEM_DATA doesn't have any event items in it - name: cast(int, data.ap_code) for name, data in static_witness_items.ITEM_DATA.items() + name: cast_not_none(data.ap_code) for name, data in static_witness_items.ITEM_DATA.items() } location_name_to_id = static_witness_locations.ALL_LOCATIONS_TO_ID item_name_groups = static_witness_items.ITEM_GROUPS @@ -336,7 +336,7 @@ class WitnessWorld(World): for item_name, hint in laser_hints.items(): item_def = cast(DoorItemDefinition, static_witness_logic.ALL_ITEMS[item_name]) self.laser_ids_to_hints[int(item_def.panel_id_hexes[0], 16)] = make_compact_hint_data(hint, self.player) - already_hinted_locations.add(cast(Location, hint.location)) + already_hinted_locations.add(cast_not_none(hint.location)) # Audio Log Hints diff --git a/worlds/witness/data/utils.py b/worlds/witness/data/utils.py index 84eca5afc4..737daff70f 100644 --- a/worlds/witness/data/utils.py +++ b/worlds/witness/data/utils.py @@ -1,7 +1,7 @@ from math import floor from pkgutil import get_data from random import Random -from typing import Any, Collection, Dict, FrozenSet, Iterable, List, Set, Tuple, TypeVar +from typing import Any, Collection, Dict, FrozenSet, Iterable, List, Optional, Set, Tuple, TypeVar T = TypeVar("T") @@ -13,6 +13,11 @@ T = TypeVar("T") WitnessRule = FrozenSet[FrozenSet[str]] +def cast_not_none(value: Optional[T]) -> T: + assert value is not None + return value + + def weighted_sample(world_random: Random, population: List[T], weights: List[float], k: int) -> List[T]: positions = range(len(population)) indices: List[int] = [] diff --git a/worlds/witness/player_items.py b/worlds/witness/player_items.py index 72dfc2b7ee..4c98cb7849 100644 --- a/worlds/witness/player_items.py +++ b/worlds/witness/player_items.py @@ -15,7 +15,7 @@ from .data.item_definition_classes import ( ProgressiveItemDefinition, WeightedItemDefinition, ) -from .data.utils import build_weighted_int_list +from .data.utils import build_weighted_int_list, cast_not_none from .locations import WitnessPlayerLocations from .player_logic import WitnessPlayerLogic @@ -200,7 +200,7 @@ class WitnessPlayerItems: """ return [ # data.ap_code is guaranteed for a symbol definition - cast(int, data.ap_code) for name, data in static_witness_items.ITEM_DATA.items() + cast_not_none(data.ap_code) for name, data in static_witness_items.ITEM_DATA.items() if name not in self.item_data.keys() and data.definition.category is ItemCategory.SYMBOL ] @@ -211,8 +211,8 @@ class WitnessPlayerItems: if isinstance(item.definition, ProgressiveItemDefinition): # Note: we need to reference the static table here rather than the player-specific one because the child # items were removed from the pool when we pruned out all progression items not in the options. - output[cast(int, item.ap_code)] = [cast(int, static_witness_items.ITEM_DATA[child_item].ap_code) - for child_item in item.definition.child_item_names] + output[cast_not_none(item.ap_code)] = [cast_not_none(static_witness_items.ITEM_DATA[child_item].ap_code) + for child_item in item.definition.child_item_names] return output diff --git a/worlds/witness/test/__init__.py b/worlds/witness/test/__init__.py index 4453609ddc..c3b427851a 100644 --- a/worlds/witness/test/__init__.py +++ b/worlds/witness/test/__init__.py @@ -1,4 +1,4 @@ -from typing import Any, ClassVar, Dict, Iterable, List, Mapping, Union, cast +from typing import Any, ClassVar, Dict, Iterable, List, Mapping, Union from BaseClasses import CollectionState, Entrance, Item, Location, Region @@ -7,6 +7,7 @@ from test.general import gen_steps, setup_multiworld from test.multiworld.test_multiworlds import MultiworldTestBase from .. import WitnessWorld +from ..data.utils import cast_not_none class WitnessTestBase(WorldTestBase): @@ -32,7 +33,7 @@ class WitnessTestBase(WorldTestBase): event_items = [item for item in self.multiworld.get_items() if item.name == item_name] self.assertTrue(event_items, f"Event item {item_name} does not exist.") - event_locations = [cast(Location, event_item.location) for event_item in event_items] + event_locations = [cast_not_none(event_item.location) for event_item in event_items] # Checking for an access dependency on an event item requires a bit of extra work, # as state.remove forces a sweep, which will pick up the event item again right after we tried to remove it. diff --git a/worlds/yachtdice/Items.py b/worlds/yachtdice/Items.py index c76dc53814..d6488498f5 100644 --- a/worlds/yachtdice/Items.py +++ b/worlds/yachtdice/Items.py @@ -16,7 +16,7 @@ class YachtDiceItem(Item): item_table = { - "Dice": ItemData(16871244000, ItemClassification.progression), + "Dice": ItemData(16871244000, ItemClassification.progression | ItemClassification.useful), "Dice Fragment": ItemData(16871244001, ItemClassification.progression), "Roll": ItemData(16871244002, ItemClassification.progression), "Roll Fragment": ItemData(16871244003, ItemClassification.progression), @@ -64,7 +64,7 @@ item_table = { # These points are included in the logic and might be necessary to progress. "1 Point": ItemData(16871244301, ItemClassification.progression_skip_balancing), "10 Points": ItemData(16871244302, ItemClassification.progression), - "100 Points": ItemData(16871244303, ItemClassification.progression), + "100 Points": ItemData(16871244303, ItemClassification.progression | ItemClassification.useful), } # item groups for better hinting diff --git a/worlds/yachtdice/Rules.py b/worlds/yachtdice/Rules.py index d99f5b1474..3fb712fdca 100644 --- a/worlds/yachtdice/Rules.py +++ b/worlds/yachtdice/Rules.py @@ -101,14 +101,15 @@ def dice_simulation_strings(categories, num_dice, num_rolls, fixed_mult, step_mu return yachtdice_cache[player][tup] # sort categories because for the step multiplier, you will want low-scoring categories first - categories.sort(key=lambda category: category.mean_score(num_dice, num_rolls)) + # to avoid errors with order changing when obtaining rolls, we order assuming 4 rolls + categories.sort(key=lambda category: category.mean_score(num_dice, 4)) # function to add two discrete distribution. # defaultdict is a dict where you don't need to check if an id is present, you can just use += (lot faster) def add_distributions(dist1, dist2): combined_dist = defaultdict(float) - for val1, prob1 in dist1.items(): - for val2, prob2 in dist2.items(): + for val2, prob2 in dist2.items(): + for val1, prob1 in dist1.items(): combined_dist[val1 + val2] += prob1 * prob2 return dict(combined_dist) diff --git a/worlds/yachtdice/YachtWeights.py b/worlds/yachtdice/YachtWeights.py index 5f647f3420..f18766d949 100644 --- a/worlds/yachtdice/YachtWeights.py +++ b/worlds/yachtdice/YachtWeights.py @@ -1,11 +1,3 @@ -# A file containing the results of our simulations. -# Every entry consists of a key. This key has input category, number of dice, and number of rolls. -# The value then shows a list of all possible scores to get, and how many times of 100000 it achieved. - -# example: ("Category Choice", 2, 2): -# {8: 13639, 9: 12220, 10: 13755, 5: 4889, 6: 9840, 7: 14772, 12: 7780, 11: 15622, 2: 1269, 3: 2445, 4: 3769} -# this example shows the outcomes for the category "Category Choice", with 2 dice and 2 rolls. -# 13639 out of 100000 times, a score of 8 was achieved for example. yacht_weights = { ("Category Ones", 0, 0): {0: 100000}, ("Category Ones", 0, 1): {0: 100000}, @@ -30,64 +22,64 @@ yacht_weights = { ("Category Ones", 2, 2): {0: 100000}, ("Category Ones", 2, 3): {0: 33544, 1: 66456}, ("Category Ones", 2, 4): {0: 23342, 1: 76658}, - ("Category Ones", 2, 5): {0: 16036, 2: 83964}, - ("Category Ones", 2, 6): {0: 11355, 2: 88645}, - ("Category Ones", 2, 7): {0: 7812, 2: 92188}, - ("Category Ones", 2, 8): {0: 5395, 2: 94605}, + ("Category Ones", 2, 5): {0: 16036, 1: 83964}, + ("Category Ones", 2, 6): {0: 11355, 1: 88645}, + ("Category Ones", 2, 7): {0: 7812, 1: 92188}, + ("Category Ones", 2, 8): {0: 5395, 1: 94605}, ("Category Ones", 3, 0): {0: 100000}, ("Category Ones", 3, 1): {0: 100000}, ("Category Ones", 3, 2): {0: 33327, 1: 66673}, - ("Category Ones", 3, 3): {0: 19432, 2: 80568}, - ("Category Ones", 3, 4): {0: 11191, 2: 88809}, - ("Category Ones", 3, 5): {0: 35427, 2: 64573}, - ("Category Ones", 3, 6): {0: 26198, 2: 73802}, - ("Category Ones", 3, 7): {0: 18851, 3: 81149}, - ("Category Ones", 3, 8): {0: 13847, 3: 86153}, + ("Category Ones", 3, 3): {0: 19432, 1: 80568}, + ("Category Ones", 3, 4): {0: 11191, 1: 88809}, + ("Category Ones", 3, 5): {0: 3963, 2: 64583, 1: 31454}, + ("Category Ones", 3, 6): {0: 3286, 2: 96714}, + ("Category Ones", 3, 7): {0: 57, 2: 99943}, + ("Category Ones", 3, 8): {2: 100000}, ("Category Ones", 4, 0): {0: 100000}, ("Category Ones", 4, 1): {0: 100000}, - ("Category Ones", 4, 2): {0: 23349, 2: 76651}, - ("Category Ones", 4, 3): {0: 11366, 2: 88634}, - ("Category Ones", 4, 4): {0: 28572, 3: 71428}, - ("Category Ones", 4, 5): {0: 17976, 3: 82024}, - ("Category Ones", 4, 6): {0: 1253, 3: 98747}, - ("Category Ones", 4, 7): {0: 31228, 3: 68772}, - ("Category Ones", 4, 8): {0: 23273, 4: 76727}, + ("Category Ones", 4, 2): {0: 23349, 1: 76651}, + ("Category Ones", 4, 3): {0: 11366, 1: 88634}, + ("Category Ones", 4, 4): {0: 3246, 2: 71438, 1: 25316}, + ("Category Ones", 4, 5): {0: 1466, 2: 98534}, + ("Category Ones", 4, 6): {0: 7, 2: 99993}, + ("Category Ones", 4, 7): {0: 2, 2: 31222, 3: 68776}, + ("Category Ones", 4, 8): {3: 99999, 2: 1}, ("Category Ones", 5, 0): {0: 100000}, ("Category Ones", 5, 1): {0: 100000}, - ("Category Ones", 5, 2): {0: 16212, 2: 83788}, - ("Category Ones", 5, 3): {0: 30104, 3: 69896}, - ("Category Ones", 5, 4): {0: 2552, 3: 97448}, - ("Category Ones", 5, 5): {0: 32028, 4: 67972}, - ("Category Ones", 5, 6): {0: 21215, 4: 78785}, - ("Category Ones", 5, 7): {0: 2295, 4: 97705}, - ("Category Ones", 5, 8): {0: 1167, 4: 98833}, + ("Category Ones", 5, 2): {0: 16212, 1: 83788}, + ("Category Ones", 5, 3): {0: 4879, 2: 69906, 1: 25215}, + ("Category Ones", 5, 4): {0: 1513, 2: 98487}, + ("Category Ones", 5, 5): {0: 484, 2: 31541, 3: 67975}, + ("Category Ones", 5, 6): {3: 99785, 2: 215}, + ("Category Ones", 5, 7): {3: 100000}, + ("Category Ones", 5, 8): {4: 66815, 3: 33185}, ("Category Ones", 6, 0): {0: 100000}, ("Category Ones", 6, 1): {0: 33501, 1: 66499}, - ("Category Ones", 6, 2): {0: 40705, 2: 59295}, - ("Category Ones", 6, 3): {0: 3764, 3: 96236}, - ("Category Ones", 6, 4): {0: 9324, 4: 90676}, - ("Category Ones", 6, 5): {0: 4208, 4: 95792}, - ("Category Ones", 6, 6): {0: 158, 5: 99842}, - ("Category Ones", 6, 7): {0: 5503, 5: 94497}, - ("Category Ones", 6, 8): {0: 2896, 5: 97104}, + ("Category Ones", 6, 2): {0: 11326, 1: 88674}, + ("Category Ones", 6, 3): {0: 2289, 2: 79783, 1: 17928}, + ("Category Ones", 6, 4): {0: 10, 3: 68933, 2: 30973, 1: 84}, + ("Category Ones", 6, 5): {0: 4, 3: 99996}, + ("Category Ones", 6, 6): {2: 1, 4: 67785, 3: 32214}, + ("Category Ones", 6, 7): {4: 100000}, + ("Category Ones", 6, 8): {4: 100000}, ("Category Ones", 7, 0): {0: 100000}, - ("Category Ones", 7, 1): {0: 27838, 2: 72162}, - ("Category Ones", 7, 2): {0: 7796, 3: 92204}, - ("Category Ones", 7, 3): {0: 13389, 4: 86611}, - ("Category Ones", 7, 4): {0: 5252, 4: 94748}, - ("Category Ones", 7, 5): {0: 9854, 5: 90146}, - ("Category Ones", 7, 6): {0: 4625, 5: 95375}, - ("Category Ones", 7, 7): {0: 30339, 6: 69661}, - ("Category Ones", 7, 8): {0: 5519, 6: 94481}, + ("Category Ones", 7, 1): {0: 27838, 1: 72162}, + ("Category Ones", 7, 2): {0: 8807, 2: 68364, 1: 22829}, + ("Category Ones", 7, 3): {0: 75, 3: 62348, 2: 35246, 1: 2331}, + ("Category Ones", 7, 4): {0: 6, 3: 99994}, + ("Category Ones", 7, 5): {3: 29500, 4: 70500}, + ("Category Ones", 7, 6): {4: 100000}, + ("Category Ones", 7, 7): {4: 30322, 5: 69678}, + ("Category Ones", 7, 8): {5: 100000}, ("Category Ones", 8, 0): {0: 100000}, - ("Category Ones", 8, 1): {0: 23156, 2: 76844}, - ("Category Ones", 8, 2): {0: 5472, 3: 94528}, - ("Category Ones", 8, 3): {0: 8661, 4: 91339}, - ("Category Ones", 8, 4): {0: 12125, 5: 87875}, - ("Category Ones", 8, 5): {0: 5173, 5: 94827}, - ("Category Ones", 8, 6): {0: 8872, 6: 91128}, - ("Category Ones", 8, 7): {0: 4236, 6: 95764}, - ("Category Ones", 8, 8): {0: 9107, 7: 90893}, + ("Category Ones", 8, 1): {0: 23156, 1: 76844}, + ("Category Ones", 8, 2): {0: 5678, 2: 75480, 1: 18842}, + ("Category Ones", 8, 3): {0: 28, 3: 99972}, + ("Category Ones", 8, 4): {3: 32486, 4: 67514}, + ("Category Ones", 8, 5): {4: 100000}, + ("Category Ones", 8, 6): {5: 74125, 4: 25875}, + ("Category Ones", 8, 7): {6: 60476, 5: 29297, 4: 10227}, + ("Category Ones", 8, 8): {6: 99999, 5: 1}, ("Category Twos", 0, 0): {0: 100000}, ("Category Twos", 0, 1): {0: 100000}, ("Category Twos", 0, 2): {0: 100000}, @@ -99,7 +91,7 @@ yacht_weights = { ("Category Twos", 0, 8): {0: 100000}, ("Category Twos", 1, 0): {0: 100000}, ("Category Twos", 1, 1): {0: 100000}, - ("Category Twos", 1, 2): {0: 100000}, + ("Category Twos", 1, 2): {0: 69690, 2: 30310}, ("Category Twos", 1, 3): {0: 57818, 2: 42182}, ("Category Twos", 1, 4): {0: 48418, 2: 51582}, ("Category Twos", 1, 5): {0: 40301, 2: 59699}, @@ -107,68 +99,68 @@ yacht_weights = { ("Category Twos", 1, 7): {0: 28182, 2: 71818}, ("Category Twos", 1, 8): {0: 23406, 2: 76594}, ("Category Twos", 2, 0): {0: 100000}, - ("Category Twos", 2, 1): {0: 100000}, + ("Category Twos", 2, 1): {0: 69724, 2: 30276}, ("Category Twos", 2, 2): {0: 48238, 2: 51762}, - ("Category Twos", 2, 3): {0: 33290, 4: 66710}, - ("Category Twos", 2, 4): {0: 23136, 4: 76864}, - ("Category Twos", 2, 5): {0: 16146, 4: 83854}, - ("Category Twos", 2, 6): {0: 11083, 4: 88917}, - ("Category Twos", 2, 7): {0: 7662, 4: 92338}, - ("Category Twos", 2, 8): {0: 5354, 4: 94646}, + ("Category Twos", 2, 3): {0: 33290, 2: 66710}, + ("Category Twos", 2, 4): {0: 23136, 2: 76864}, + ("Category Twos", 2, 5): {0: 16146, 2: 48200, 4: 35654}, + ("Category Twos", 2, 6): {0: 11083, 2: 44497, 4: 44420}, + ("Category Twos", 2, 7): {0: 7662, 2: 40343, 4: 51995}, + ("Category Twos", 2, 8): {0: 5354, 2: 35526, 4: 59120}, ("Category Twos", 3, 0): {0: 100000}, ("Category Twos", 3, 1): {0: 58021, 2: 41979}, - ("Category Twos", 3, 2): {0: 33548, 4: 66452}, - ("Category Twos", 3, 3): {0: 19375, 4: 80625}, - ("Category Twos", 3, 4): {0: 10998, 4: 89002}, - ("Category Twos", 3, 5): {0: 6519, 6: 93481}, - ("Category Twos", 3, 6): {0: 3619, 6: 96381}, - ("Category Twos", 3, 7): {0: 2195, 6: 97805}, - ("Category Twos", 3, 8): {0: 13675, 6: 86325}, + ("Category Twos", 3, 2): {0: 33548, 2: 66452}, + ("Category Twos", 3, 3): {0: 19375, 2: 42372, 4: 38253}, + ("Category Twos", 3, 4): {0: 10998, 2: 36435, 4: 52567}, + ("Category Twos", 3, 5): {0: 7954, 4: 92046}, + ("Category Twos", 3, 6): {0: 347, 4: 99653}, + ("Category Twos", 3, 7): {0: 2, 4: 62851, 6: 37147}, + ("Category Twos", 3, 8): {6: 99476, 4: 524}, ("Category Twos", 4, 0): {0: 100000}, ("Category Twos", 4, 1): {0: 48235, 2: 51765}, - ("Category Twos", 4, 2): {0: 23289, 4: 76711}, - ("Category Twos", 4, 3): {0: 11177, 6: 88823}, - ("Category Twos", 4, 4): {0: 5499, 6: 94501}, - ("Category Twos", 4, 5): {0: 18356, 6: 81644}, - ("Category Twos", 4, 6): {0: 11169, 8: 88831}, - ("Category Twos", 4, 7): {0: 6945, 8: 93055}, - ("Category Twos", 4, 8): {0: 4091, 8: 95909}, + ("Category Twos", 4, 2): {0: 23289, 2: 40678, 4: 36033}, + ("Category Twos", 4, 3): {0: 11177, 2: 32677, 4: 56146}, + ("Category Twos", 4, 4): {0: 5522, 4: 60436, 6: 34042}, + ("Category Twos", 4, 5): {0: 4358, 6: 95642}, + ("Category Twos", 4, 6): {0: 20, 6: 99980}, + ("Category Twos", 4, 7): {6: 100000}, + ("Category Twos", 4, 8): {6: 65250, 8: 34750}, ("Category Twos", 5, 0): {0: 100000}, - ("Category Twos", 5, 1): {0: 40028, 4: 59972}, - ("Category Twos", 5, 2): {0: 16009, 6: 83991}, - ("Category Twos", 5, 3): {0: 6489, 6: 93511}, - ("Category Twos", 5, 4): {0: 16690, 8: 83310}, - ("Category Twos", 5, 5): {0: 9016, 8: 90984}, - ("Category Twos", 5, 6): {0: 4602, 8: 95398}, - ("Category Twos", 5, 7): {0: 13627, 10: 86373}, - ("Category Twos", 5, 8): {0: 8742, 10: 91258}, + ("Category Twos", 5, 1): {0: 40028, 2: 59972}, + ("Category Twos", 5, 2): {0: 16009, 2: 35901, 4: 48090}, + ("Category Twos", 5, 3): {0: 6820, 4: 57489, 6: 35691}, + ("Category Twos", 5, 4): {0: 5285, 6: 94715}, + ("Category Twos", 5, 5): {0: 18, 6: 66613, 8: 33369}, + ("Category Twos", 5, 6): {8: 99073, 6: 927}, + ("Category Twos", 5, 7): {8: 100000}, + ("Category Twos", 5, 8): {8: 100000}, ("Category Twos", 6, 0): {0: 100000}, - ("Category Twos", 6, 1): {0: 33502, 4: 66498}, - ("Category Twos", 6, 2): {0: 11210, 6: 88790}, - ("Category Twos", 6, 3): {0: 3673, 6: 96327}, - ("Category Twos", 6, 4): {0: 9291, 8: 90709}, - ("Category Twos", 6, 5): {0: 441, 8: 99559}, - ("Category Twos", 6, 6): {0: 10255, 10: 89745}, - ("Category Twos", 6, 7): {0: 5646, 10: 94354}, - ("Category Twos", 6, 8): {0: 14287, 12: 85713}, + ("Category Twos", 6, 1): {0: 33502, 2: 66498}, + ("Category Twos", 6, 2): {0: 13681, 4: 59162, 2: 27157}, + ("Category Twos", 6, 3): {0: 5486, 6: 94514}, + ("Category Twos", 6, 4): {0: 190, 6: 62108, 8: 37702}, + ("Category Twos", 6, 5): {8: 99882, 6: 118}, + ("Category Twos", 6, 6): {8: 65144, 10: 34856}, + ("Category Twos", 6, 7): {10: 99524, 8: 476}, + ("Category Twos", 6, 8): {10: 100000}, ("Category Twos", 7, 0): {0: 100000}, - ("Category Twos", 7, 1): {0: 27683, 4: 72317}, - ("Category Twos", 7, 2): {0: 7824, 6: 92176}, - ("Category Twos", 7, 3): {0: 13167, 8: 86833}, - ("Category Twos", 7, 4): {0: 564, 10: 99436}, - ("Category Twos", 7, 5): {0: 9824, 10: 90176}, - ("Category Twos", 7, 6): {0: 702, 12: 99298}, - ("Category Twos", 7, 7): {0: 10186, 12: 89814}, - ("Category Twos", 7, 8): {0: 942, 12: 99058}, + ("Category Twos", 7, 1): {0: 27683, 2: 39060, 4: 33257}, + ("Category Twos", 7, 2): {0: 8683, 4: 54932, 6: 36385}, + ("Category Twos", 7, 3): {0: 373, 6: 66572, 8: 33055}, + ("Category Twos", 7, 4): {8: 99816, 6: 184}, + ("Category Twos", 7, 5): {8: 58124, 10: 41876}, + ("Category Twos", 7, 6): {10: 99948, 8: 52}, + ("Category Twos", 7, 7): {10: 62549, 12: 37451}, + ("Category Twos", 7, 8): {12: 99818, 10: 182}, ("Category Twos", 8, 0): {0: 100000}, - ("Category Twos", 8, 1): {0: 23378, 4: 76622}, - ("Category Twos", 8, 2): {0: 5420, 8: 94580}, - ("Category Twos", 8, 3): {0: 8560, 10: 91440}, - ("Category Twos", 8, 4): {0: 12199, 12: 87801}, - ("Category Twos", 8, 5): {0: 879, 12: 99121}, - ("Category Twos", 8, 6): {0: 9033, 14: 90967}, - ("Category Twos", 8, 7): {0: 15767, 14: 84233}, - ("Category Twos", 8, 8): {2: 9033, 14: 90967}, + ("Category Twos", 8, 1): {0: 23378, 2: 37157, 4: 39465}, + ("Category Twos", 8, 2): {0: 5602, 6: 94398}, + ("Category Twos", 8, 3): {0: 8, 6: 10911, 8: 89081}, + ("Category Twos", 8, 4): {8: 59809, 10: 40191}, + ("Category Twos", 8, 5): {10: 68808, 12: 31114, 8: 78}, + ("Category Twos", 8, 6): {12: 98712, 10: 1287, 8: 1}, + ("Category Twos", 8, 7): {12: 100000}, + ("Category Twos", 8, 8): {12: 59018, 14: 40982}, ("Category Threes", 0, 0): {0: 100000}, ("Category Threes", 0, 1): {0: 100000}, ("Category Threes", 0, 2): {0: 100000}, @@ -190,66 +182,66 @@ yacht_weights = { ("Category Threes", 2, 0): {0: 100000}, ("Category Threes", 2, 1): {0: 69419, 3: 30581}, ("Category Threes", 2, 2): {0: 48202, 3: 51798}, - ("Category Threes", 2, 3): {0: 33376, 6: 66624}, - ("Category Threes", 2, 4): {0: 23276, 6: 76724}, - ("Category Threes", 2, 5): {0: 16092, 6: 83908}, - ("Category Threes", 2, 6): {0: 11232, 6: 88768}, - ("Category Threes", 2, 7): {0: 7589, 6: 92411}, - ("Category Threes", 2, 8): {0: 5447, 6: 94553}, + ("Category Threes", 2, 3): {0: 33376, 3: 66624}, + ("Category Threes", 2, 4): {0: 23276, 3: 49810, 6: 26914}, + ("Category Threes", 2, 5): {0: 16092, 3: 47718, 6: 36190}, + ("Category Threes", 2, 6): {0: 11232, 3: 44515, 6: 44253}, + ("Category Threes", 2, 7): {0: 7589, 3: 40459, 6: 51952}, + ("Category Threes", 2, 8): {0: 5447, 3: 35804, 6: 58749}, ("Category Threes", 3, 0): {0: 100000}, ("Category Threes", 3, 1): {0: 57964, 3: 42036}, - ("Category Threes", 3, 2): {0: 33637, 6: 66363}, - ("Category Threes", 3, 3): {0: 19520, 6: 80480}, - ("Category Threes", 3, 4): {0: 11265, 6: 88735}, - ("Category Threes", 3, 5): {0: 6419, 6: 72177, 9: 21404}, - ("Category Threes", 3, 6): {0: 3810, 6: 66884, 9: 29306}, - ("Category Threes", 3, 7): {0: 2174, 6: 60595, 9: 37231}, - ("Category Threes", 3, 8): {0: 1237, 6: 53693, 9: 45070}, + ("Category Threes", 3, 2): {0: 33637, 3: 44263, 6: 22100}, + ("Category Threes", 3, 3): {0: 19520, 3: 42382, 6: 38098}, + ("Category Threes", 3, 4): {0: 11265, 3: 35772, 6: 52963}, + ("Category Threes", 3, 5): {0: 6419, 3: 28916, 6: 43261, 9: 21404}, + ("Category Threes", 3, 6): {0: 3810, 3: 22496, 6: 44388, 9: 29306}, + ("Category Threes", 3, 7): {0: 1317, 6: 30047, 9: 68636}, + ("Category Threes", 3, 8): {0: 750, 9: 99250}, ("Category Threes", 4, 0): {0: 100000}, - ("Category Threes", 4, 1): {0: 48121, 6: 51879}, - ("Category Threes", 4, 2): {0: 23296, 6: 76704}, - ("Category Threes", 4, 3): {0: 11233, 6: 68363, 9: 20404}, - ("Category Threes", 4, 4): {0: 5463, 6: 60738, 9: 33799}, - ("Category Threes", 4, 5): {0: 2691, 6: 50035, 12: 47274}, - ("Category Threes", 4, 6): {0: 11267, 9: 88733}, - ("Category Threes", 4, 7): {0: 6921, 9: 66034, 12: 27045}, - ("Category Threes", 4, 8): {0: 4185, 9: 61079, 12: 34736}, + ("Category Threes", 4, 1): {0: 48121, 3: 51879}, + ("Category Threes", 4, 2): {0: 23296, 3: 40989, 6: 35715}, + ("Category Threes", 4, 3): {0: 11233, 3: 32653, 6: 35710, 9: 20404}, + ("Category Threes", 4, 4): {0: 5463, 3: 23270, 6: 37468, 9: 33799}, + ("Category Threes", 4, 5): {0: 5225, 6: 29678, 9: 65097}, + ("Category Threes", 4, 6): {0: 3535, 9: 96465}, + ("Category Threes", 4, 7): {0: 6, 9: 72939, 12: 27055}, + ("Category Threes", 4, 8): {9: 25326, 12: 74674}, ("Category Threes", 5, 0): {0: 100000}, - ("Category Threes", 5, 1): {0: 40183, 6: 59817}, - ("Category Threes", 5, 2): {0: 16197, 6: 83803}, - ("Category Threes", 5, 3): {0: 6583, 6: 57826, 9: 35591}, - ("Category Threes", 5, 4): {0: 2636, 9: 76577, 12: 20787}, - ("Category Threes", 5, 5): {0: 8879, 9: 57821, 12: 33300}, - ("Category Threes", 5, 6): {0: 4652, 12: 95348}, - ("Category Threes", 5, 7): {0: 2365, 12: 97635}, - ("Category Threes", 5, 8): {0: 8671, 12: 64865, 15: 26464}, + ("Category Threes", 5, 1): {0: 40183, 3: 59817}, + ("Category Threes", 5, 2): {0: 16197, 3: 35494, 6: 48309}, + ("Category Threes", 5, 3): {0: 6583, 3: 23394, 6: 34432, 9: 35591}, + ("Category Threes", 5, 4): {0: 5007, 6: 25159, 9: 49038, 12: 20796}, + ("Category Threes", 5, 5): {0: 2900, 9: 38935, 12: 58165}, + ("Category Threes", 5, 6): {0: 2090, 12: 97910}, + ("Category Threes", 5, 7): {12: 99994, 9: 6}, + ("Category Threes", 5, 8): {12: 73524, 15: 26476}, ("Category Threes", 6, 0): {0: 100000}, - ("Category Threes", 6, 1): {0: 33473, 6: 66527}, - ("Category Threes", 6, 2): {0: 11147, 6: 62222, 9: 26631}, - ("Category Threes", 6, 3): {0: 3628, 9: 75348, 12: 21024}, - ("Category Threes", 6, 4): {0: 9498, 9: 52940, 15: 37562}, - ("Category Threes", 6, 5): {0: 4236, 12: 72944, 15: 22820}, - ("Category Threes", 6, 6): {0: 10168, 12: 55072, 15: 34760}, - ("Category Threes", 6, 7): {0: 5519, 15: 94481}, - ("Category Threes", 6, 8): {0: 2968, 15: 76504, 18: 20528}, + ("Category Threes", 6, 1): {0: 33473, 3: 40175, 6: 26352}, + ("Category Threes", 6, 2): {0: 11147, 3: 29592, 6: 32630, 9: 26631}, + ("Category Threes", 6, 3): {0: 2460, 6: 21148, 9: 55356, 12: 21036}, + ("Category Threes", 6, 4): {0: 997, 9: 29741, 12: 69262}, + ("Category Threes", 6, 5): {0: 831, 12: 76328, 15: 22841}, + ("Category Threes", 6, 6): {12: 29960, 15: 70040}, + ("Category Threes", 6, 7): {15: 100000}, + ("Category Threes", 6, 8): {15: 79456, 18: 20544}, ("Category Threes", 7, 0): {0: 100000}, - ("Category Threes", 7, 1): {0: 27933, 6: 72067}, - ("Category Threes", 7, 2): {0: 7794, 6: 55728, 12: 36478}, - ("Category Threes", 7, 3): {0: 2138, 9: 64554, 15: 33308}, - ("Category Threes", 7, 4): {0: 5238, 12: 69214, 15: 25548}, - ("Category Threes", 7, 5): {0: 9894, 15: 90106}, - ("Category Threes", 7, 6): {0: 4656, 15: 69353, 18: 25991}, - ("Category Threes", 7, 7): {0: 10005, 15: 52430, 18: 37565}, - ("Category Threes", 7, 8): {0: 5710, 18: 94290}, + ("Category Threes", 7, 1): {0: 27933, 3: 39105, 6: 32962}, + ("Category Threes", 7, 2): {0: 7794, 3: 23896, 6: 31832, 9: 36478}, + ("Category Threes", 7, 3): {0: 1321, 9: 40251, 12: 58428}, + ("Category Threes", 7, 4): {0: 370, 12: 74039, 15: 25591}, + ("Category Threes", 7, 5): {0: 6, 15: 98660, 12: 1334}, + ("Category Threes", 7, 6): {15: 73973, 18: 26027}, + ("Category Threes", 7, 7): {18: 100000}, + ("Category Threes", 7, 8): {18: 100000}, ("Category Threes", 8, 0): {0: 100000}, - ("Category Threes", 8, 1): {0: 23337, 6: 76663}, - ("Category Threes", 8, 2): {0: 5310, 9: 74178, 12: 20512}, - ("Category Threes", 8, 3): {0: 8656, 12: 70598, 15: 20746}, - ("Category Threes", 8, 4): {0: 291, 12: 59487, 18: 40222}, - ("Category Threes", 8, 5): {0: 5145, 15: 63787, 18: 31068}, - ("Category Threes", 8, 6): {0: 8804, 18: 91196}, - ("Category Threes", 8, 7): {0: 4347, 18: 65663, 21: 29990}, - ("Category Threes", 8, 8): {0: 9252, 21: 90748}, + ("Category Threes", 8, 1): {0: 23337, 3: 37232, 6: 39431}, + ("Category Threes", 8, 2): {0: 4652, 6: 29310, 9: 45517, 12: 20521}, + ("Category Threes", 8, 3): {0: 1300, 12: 77919, 15: 20781}, + ("Category Threes", 8, 4): {0: 21, 15: 98678, 12: 1301}, + ("Category Threes", 8, 5): {15: 68893, 18: 31107}, + ("Category Threes", 8, 6): {18: 100000}, + ("Category Threes", 8, 7): {18: 69986, 21: 30014}, + ("Category Threes", 8, 8): {21: 98839, 18: 1161}, ("Category Fours", 0, 0): {0: 100000}, ("Category Fours", 0, 1): {0: 100000}, ("Category Fours", 0, 2): {0: 100000}, @@ -276,61 +268,61 @@ yacht_weights = { ("Category Fours", 2, 5): {0: 16222, 4: 48009, 8: 35769}, ("Category Fours", 2, 6): {0: 11125, 4: 44400, 8: 44475}, ("Category Fours", 2, 7): {0: 7919, 4: 40216, 8: 51865}, - ("Category Fours", 2, 8): {0: 5348, 8: 94652}, + ("Category Fours", 2, 8): {0: 5348, 4: 35757, 8: 58895}, ("Category Fours", 3, 0): {0: 100000}, ("Category Fours", 3, 1): {0: 57914, 4: 42086}, ("Category Fours", 3, 2): {0: 33621, 4: 44110, 8: 22269}, ("Category Fours", 3, 3): {0: 19153, 4: 42425, 8: 38422}, - ("Category Fours", 3, 4): {0: 11125, 8: 88875}, - ("Category Fours", 3, 5): {0: 6367, 8: 72308, 12: 21325}, - ("Category Fours", 3, 6): {0: 3643, 8: 66934, 12: 29423}, - ("Category Fours", 3, 7): {0: 2178, 8: 60077, 12: 37745}, - ("Category Fours", 3, 8): {0: 1255, 8: 53433, 12: 45312}, + ("Category Fours", 3, 4): {0: 11125, 4: 36011, 8: 52864}, + ("Category Fours", 3, 5): {0: 6367, 4: 29116, 8: 43192, 12: 21325}, + ("Category Fours", 3, 6): {0: 3643, 4: 22457, 8: 44477, 12: 29423}, + ("Category Fours", 3, 7): {0: 2178, 4: 16802, 8: 43275, 12: 37745}, + ("Category Fours", 3, 8): {0: 488, 8: 20703, 12: 78809}, ("Category Fours", 4, 0): {0: 100000}, ("Category Fours", 4, 1): {0: 48465, 4: 51535}, - ("Category Fours", 4, 2): {0: 23296, 4: 40911, 12: 35793}, - ("Category Fours", 4, 3): {0: 11200, 8: 68528, 12: 20272}, - ("Category Fours", 4, 4): {0: 5447, 8: 60507, 12: 34046}, - ("Category Fours", 4, 5): {0: 2533, 8: 50449, 16: 47018}, - ("Category Fours", 4, 6): {0: 1314, 8: 39851, 12: 39425, 16: 19410}, - ("Category Fours", 4, 7): {0: 6823, 12: 66167, 16: 27010}, - ("Category Fours", 4, 8): {0: 4189, 12: 61034, 16: 34777}, + ("Category Fours", 4, 2): {0: 23296, 4: 40911, 8: 35793}, + ("Category Fours", 4, 3): {0: 11200, 4: 33191, 8: 35337, 12: 20272}, + ("Category Fours", 4, 4): {0: 5447, 4: 23066, 8: 37441, 12: 34046}, + ("Category Fours", 4, 5): {0: 2533, 4: 15668, 8: 34781, 12: 47018}, + ("Category Fours", 4, 6): {0: 2058, 8: 19749, 12: 58777, 16: 19416}, + ("Category Fours", 4, 7): {0: 1476, 12: 45913, 16: 52611}, + ("Category Fours", 4, 8): {0: 23, 12: 18149, 16: 81828}, ("Category Fours", 5, 0): {0: 100000}, ("Category Fours", 5, 1): {0: 40215, 4: 40127, 8: 19658}, - ("Category Fours", 5, 2): {0: 15946, 8: 66737, 12: 17317}, - ("Category Fours", 5, 3): {0: 6479, 8: 58280, 16: 35241}, - ("Category Fours", 5, 4): {0: 2635, 8: 43968, 16: 53397}, - ("Category Fours", 5, 5): {0: 8916, 12: 57586, 16: 33498}, - ("Category Fours", 5, 6): {0: 4682, 12: 49435, 20: 45883}, - ("Category Fours", 5, 7): {0: 2291, 12: 40537, 16: 37701, 20: 19471}, - ("Category Fours", 5, 8): {0: 75, 16: 73483, 20: 26442}, + ("Category Fours", 5, 2): {0: 15946, 4: 35579, 8: 31158, 12: 17317}, + ("Category Fours", 5, 3): {0: 6479, 4: 23705, 8: 34575, 12: 35241}, + ("Category Fours", 5, 4): {0: 4987, 8: 25190, 12: 48849, 16: 20974}, + ("Category Fours", 5, 5): {0: 1553, 12: 39966, 16: 58481}, + ("Category Fours", 5, 6): {0: 843, 16: 99157}, + ("Category Fours", 5, 7): {16: 80514, 20: 19486}, + ("Category Fours", 5, 8): {16: 38393, 20: 61607}, ("Category Fours", 6, 0): {0: 100000}, ("Category Fours", 6, 1): {0: 33632, 4: 39856, 8: 26512}, - ("Category Fours", 6, 2): {0: 11175, 8: 62205, 12: 26620}, - ("Category Fours", 6, 3): {0: 3698, 8: 46268, 16: 50034}, - ("Category Fours", 6, 4): {0: 9173, 12: 52855, 20: 37972}, - ("Category Fours", 6, 5): {0: 4254, 12: 41626, 20: 54120}, - ("Category Fours", 6, 6): {0: 1783, 16: 63190, 24: 35027}, - ("Category Fours", 6, 7): {0: 5456, 16: 47775, 24: 46769}, - ("Category Fours", 6, 8): {0: 2881, 16: 39229, 24: 57890}, + ("Category Fours", 6, 2): {0: 11175, 4: 29824, 8: 32381, 12: 26620}, + ("Category Fours", 6, 3): {0: 3698, 4: 16329, 8: 29939, 12: 29071, 16: 20963}, + ("Category Fours", 6, 4): {0: 2326, 12: 28286, 16: 69388}, + ("Category Fours", 6, 5): {0: 1030, 16: 76056, 20: 22914}, + ("Category Fours", 6, 6): {0: 7, 16: 29753, 20: 70240}, + ("Category Fours", 6, 7): {20: 99999, 16: 1}, + ("Category Fours", 6, 8): {20: 79470, 24: 20530}, ("Category Fours", 7, 0): {0: 100000}, - ("Category Fours", 7, 1): {0: 27821, 4: 39289, 12: 32890}, - ("Category Fours", 7, 2): {0: 7950, 8: 55659, 16: 36391}, - ("Category Fours", 7, 3): {0: 2194, 12: 64671, 20: 33135}, - ("Category Fours", 7, 4): {0: 5063, 12: 41118, 20: 53819}, - ("Category Fours", 7, 5): {0: 171, 16: 57977, 24: 41852}, - ("Category Fours", 7, 6): {0: 4575, 16: 38694, 24: 56731}, - ("Category Fours", 7, 7): {0: 252, 20: 62191, 28: 37557}, - ("Category Fours", 7, 8): {4: 5576, 20: 45351, 28: 49073}, + ("Category Fours", 7, 1): {0: 27821, 4: 39289, 8: 32890}, + ("Category Fours", 7, 2): {0: 7950, 4: 24026, 8: 31633, 12: 36391}, + ("Category Fours", 7, 3): {0: 1887, 12: 31108, 16: 67005}, + ("Category Fours", 7, 4): {0: 423, 16: 73837, 20: 25740}, + ("Category Fours", 7, 5): {0: 57, 16: 10063, 20: 74092, 24: 15788}, + ("Category Fours", 7, 6): {0: 6, 20: 31342, 24: 68652}, + ("Category Fours", 7, 7): {24: 99995, 20: 5}, + ("Category Fours", 7, 8): {24: 84330, 28: 15670}, ("Category Fours", 8, 0): {0: 100000}, - ("Category Fours", 8, 1): {0: 23275, 8: 76725}, - ("Category Fours", 8, 2): {0: 5421, 8: 48273, 16: 46306}, - ("Category Fours", 8, 3): {0: 8626, 12: 45516, 20: 45858}, - ("Category Fours", 8, 4): {0: 2852, 16: 56608, 24: 40540}, - ("Category Fours", 8, 5): {0: 5049, 20: 63834, 28: 31117}, - ("Category Fours", 8, 6): {0: 269, 20: 53357, 28: 46374}, - ("Category Fours", 8, 7): {0: 4394, 24: 65785, 28: 29821}, - ("Category Fours", 8, 8): {0: 266, 24: 58443, 32: 41291}, + ("Category Fours", 8, 1): {0: 23275, 4: 37161, 8: 39564}, + ("Category Fours", 8, 2): {0: 5421, 4: 19014, 8: 29259, 12: 25812, 16: 20494}, + ("Category Fours", 8, 3): {0: 649, 16: 78572, 20: 20779}, + ("Category Fours", 8, 4): {0: 15, 20: 80772, 24: 17355, 16: 1858}, + ("Category Fours", 8, 5): {20: 15615, 24: 84385}, + ("Category Fours", 8, 6): {24: 80655, 28: 19345}, + ("Category Fours", 8, 7): {24: 23969, 28: 76031}, + ("Category Fours", 8, 8): {28: 100000}, ("Category Fives", 0, 0): {0: 100000}, ("Category Fives", 0, 1): {0: 100000}, ("Category Fives", 0, 2): {0: 100000}, @@ -363,55 +355,55 @@ yacht_weights = { ("Category Fives", 3, 2): {0: 33466, 5: 44227, 10: 22307}, ("Category Fives", 3, 3): {0: 19231, 5: 42483, 10: 38286}, ("Category Fives", 3, 4): {0: 11196, 5: 36192, 10: 38673, 15: 13939}, - ("Category Fives", 3, 5): {0: 6561, 10: 72177, 15: 21262}, - ("Category Fives", 3, 6): {0: 3719, 10: 66792, 15: 29489}, - ("Category Fives", 3, 7): {0: 2099, 10: 60283, 15: 37618}, - ("Category Fives", 3, 8): {0: 1281, 10: 53409, 15: 45310}, + ("Category Fives", 3, 5): {0: 6561, 5: 29163, 10: 43014, 15: 21262}, + ("Category Fives", 3, 6): {0: 3719, 5: 22181, 10: 44611, 15: 29489}, + ("Category Fives", 3, 7): {0: 2099, 5: 16817, 10: 43466, 15: 37618}, + ("Category Fives", 3, 8): {0: 1281, 5: 12473, 10: 40936, 15: 45310}, ("Category Fives", 4, 0): {0: 100000}, ("Category Fives", 4, 1): {0: 48377, 5: 38345, 10: 13278}, - ("Category Fives", 4, 2): {0: 23126, 5: 40940, 15: 35934}, + ("Category Fives", 4, 2): {0: 23126, 5: 40940, 10: 35934}, ("Category Fives", 4, 3): {0: 11192, 5: 32597, 10: 35753, 15: 20458}, - ("Category Fives", 4, 4): {0: 5362, 10: 60452, 20: 34186}, - ("Category Fives", 4, 5): {0: 2655, 10: 50264, 15: 34186, 20: 12895}, - ("Category Fives", 4, 6): {0: 1291, 10: 39792, 15: 39417, 20: 19500}, - ("Category Fives", 4, 7): {0: 6854, 15: 66139, 20: 27007}, - ("Category Fives", 4, 8): {0: 4150, 15: 61121, 20: 34729}, + ("Category Fives", 4, 4): {0: 5362, 5: 23073, 10: 37379, 15: 34186}, + ("Category Fives", 4, 5): {0: 2655, 5: 15662, 10: 34602, 15: 34186, 20: 12895}, + ("Category Fives", 4, 6): {0: 2059, 10: 19678, 15: 48376, 20: 29887}, + ("Category Fives", 4, 7): {0: 1473, 15: 34402, 20: 64125}, + ("Category Fives", 4, 8): {0: 551, 20: 99449}, ("Category Fives", 5, 0): {0: 100000}, ("Category Fives", 5, 1): {0: 39911, 5: 40561, 10: 19528}, ("Category Fives", 5, 2): {0: 16178, 5: 35517, 10: 31246, 15: 17059}, - ("Category Fives", 5, 3): {0: 6526, 10: 58146, 20: 35328}, - ("Category Fives", 5, 4): {0: 2615, 10: 44108, 15: 32247, 20: 21030}, - ("Category Fives", 5, 5): {0: 1063, 10: 31079, 15: 34489, 25: 33369}, - ("Category Fives", 5, 6): {0: 4520, 15: 49551, 20: 32891, 25: 13038}, - ("Category Fives", 5, 7): {0: 2370, 15: 40714, 20: 37778, 25: 19138}, - ("Category Fives", 5, 8): {0: 1179, 15: 31909, 20: 40615, 25: 26297}, + ("Category Fives", 5, 3): {0: 6526, 5: 23716, 10: 34430, 15: 35328}, + ("Category Fives", 5, 4): {0: 2615, 5: 13975, 10: 30133, 15: 32247, 20: 21030}, + ("Category Fives", 5, 5): {0: 1482, 10: 13532, 15: 37597, 20: 47389}, + ("Category Fives", 5, 6): {0: 477, 15: 14484, 20: 71985, 25: 13054}, + ("Category Fives", 5, 7): {0: 273, 20: 52865, 25: 46862}, + ("Category Fives", 5, 8): {20: 16822, 25: 83178}, ("Category Fives", 6, 0): {0: 100000}, ("Category Fives", 6, 1): {0: 33476, 5: 40167, 10: 26357}, - ("Category Fives", 6, 2): {0: 11322, 10: 62277, 20: 26401}, - ("Category Fives", 6, 3): {0: 3765, 10: 46058, 20: 50177}, - ("Category Fives", 6, 4): {0: 1201, 15: 60973, 25: 37826}, - ("Category Fives", 6, 5): {0: 4307, 15: 41966, 20: 30800, 25: 22927}, - ("Category Fives", 6, 6): {0: 1827, 15: 30580, 20: 32744, 30: 34849}, - ("Category Fives", 6, 7): {0: 5496, 20: 47569, 25: 32784, 30: 14151}, - ("Category Fives", 6, 8): {0: 2920, 20: 39283, 25: 37178, 30: 20619}, + ("Category Fives", 6, 2): {0: 11322, 5: 29613, 10: 32664, 15: 26401}, + ("Category Fives", 6, 3): {0: 3765, 5: 16288, 10: 29770, 15: 29233, 20: 20944}, + ("Category Fives", 6, 4): {0: 1889, 10: 13525, 15: 33731, 20: 38179, 25: 12676}, + ("Category Fives", 6, 5): {0: 53, 10: 11118, 20: 47588, 25: 41241}, + ("Category Fives", 6, 6): {0: 10, 20: 8876, 25: 91114}, + ("Category Fives", 6, 7): {0: 7, 25: 85815, 30: 14178}, + ("Category Fives", 6, 8): {25: 43072, 30: 56928}, ("Category Fives", 7, 0): {0: 100000}, - ("Category Fives", 7, 1): {0: 27826, 5: 39154, 15: 33020}, - ("Category Fives", 7, 2): {0: 7609, 10: 55915, 20: 36476}, - ("Category Fives", 7, 3): {0: 2262, 10: 35456, 20: 62282}, - ("Category Fives", 7, 4): {0: 5201, 15: 40920, 25: 53879}, - ("Category Fives", 7, 5): {0: 1890, 20: 56509, 30: 41601}, - ("Category Fives", 7, 6): {0: 4506, 20: 38614, 25: 30456, 30: 26424}, - ("Category Fives", 7, 7): {0: 2107, 25: 60445, 35: 37448}, - ("Category Fives", 7, 8): {0: 5627, 25: 45590, 30: 33015, 35: 15768}, + ("Category Fives", 7, 1): {0: 27826, 5: 39154, 10: 33020}, + ("Category Fives", 7, 2): {0: 7609, 5: 24193, 10: 31722, 15: 23214, 20: 13262}, + ("Category Fives", 7, 3): {0: 1879, 15: 23021, 20: 75100}, + ("Category Fives", 7, 4): {0: 345, 20: 64636, 25: 35019}, + ("Category Fives", 7, 5): {0: 40, 20: 7522, 25: 76792, 30: 15646}, + ("Category Fives", 7, 6): {0: 8, 25: 26517, 30: 73475}, + ("Category Fives", 7, 7): {0: 2, 30: 99998}, + ("Category Fives", 7, 8): {30: 84211, 35: 15789}, ("Category Fives", 8, 0): {0: 100000}, - ("Category Fives", 8, 1): {0: 23333, 5: 37259, 15: 39408}, - ("Category Fives", 8, 2): {0: 5425, 10: 48295, 20: 46280}, - ("Category Fives", 8, 3): {0: 1258, 15: 53475, 25: 45267}, - ("Category Fives", 8, 4): {0: 2752, 20: 56808, 30: 40440}, - ("Category Fives", 8, 5): {0: 5203, 20: 35571, 30: 59226}, - ("Category Fives", 8, 6): {0: 1970, 25: 51621, 35: 46409}, - ("Category Fives", 8, 7): {0: 4281, 25: 35146, 30: 30426, 40: 30147}, - ("Category Fives", 8, 8): {0: 2040, 30: 56946, 40: 41014}, + ("Category Fives", 8, 1): {0: 23333, 5: 37259, 10: 25947, 15: 13461}, + ("Category Fives", 8, 2): {0: 5425, 5: 18915, 10: 29380, 15: 25994, 20: 20286}, + ("Category Fives", 8, 3): {0: 495, 20: 78726, 25: 20779}, + ("Category Fives", 8, 4): {20: 12998, 25: 70085, 30: 16917}, + ("Category Fives", 8, 5): {25: 15859, 30: 84141}, + ("Category Fives", 8, 6): {30: 80722, 35: 19278}, + ("Category Fives", 8, 7): {30: 23955, 35: 76045}, + ("Category Fives", 8, 8): {35: 100000}, ("Category Sixes", 0, 0): {0: 100000}, ("Category Sixes", 0, 1): {0: 100000}, ("Category Sixes", 0, 2): {0: 100000}, @@ -445,54 +437,54 @@ yacht_weights = { ("Category Sixes", 3, 3): {0: 19366, 6: 42246, 12: 38388}, ("Category Sixes", 3, 4): {0: 11144, 6: 36281, 12: 38817, 18: 13758}, ("Category Sixes", 3, 5): {0: 6414, 6: 28891, 12: 43114, 18: 21581}, - ("Category Sixes", 3, 6): {0: 3870, 12: 66712, 18: 29418}, - ("Category Sixes", 3, 7): {0: 2188, 12: 60290, 18: 37522}, - ("Category Sixes", 3, 8): {0: 1289, 12: 53503, 18: 45208}, + ("Category Sixes", 3, 6): {0: 3870, 6: 22394, 12: 44318, 18: 29418}, + ("Category Sixes", 3, 7): {0: 2188, 6: 16803, 12: 43487, 18: 37522}, + ("Category Sixes", 3, 8): {0: 1289, 6: 12421, 12: 41082, 18: 45208}, ("Category Sixes", 4, 0): {0: 100000}, ("Category Sixes", 4, 1): {0: 48197, 6: 38521, 12: 13282}, ("Category Sixes", 4, 2): {0: 23155, 6: 41179, 12: 35666}, ("Category Sixes", 4, 3): {0: 11256, 6: 32609, 12: 35588, 18: 20547}, - ("Category Sixes", 4, 4): {0: 5324, 12: 60474, 18: 34202}, - ("Category Sixes", 4, 5): {0: 2658, 12: 50173, 18: 34476, 24: 12693}, - ("Category Sixes", 4, 6): {0: 1282, 12: 39852, 18: 39379, 24: 19487}, - ("Category Sixes", 4, 7): {0: 588, 12: 30598, 18: 41935, 24: 26879}, - ("Category Sixes", 4, 8): {0: 4180, 18: 61222, 24: 34598}, + ("Category Sixes", 4, 4): {0: 5324, 6: 23265, 12: 37209, 18: 34202}, + ("Category Sixes", 4, 5): {0: 2658, 6: 15488, 12: 34685, 18: 34476, 24: 12693}, + ("Category Sixes", 4, 6): {0: 2045, 12: 19683, 18: 48559, 24: 29713}, + ("Category Sixes", 4, 7): {0: 1470, 18: 34646, 24: 63884}, + ("Category Sixes", 4, 8): {0: 22, 18: 12111, 24: 87867}, ("Category Sixes", 5, 0): {0: 100000}, ("Category Sixes", 5, 1): {0: 40393, 6: 39904, 12: 19703}, ("Category Sixes", 5, 2): {0: 16202, 6: 35664, 12: 31241, 18: 16893}, - ("Category Sixes", 5, 3): {0: 6456, 12: 58124, 18: 25020, 24: 10400}, - ("Category Sixes", 5, 4): {0: 2581, 12: 44335, 18: 32198, 24: 20886}, - ("Category Sixes", 5, 5): {0: 1119, 12: 30838, 18: 34716, 24: 33327}, - ("Category Sixes", 5, 6): {0: 4563, 18: 49516, 24: 32829, 30: 13092}, - ("Category Sixes", 5, 7): {0: 2315, 18: 40699, 24: 37560, 30: 19426}, - ("Category Sixes", 5, 8): {0: 1246, 18: 31964, 24: 40134, 30: 26656}, + ("Category Sixes", 5, 3): {0: 6456, 6: 23539, 12: 34585, 18: 25020, 24: 10400}, + ("Category Sixes", 5, 4): {0: 2581, 6: 13980, 12: 30355, 18: 32198, 24: 20886}, + ("Category Sixes", 5, 5): {0: 1472, 12: 13518, 18: 37752, 24: 47258}, + ("Category Sixes", 5, 6): {0: 476, 18: 14559, 24: 71856, 30: 13109}, + ("Category Sixes", 5, 7): {0: 275, 24: 52573, 30: 47152}, + ("Category Sixes", 5, 8): {24: 16500, 30: 83500}, ("Category Sixes", 6, 0): {0: 100000}, - ("Category Sixes", 6, 1): {0: 33316, 6: 40218, 18: 26466}, - ("Category Sixes", 6, 2): {0: 11256, 6: 29444, 12: 32590, 24: 26710}, - ("Category Sixes", 6, 3): {0: 3787, 12: 46139, 18: 29107, 24: 20967}, - ("Category Sixes", 6, 4): {0: 1286, 12: 29719, 18: 31264, 24: 25039, 30: 12692}, - ("Category Sixes", 6, 5): {0: 4190, 18: 41667, 24: 30919, 30: 23224}, - ("Category Sixes", 6, 6): {0: 1804, 18: 30702, 24: 32923, 30: 34571}, - ("Category Sixes", 6, 7): {0: 51, 24: 53324, 30: 32487, 36: 14138}, - ("Category Sixes", 6, 8): {0: 2886, 24: 39510, 30: 37212, 36: 20392}, + ("Category Sixes", 6, 1): {0: 33316, 6: 40218, 12: 26466}, + ("Category Sixes", 6, 2): {0: 11256, 6: 29444, 12: 32590, 18: 26710}, + ("Category Sixes", 6, 3): {0: 3787, 6: 16266, 12: 29873, 18: 29107, 24: 20967}, + ("Category Sixes", 6, 4): {0: 1875, 12: 13602, 18: 33731, 24: 38090, 30: 12702}, + ("Category Sixes", 6, 5): {0: 433, 18: 10665, 24: 47398, 30: 41504}, + ("Category Sixes", 6, 6): {0: 89, 24: 14905, 30: 85006}, + ("Category Sixes", 6, 7): {0: 19, 30: 85816, 36: 14165}, + ("Category Sixes", 6, 8): {30: 43219, 36: 56781}, ("Category Sixes", 7, 0): {0: 100000}, - ("Category Sixes", 7, 1): {0: 27852, 6: 38984, 18: 33164}, - ("Category Sixes", 7, 2): {0: 7883, 12: 55404, 24: 36713}, - ("Category Sixes", 7, 3): {0: 2186, 12: 35249, 18: 29650, 30: 32915}, - ("Category Sixes", 7, 4): {0: 5062, 18: 40976, 24: 28335, 36: 25627}, - ("Category Sixes", 7, 5): {0: 1947, 18: 27260, 24: 29254, 30: 25790, 36: 15749}, - ("Category Sixes", 7, 6): {0: 4568, 24: 38799, 30: 30698, 42: 25935}, - ("Category Sixes", 7, 7): {0: 2081, 24: 28590, 30: 31709, 36: 37620}, - ("Category Sixes", 7, 8): {0: 73, 30: 51135, 36: 33183, 42: 15609}, + ("Category Sixes", 7, 1): {0: 27852, 6: 38984, 12: 33164}, + ("Category Sixes", 7, 2): {0: 7883, 6: 23846, 12: 31558, 18: 23295, 24: 13418}, + ("Category Sixes", 7, 3): {0: 2186, 6: 10928, 12: 24321, 18: 29650, 24: 21177, 30: 11738}, + ("Category Sixes", 7, 4): {0: 1034, 18: 12857, 24: 37227, 30: 48882}, + ("Category Sixes", 7, 5): {0: 300, 30: 83887, 36: 15813}, + ("Category Sixes", 7, 6): {30: 31359, 36: 68641}, + ("Category Sixes", 7, 7): {36: 89879, 42: 10121}, + ("Category Sixes", 7, 8): {36: 49549, 42: 50451}, ("Category Sixes", 8, 0): {0: 100000}, ("Category Sixes", 8, 1): {0: 23220, 6: 37213, 12: 25961, 18: 13606}, - ("Category Sixes", 8, 2): {0: 5280, 12: 48607, 18: 25777, 30: 20336}, - ("Category Sixes", 8, 3): {0: 1246, 12: 25869, 18: 27277, 30: 45608}, - ("Category Sixes", 8, 4): {0: 2761, 18: 29831, 24: 27146, 36: 40262}, - ("Category Sixes", 8, 5): {0: 5100, 24: 35948, 30: 27655, 42: 31297}, - ("Category Sixes", 8, 6): {0: 2067, 30: 51586, 36: 27024, 42: 19323}, - ("Category Sixes", 8, 7): {0: 4269, 30: 35032, 36: 30772, 48: 29927}, - ("Category Sixes", 8, 8): {6: 2012, 30: 25871, 36: 31116, 42: 28870, 48: 12131}, + ("Category Sixes", 8, 2): {0: 5280, 6: 18943, 12: 29664, 18: 25777, 24: 20336}, + ("Category Sixes", 8, 3): {0: 2024, 12: 12586, 18: 28717, 24: 35860, 30: 20813}, + ("Category Sixes", 8, 4): {0: 175, 24: 10907, 30: 72017, 36: 16901}, + ("Category Sixes", 8, 5): {0: 1, 30: 23224, 36: 66215, 42: 10560}, + ("Category Sixes", 8, 6): {36: 29563, 42: 70437}, + ("Category Sixes", 8, 7): {42: 99990, 36: 10}, + ("Category Sixes", 8, 8): {42: 87843, 48: 12157}, ("Category Choice", 0, 0): {0: 100000}, ("Category Choice", 0, 1): {0: 100000}, ("Category Choice", 0, 2): {0: 100000}, @@ -503,77 +495,77 @@ yacht_weights = { ("Category Choice", 0, 7): {0: 100000}, ("Category Choice", 0, 8): {0: 100000}, ("Category Choice", 1, 0): {0: 100000}, - ("Category Choice", 1, 1): {1: 33315, 5: 66685}, - ("Category Choice", 1, 2): {1: 10921, 5: 89079}, - ("Category Choice", 1, 3): {1: 27995, 6: 72005}, - ("Category Choice", 1, 4): {1: 15490, 6: 84510}, - ("Category Choice", 1, 5): {1: 6390, 6: 93610}, - ("Category Choice", 1, 6): {1: 34656, 6: 65344}, - ("Category Choice", 1, 7): {1: 28829, 6: 71171}, - ("Category Choice", 1, 8): {1: 23996, 6: 76004}, + ("Category Choice", 1, 1): {1: 33315, 3: 66685}, + ("Category Choice", 1, 2): {1: 32981, 4: 67019}, + ("Category Choice", 1, 3): {1: 12312, 4: 25020, 5: 62668}, + ("Category Choice", 1, 4): {1: 11564, 5: 88436}, + ("Category Choice", 1, 5): {1: 2956, 5: 97044}, + ("Category Choice", 1, 6): {4: 1024, 6: 65357, 5: 33619}, + ("Category Choice", 1, 7): {6: 100000}, + ("Category Choice", 1, 8): {6: 100000}, ("Category Choice", 2, 0): {0: 100000}, - ("Category Choice", 2, 1): {2: 16796, 8: 83204}, - ("Category Choice", 2, 2): {2: 22212, 10: 77788}, - ("Category Choice", 2, 3): {2: 29002, 11: 70998}, - ("Category Choice", 2, 4): {2: 22485, 11: 77515}, - ("Category Choice", 2, 5): {2: 28019, 12: 71981}, - ("Category Choice", 2, 6): {2: 23193, 12: 76807}, - ("Category Choice", 2, 7): {2: 11255, 8: 38369, 12: 50376}, - ("Category Choice", 2, 8): {2: 9297, 12: 90703}, + ("Category Choice", 2, 1): {2: 27810, 6: 72190}, + ("Category Choice", 2, 2): {2: 10285, 6: 26698, 8: 63017}, + ("Category Choice", 2, 3): {2: 3965, 8: 96035}, + ("Category Choice", 2, 4): {2: 143, 8: 33731, 9: 66126}, + ("Category Choice", 2, 5): {8: 12687, 10: 62544, 9: 24769}, + ("Category Choice", 2, 6): {10: 100000}, + ("Category Choice", 2, 7): {11: 66194, 10: 33806}, + ("Category Choice", 2, 8): {11: 100000}, ("Category Choice", 3, 0): {0: 100000}, - ("Category Choice", 3, 1): {3: 25983, 12: 74017}, - ("Category Choice", 3, 2): {3: 24419, 14: 75581}, - ("Category Choice", 3, 3): {3: 24466, 15: 75534}, - ("Category Choice", 3, 4): {3: 25866, 16: 74134}, - ("Category Choice", 3, 5): {3: 30994, 17: 69006}, - ("Category Choice", 3, 6): {3: 13523, 13: 41606, 17: 44871}, - ("Category Choice", 3, 7): {3: 28667, 18: 71333}, - ("Category Choice", 3, 8): {3: 23852, 18: 76148}, + ("Category Choice", 3, 1): {3: 10461, 6: 27156, 10: 62383}, + ("Category Choice", 3, 2): {3: 3586, 6: 31281, 12: 65133}, + ("Category Choice", 3, 3): {3: 1491, 12: 33737, 13: 64772}, + ("Category Choice", 3, 4): {12: 13802, 14: 60820, 13: 25378}, + ("Category Choice", 3, 5): {14: 99999, 13: 1}, + ("Category Choice", 3, 6): {15: 64851, 14: 35149}, + ("Category Choice", 3, 7): {16: 62341, 15: 24422, 14: 13237}, + ("Category Choice", 3, 8): {16: 100000}, ("Category Choice", 4, 0): {0: 100000}, - ("Category Choice", 4, 1): {4: 1125, 7: 32443, 16: 66432}, - ("Category Choice", 4, 2): {4: 18156, 14: 39494, 18: 42350}, - ("Category Choice", 4, 3): {4: 538, 9: 32084, 20: 67378}, - ("Category Choice", 4, 4): {4: 30873, 21: 69127}, - ("Category Choice", 4, 5): {4: 31056, 22: 68944}, - ("Category Choice", 4, 6): {4: 22939, 19: 43956, 23: 33105}, - ("Category Choice", 4, 7): {5: 16935, 19: 41836, 23: 41229}, - ("Category Choice", 4, 8): {5: 31948, 24: 68052}, + ("Category Choice", 4, 1): {4: 4748, 10: 28815, 13: 66437}, + ("Category Choice", 4, 2): {12: 12006, 16: 64226, 13: 23768}, + ("Category Choice", 4, 3): {16: 32567, 17: 67433}, + ("Category Choice", 4, 4): {16: 30845, 18: 69155}, + ("Category Choice", 4, 5): {16: 9568, 19: 68981, 18: 21451}, + ("Category Choice", 4, 6): {18: 10841, 20: 65051, 19: 24108}, + ("Category Choice", 4, 7): {18: 4198, 21: 61270, 20: 25195, 19: 9337}, + ("Category Choice", 4, 8): {21: 99999, 20: 1}, ("Category Choice", 5, 0): {0: 100000}, - ("Category Choice", 5, 1): {5: 21998, 15: 38001, 19: 40001}, - ("Category Choice", 5, 2): {5: 26627, 19: 38217, 23: 35156}, - ("Category Choice", 5, 3): {6: 22251, 24: 77749}, - ("Category Choice", 5, 4): {5: 27098, 22: 39632, 26: 33270}, - ("Category Choice", 5, 5): {6: 1166, 16: 32131, 27: 66703}, - ("Category Choice", 5, 6): {7: 1177, 17: 32221, 28: 66602}, - ("Category Choice", 5, 7): {8: 25048, 25: 42590, 29: 32362}, - ("Category Choice", 5, 8): {9: 18270, 25: 41089, 29: 40641}, + ("Category Choice", 5, 1): {5: 4485, 13: 35340, 17: 60175}, + ("Category Choice", 5, 2): {16: 35286, 20: 64714}, + ("Category Choice", 5, 3): {20: 39254, 22: 60746}, + ("Category Choice", 5, 4): {20: 35320, 23: 64680}, + ("Category Choice", 5, 5): {22: 33253, 24: 66747}, + ("Category Choice", 5, 6): {22: 11089, 25: 66653, 24: 22258}, + ("Category Choice", 5, 7): {24: 12216, 26: 63214, 22: 50, 25: 24520}, + ("Category Choice", 5, 8): {24: 4866, 27: 60314, 26: 25089, 25: 9731}, ("Category Choice", 6, 0): {0: 100000}, - ("Category Choice", 6, 1): {6: 27848, 23: 72152}, - ("Category Choice", 6, 2): {8: 27078, 27: 72922}, - ("Category Choice", 6, 3): {6: 27876, 29: 72124}, - ("Category Choice", 6, 4): {9: 30912, 31: 69088}, - ("Category Choice", 6, 5): {10: 27761, 28: 38016, 32: 34223}, - ("Category Choice", 6, 6): {13: 25547, 29: 39452, 33: 35001}, - ("Category Choice", 6, 7): {12: 767, 22: 32355, 34: 66878}, - ("Category Choice", 6, 8): {12: 25224, 31: 41692, 35: 33084}, + ("Category Choice", 6, 1): {6: 2276, 17: 33774, 20: 63950}, + ("Category Choice", 6, 2): {20: 34853, 24: 65147}, + ("Category Choice", 6, 3): {22: 12477, 26: 64201, 24: 23322}, + ("Category Choice", 6, 4): {24: 14073, 28: 60688, 26: 25239}, + ("Category Choice", 6, 5): {26: 35591, 29: 64409}, + ("Category Choice", 6, 6): {26: 33229, 30: 66771}, + ("Category Choice", 6, 7): {28: 33078, 31: 66922}, + ("Category Choice", 6, 8): {28: 12143, 31: 24567, 32: 63290}, ("Category Choice", 7, 0): {0: 100000}, - ("Category Choice", 7, 1): {7: 1237, 15: 32047, 27: 66716}, - ("Category Choice", 7, 2): {10: 27324, 31: 72676}, - ("Category Choice", 7, 3): {10: 759, 20: 32233, 34: 67008}, - ("Category Choice", 7, 4): {13: 26663, 35: 73337}, - ("Category Choice", 7, 5): {12: 29276, 37: 70724}, - ("Category Choice", 7, 6): {14: 26539, 38: 73461}, - ("Category Choice", 7, 7): {16: 24675, 35: 38365, 39: 36960}, - ("Category Choice", 7, 8): {14: 2, 19: 31688, 40: 68310}, + ("Category Choice", 7, 1): {7: 1558, 20: 31716, 23: 66726}, + ("Category Choice", 7, 2): {23: 34663, 28: 65337}, + ("Category Choice", 7, 3): {28: 32932, 30: 67062, 23: 6}, + ("Category Choice", 7, 4): {28: 11163, 32: 66108, 30: 22729}, + ("Category Choice", 7, 5): {30: 12528, 34: 63034, 32: 24438}, + ("Category Choice", 7, 6): {30: 4270, 35: 65916, 34: 21485, 32: 8329}, + ("Category Choice", 7, 7): {32: 4014, 36: 68134, 35: 21006, 34: 6846}, + ("Category Choice", 7, 8): {34: 3434, 37: 68373, 36: 21550, 35: 6643}, ("Category Choice", 8, 0): {0: 100000}, - ("Category Choice", 8, 1): {10: 23768, 25: 38280, 30: 37952}, - ("Category Choice", 8, 2): {11: 27666, 31: 38472, 36: 33862}, - ("Category Choice", 8, 3): {12: 24387, 33: 37477, 38: 38136}, - ("Category Choice", 8, 4): {16: 23316, 35: 38117, 40: 38567}, - ("Category Choice", 8, 5): {16: 30949, 42: 69051}, - ("Category Choice", 8, 6): {16: 26968, 43: 73032}, - ("Category Choice", 8, 7): {20: 24559, 44: 75441}, - ("Category Choice", 8, 8): {20: 1, 23: 22731, 41: 37835, 45: 39433}, + ("Category Choice", 8, 1): {10: 1400, 23: 36664, 27: 61936}, + ("Category Choice", 8, 2): {27: 34595, 32: 65405}, + ("Category Choice", 8, 3): {30: 13097, 35: 62142, 32: 24761}, + ("Category Choice", 8, 4): {35: 36672, 37: 63328}, + ("Category Choice", 8, 5): {39: 61292, 35: 14195, 37: 24513}, + ("Category Choice", 8, 6): {40: 65672, 39: 21040, 35: 4873, 37: 8415}, + ("Category Choice", 8, 7): {39: 13561, 42: 60493, 40: 25946}, + ("Category Choice", 8, 8): {39: 5250, 43: 61284, 42: 23421, 40: 10045}, ("Category Inverse Choice", 0, 0): {0: 100000}, ("Category Inverse Choice", 0, 1): {0: 100000}, ("Category Inverse Choice", 0, 2): {0: 100000}, @@ -584,77 +576,77 @@ yacht_weights = { ("Category Inverse Choice", 0, 7): {0: 100000}, ("Category Inverse Choice", 0, 8): {0: 100000}, ("Category Inverse Choice", 1, 0): {0: 100000}, - ("Category Inverse Choice", 1, 1): {1: 33315, 5: 66685}, - ("Category Inverse Choice", 1, 2): {1: 10921, 5: 89079}, - ("Category Inverse Choice", 1, 3): {1: 27995, 6: 72005}, - ("Category Inverse Choice", 1, 4): {1: 15490, 6: 84510}, - ("Category Inverse Choice", 1, 5): {1: 6390, 6: 93610}, - ("Category Inverse Choice", 1, 6): {1: 34656, 6: 65344}, - ("Category Inverse Choice", 1, 7): {1: 28829, 6: 71171}, - ("Category Inverse Choice", 1, 8): {1: 23996, 6: 76004}, + ("Category Inverse Choice", 1, 1): {1: 33315, 3: 66685}, + ("Category Inverse Choice", 1, 2): {1: 32981, 4: 67019}, + ("Category Inverse Choice", 1, 3): {1: 12312, 4: 25020, 5: 62668}, + ("Category Inverse Choice", 1, 4): {1: 11564, 5: 88436}, + ("Category Inverse Choice", 1, 5): {1: 2956, 5: 97044}, + ("Category Inverse Choice", 1, 6): {4: 1024, 6: 65357, 5: 33619}, + ("Category Inverse Choice", 1, 7): {6: 100000}, + ("Category Inverse Choice", 1, 8): {6: 100000}, ("Category Inverse Choice", 2, 0): {0: 100000}, - ("Category Inverse Choice", 2, 1): {2: 16796, 8: 83204}, - ("Category Inverse Choice", 2, 2): {2: 22212, 10: 77788}, - ("Category Inverse Choice", 2, 3): {2: 29002, 11: 70998}, - ("Category Inverse Choice", 2, 4): {2: 22485, 11: 77515}, - ("Category Inverse Choice", 2, 5): {2: 28019, 12: 71981}, - ("Category Inverse Choice", 2, 6): {2: 23193, 12: 76807}, - ("Category Inverse Choice", 2, 7): {2: 11255, 8: 38369, 12: 50376}, - ("Category Inverse Choice", 2, 8): {2: 9297, 12: 90703}, + ("Category Inverse Choice", 2, 1): {2: 27810, 6: 72190}, + ("Category Inverse Choice", 2, 2): {2: 10285, 6: 26698, 8: 63017}, + ("Category Inverse Choice", 2, 3): {2: 3965, 8: 96035}, + ("Category Inverse Choice", 2, 4): {2: 143, 8: 33731, 9: 66126}, + ("Category Inverse Choice", 2, 5): {8: 12687, 10: 62544, 9: 24769}, + ("Category Inverse Choice", 2, 6): {10: 100000}, + ("Category Inverse Choice", 2, 7): {11: 66194, 10: 33806}, + ("Category Inverse Choice", 2, 8): {11: 100000}, ("Category Inverse Choice", 3, 0): {0: 100000}, - ("Category Inverse Choice", 3, 1): {3: 25983, 12: 74017}, - ("Category Inverse Choice", 3, 2): {3: 24419, 14: 75581}, - ("Category Inverse Choice", 3, 3): {3: 24466, 15: 75534}, - ("Category Inverse Choice", 3, 4): {3: 25866, 16: 74134}, - ("Category Inverse Choice", 3, 5): {3: 30994, 17: 69006}, - ("Category Inverse Choice", 3, 6): {3: 13523, 13: 41606, 17: 44871}, - ("Category Inverse Choice", 3, 7): {3: 28667, 18: 71333}, - ("Category Inverse Choice", 3, 8): {3: 23852, 18: 76148}, + ("Category Inverse Choice", 3, 1): {3: 10461, 6: 27156, 10: 62383}, + ("Category Inverse Choice", 3, 2): {3: 3586, 6: 31281, 12: 65133}, + ("Category Inverse Choice", 3, 3): {3: 1491, 12: 33737, 13: 64772}, + ("Category Inverse Choice", 3, 4): {12: 13802, 14: 60820, 13: 25378}, + ("Category Inverse Choice", 3, 5): {14: 99999, 13: 1}, + ("Category Inverse Choice", 3, 6): {15: 64851, 14: 35149}, + ("Category Inverse Choice", 3, 7): {16: 62341, 15: 24422, 14: 13237}, + ("Category Inverse Choice", 3, 8): {16: 100000}, ("Category Inverse Choice", 4, 0): {0: 100000}, - ("Category Inverse Choice", 4, 1): {4: 1125, 7: 32443, 16: 66432}, - ("Category Inverse Choice", 4, 2): {4: 18156, 14: 39494, 18: 42350}, - ("Category Inverse Choice", 4, 3): {4: 538, 9: 32084, 20: 67378}, - ("Category Inverse Choice", 4, 4): {4: 30873, 21: 69127}, - ("Category Inverse Choice", 4, 5): {4: 31056, 22: 68944}, - ("Category Inverse Choice", 4, 6): {4: 22939, 19: 43956, 23: 33105}, - ("Category Inverse Choice", 4, 7): {5: 16935, 19: 41836, 23: 41229}, - ("Category Inverse Choice", 4, 8): {5: 31948, 24: 68052}, + ("Category Inverse Choice", 4, 1): {4: 4748, 10: 28815, 13: 66437}, + ("Category Inverse Choice", 4, 2): {12: 12006, 16: 64226, 13: 23768}, + ("Category Inverse Choice", 4, 3): {16: 32567, 17: 67433}, + ("Category Inverse Choice", 4, 4): {16: 30845, 18: 69155}, + ("Category Inverse Choice", 4, 5): {16: 9568, 19: 68981, 18: 21451}, + ("Category Inverse Choice", 4, 6): {18: 10841, 20: 65051, 19: 24108}, + ("Category Inverse Choice", 4, 7): {18: 4198, 21: 61270, 20: 25195, 19: 9337}, + ("Category Inverse Choice", 4, 8): {21: 99999, 20: 1}, ("Category Inverse Choice", 5, 0): {0: 100000}, - ("Category Inverse Choice", 5, 1): {5: 21998, 15: 38001, 19: 40001}, - ("Category Inverse Choice", 5, 2): {5: 26627, 19: 38217, 23: 35156}, - ("Category Inverse Choice", 5, 3): {6: 22251, 24: 77749}, - ("Category Inverse Choice", 5, 4): {5: 27098, 22: 39632, 26: 33270}, - ("Category Inverse Choice", 5, 5): {6: 1166, 16: 32131, 27: 66703}, - ("Category Inverse Choice", 5, 6): {7: 1177, 17: 32221, 28: 66602}, - ("Category Inverse Choice", 5, 7): {8: 25048, 25: 42590, 29: 32362}, - ("Category Inverse Choice", 5, 8): {9: 18270, 25: 41089, 29: 40641}, + ("Category Inverse Choice", 5, 1): {5: 4485, 13: 35340, 17: 60175}, + ("Category Inverse Choice", 5, 2): {16: 35286, 20: 64714}, + ("Category Inverse Choice", 5, 3): {20: 39254, 22: 60746}, + ("Category Inverse Choice", 5, 4): {20: 35320, 23: 64680}, + ("Category Inverse Choice", 5, 5): {22: 33253, 24: 66747}, + ("Category Inverse Choice", 5, 6): {22: 11089, 25: 66653, 24: 22258}, + ("Category Inverse Choice", 5, 7): {24: 12216, 26: 63214, 22: 50, 25: 24520}, + ("Category Inverse Choice", 5, 8): {24: 4866, 27: 60314, 26: 25089, 25: 9731}, ("Category Inverse Choice", 6, 0): {0: 100000}, - ("Category Inverse Choice", 6, 1): {6: 27848, 23: 72152}, - ("Category Inverse Choice", 6, 2): {8: 27078, 27: 72922}, - ("Category Inverse Choice", 6, 3): {6: 27876, 29: 72124}, - ("Category Inverse Choice", 6, 4): {9: 30912, 31: 69088}, - ("Category Inverse Choice", 6, 5): {10: 27761, 28: 38016, 32: 34223}, - ("Category Inverse Choice", 6, 6): {13: 25547, 29: 39452, 33: 35001}, - ("Category Inverse Choice", 6, 7): {12: 767, 22: 32355, 34: 66878}, - ("Category Inverse Choice", 6, 8): {12: 25224, 31: 41692, 35: 33084}, + ("Category Inverse Choice", 6, 1): {6: 2276, 17: 33774, 20: 63950}, + ("Category Inverse Choice", 6, 2): {20: 34853, 24: 65147}, + ("Category Inverse Choice", 6, 3): {22: 12477, 26: 64201, 24: 23322}, + ("Category Inverse Choice", 6, 4): {24: 14073, 28: 60688, 26: 25239}, + ("Category Inverse Choice", 6, 5): {26: 35591, 29: 64409}, + ("Category Inverse Choice", 6, 6): {26: 33229, 30: 66771}, + ("Category Inverse Choice", 6, 7): {28: 33078, 31: 66922}, + ("Category Inverse Choice", 6, 8): {28: 12143, 31: 24567, 32: 63290}, ("Category Inverse Choice", 7, 0): {0: 100000}, - ("Category Inverse Choice", 7, 1): {7: 1237, 15: 32047, 27: 66716}, - ("Category Inverse Choice", 7, 2): {10: 27324, 31: 72676}, - ("Category Inverse Choice", 7, 3): {10: 759, 20: 32233, 34: 67008}, - ("Category Inverse Choice", 7, 4): {13: 26663, 35: 73337}, - ("Category Inverse Choice", 7, 5): {12: 29276, 37: 70724}, - ("Category Inverse Choice", 7, 6): {14: 26539, 38: 73461}, - ("Category Inverse Choice", 7, 7): {16: 24675, 35: 38365, 39: 36960}, - ("Category Inverse Choice", 7, 8): {14: 2, 19: 31688, 40: 68310}, + ("Category Inverse Choice", 7, 1): {7: 1558, 20: 31716, 23: 66726}, + ("Category Inverse Choice", 7, 2): {23: 34663, 28: 65337}, + ("Category Inverse Choice", 7, 3): {28: 32932, 30: 67062, 23: 6}, + ("Category Inverse Choice", 7, 4): {28: 11163, 32: 66108, 30: 22729}, + ("Category Inverse Choice", 7, 5): {30: 12528, 34: 63034, 32: 24438}, + ("Category Inverse Choice", 7, 6): {30: 4270, 35: 65916, 34: 21485, 32: 8329}, + ("Category Inverse Choice", 7, 7): {32: 4014, 36: 68134, 35: 21006, 34: 6846}, + ("Category Inverse Choice", 7, 8): {34: 3434, 37: 68373, 36: 21550, 35: 6643}, ("Category Inverse Choice", 8, 0): {0: 100000}, - ("Category Inverse Choice", 8, 1): {10: 23768, 25: 38280, 30: 37952}, - ("Category Inverse Choice", 8, 2): {11: 27666, 31: 38472, 36: 33862}, - ("Category Inverse Choice", 8, 3): {12: 24387, 33: 37477, 38: 38136}, - ("Category Inverse Choice", 8, 4): {16: 23316, 35: 38117, 40: 38567}, - ("Category Inverse Choice", 8, 5): {16: 30949, 42: 69051}, - ("Category Inverse Choice", 8, 6): {16: 26968, 43: 73032}, - ("Category Inverse Choice", 8, 7): {20: 24559, 44: 75441}, - ("Category Inverse Choice", 8, 8): {20: 1, 23: 22731, 41: 37835, 45: 39433}, + ("Category Inverse Choice", 8, 1): {10: 1400, 23: 36664, 27: 61936}, + ("Category Inverse Choice", 8, 2): {27: 34595, 32: 65405}, + ("Category Inverse Choice", 8, 3): {30: 13097, 35: 62142, 32: 24761}, + ("Category Inverse Choice", 8, 4): {35: 36672, 37: 63328}, + ("Category Inverse Choice", 8, 5): {39: 61292, 35: 14195, 37: 24513}, + ("Category Inverse Choice", 8, 6): {40: 65672, 39: 21040, 35: 4873, 37: 8415}, + ("Category Inverse Choice", 8, 7): {39: 13561, 42: 60493, 40: 25946}, + ("Category Inverse Choice", 8, 8): {39: 5250, 43: 61284, 42: 23421, 40: 10045}, ("Category Pair", 0, 0): {0: 100000}, ("Category Pair", 0, 1): {0: 100000}, ("Category Pair", 0, 2): {0: 100000}, @@ -1319,54 +1311,54 @@ yacht_weights = { ("Category Distincts", 2, 6): {1: 1, 2: 99999}, ("Category Distincts", 2, 7): {2: 100000}, ("Category Distincts", 2, 8): {2: 100000}, - ("Category Distincts", 3, 1): {1: 2760, 3: 97240}, - ("Category Distincts", 3, 2): {1: 15014, 3: 84986}, - ("Category Distincts", 3, 3): {1: 4866, 3: 95134}, - ("Category Distincts", 3, 4): {2: 1659, 3: 98341}, - ("Category Distincts", 3, 5): {2: 575, 3: 99425}, - ("Category Distincts", 3, 6): {2: 200, 3: 99800}, - ("Category Distincts", 3, 7): {2: 69, 3: 99931}, - ("Category Distincts", 3, 8): {2: 22, 3: 99978}, - ("Category Distincts", 4, 1): {1: 16634, 3: 83366}, - ("Category Distincts", 4, 2): {1: 1893, 4: 98107}, - ("Category Distincts", 4, 3): {2: 19861, 4: 80139}, - ("Category Distincts", 4, 4): {2: 9879, 4: 90121}, - ("Category Distincts", 4, 5): {2: 4906, 4: 95094}, - ("Category Distincts", 4, 6): {3: 2494, 4: 97506}, - ("Category Distincts", 4, 7): {3: 1297, 4: 98703}, - ("Category Distincts", 4, 8): {3: 611, 4: 99389}, - ("Category Distincts", 5, 1): {1: 5798, 4: 94202}, - ("Category Distincts", 5, 2): {2: 11843, 4: 88157}, - ("Category Distincts", 5, 3): {2: 3022, 5: 96978}, - ("Category Distincts", 5, 4): {3: 32354, 5: 67646}, - ("Category Distincts", 5, 5): {3: 21606, 5: 78394}, - ("Category Distincts", 5, 6): {3: 14525, 5: 85475}, - ("Category Distincts", 5, 7): {3: 9660, 5: 90340}, - ("Category Distincts", 5, 8): {3: 6463, 5: 93537}, - ("Category Distincts", 6, 1): {1: 25012, 4: 74988}, - ("Category Distincts", 6, 2): {2: 3299, 5: 96701}, - ("Category Distincts", 6, 3): {3: 17793, 5: 82207}, - ("Category Distincts", 6, 4): {3: 7831, 5: 92169}, - ("Category Distincts", 6, 5): {3: 3699, 6: 96301}, - ("Category Distincts", 6, 6): {4: 1557, 6: 98443}, - ("Category Distincts", 6, 7): {4: 728, 6: 99272}, - ("Category Distincts", 6, 8): {4: 321, 6: 99679}, - ("Category Distincts", 7, 1): {1: 13671, 5: 86329}, - ("Category Distincts", 7, 2): {2: 19686, 5: 80314}, - ("Category Distincts", 7, 3): {3: 6051, 6: 93949}, - ("Category Distincts", 7, 4): {3: 1796, 6: 98204}, - ("Category Distincts", 7, 5): {4: 28257, 6: 71743}, - ("Category Distincts", 7, 6): {4: 19581, 6: 80419}, - ("Category Distincts", 7, 7): {4: 13618, 6: 86382}, - ("Category Distincts", 7, 8): {4: 9545, 6: 90455}, - ("Category Distincts", 8, 1): {1: 7137, 5: 92863}, - ("Category Distincts", 8, 2): {2: 9414, 6: 90586}, - ("Category Distincts", 8, 3): {3: 1976, 6: 98024}, - ("Category Distincts", 8, 4): {4: 21397, 6: 78603}, - ("Category Distincts", 8, 5): {4: 12592, 6: 87408}, - ("Category Distincts", 8, 6): {4: 7177, 6: 92823}, - ("Category Distincts", 8, 7): {4: 4179, 6: 95821}, - ("Category Distincts", 8, 8): {5: 2440, 6: 97560}, + ("Category Distincts", 3, 1): {1: 2760, 2: 97240}, + ("Category Distincts", 3, 2): {1: 414, 3: 84996, 2: 14590}, + ("Category Distincts", 3, 3): {1: 109, 3: 99891}, + ("Category Distincts", 3, 4): {2: 11, 3: 99989}, + ("Category Distincts", 3, 5): {3: 100000}, + ("Category Distincts", 3, 6): {3: 100000}, + ("Category Distincts", 3, 7): {3: 100000}, + ("Category Distincts", 3, 8): {3: 100000}, + ("Category Distincts", 4, 1): {1: 458, 3: 83376, 2: 16166}, + ("Category Distincts", 4, 2): {1: 26, 4: 61232, 3: 37802, 2: 940}, + ("Category Distincts", 4, 3): {2: 3, 4: 97020, 3: 2977}, + ("Category Distincts", 4, 4): {4: 100000}, + ("Category Distincts", 4, 5): {4: 100000}, + ("Category Distincts", 4, 6): {4: 100000}, + ("Category Distincts", 4, 7): {4: 100000}, + ("Category Distincts", 4, 8): {4: 100000}, + ("Category Distincts", 5, 1): {1: 159, 3: 99841}, + ("Category Distincts", 5, 2): {2: 18, 4: 88167, 3: 11815}, + ("Category Distincts", 5, 3): {4: 100000}, + ("Category Distincts", 5, 4): {5: 67650, 4: 32350}, + ("Category Distincts", 5, 5): {5: 100000}, + ("Category Distincts", 5, 6): {5: 100000}, + ("Category Distincts", 5, 7): {5: 100000}, + ("Category Distincts", 5, 8): {5: 100000}, + ("Category Distincts", 6, 1): {1: 39, 4: 74998, 3: 24963}, + ("Category Distincts", 6, 2): {2: 1, 5: 61568, 4: 37296, 3: 1135}, + ("Category Distincts", 6, 3): {5: 93157, 4: 6843}, + ("Category Distincts", 6, 4): {5: 100000}, + ("Category Distincts", 6, 5): {5: 100000}, + ("Category Distincts", 6, 6): {5: 100000}, + ("Category Distincts", 6, 7): {5: 100000}, + ("Category Distincts", 6, 8): {6: 65828, 5: 34172}, + ("Category Distincts", 7, 1): {1: 13, 4: 99987}, + ("Category Distincts", 7, 2): {5: 99580, 4: 420}, + ("Category Distincts", 7, 3): {5: 100000}, + ("Category Distincts", 7, 4): {5: 100000}, + ("Category Distincts", 7, 5): {6: 71744, 5: 28256}, + ("Category Distincts", 7, 6): {6: 100000}, + ("Category Distincts", 7, 7): {6: 100000}, + ("Category Distincts", 7, 8): {6: 100000}, + ("Category Distincts", 8, 1): {4: 100000}, + ("Category Distincts", 8, 2): {5: 99981, 4: 19}, + ("Category Distincts", 8, 3): {6: 63291, 5: 36709}, + ("Category Distincts", 8, 4): {6: 99994, 5: 6}, + ("Category Distincts", 8, 5): {6: 100000}, + ("Category Distincts", 8, 6): {6: 100000}, + ("Category Distincts", 8, 7): {6: 100000}, + ("Category Distincts", 8, 8): {6: 100000}, ("Category Two times Ones", 0, 0): {0: 100000}, ("Category Two times Ones", 0, 1): {0: 100000}, ("Category Two times Ones", 0, 2): {0: 100000}, @@ -1378,7 +1370,7 @@ yacht_weights = { ("Category Two times Ones", 0, 8): {0: 100000}, ("Category Two times Ones", 1, 0): {0: 100000}, ("Category Two times Ones", 1, 1): {0: 100000}, - ("Category Two times Ones", 1, 2): {0: 100000}, + ("Category Two times Ones", 1, 2): {0: 69690, 2: 30310}, ("Category Two times Ones", 1, 3): {0: 57818, 2: 42182}, ("Category Two times Ones", 1, 4): {0: 48418, 2: 51582}, ("Category Two times Ones", 1, 5): {0: 40301, 2: 59699}, @@ -1386,68 +1378,68 @@ yacht_weights = { ("Category Two times Ones", 1, 7): {0: 28182, 2: 71818}, ("Category Two times Ones", 1, 8): {0: 23406, 2: 76594}, ("Category Two times Ones", 2, 0): {0: 100000}, - ("Category Two times Ones", 2, 1): {0: 100000}, + ("Category Two times Ones", 2, 1): {0: 69724, 2: 30276}, ("Category Two times Ones", 2, 2): {0: 48238, 2: 51762}, - ("Category Two times Ones", 2, 3): {0: 33290, 4: 66710}, - ("Category Two times Ones", 2, 4): {0: 23136, 4: 76864}, - ("Category Two times Ones", 2, 5): {0: 16146, 4: 83854}, - ("Category Two times Ones", 2, 6): {0: 11083, 4: 88917}, - ("Category Two times Ones", 2, 7): {0: 7662, 4: 92338}, - ("Category Two times Ones", 2, 8): {0: 5354, 4: 94646}, + ("Category Two times Ones", 2, 3): {0: 33290, 2: 66710}, + ("Category Two times Ones", 2, 4): {0: 23136, 2: 76864}, + ("Category Two times Ones", 2, 5): {0: 16146, 2: 48200, 4: 35654}, + ("Category Two times Ones", 2, 6): {0: 11083, 2: 44497, 4: 44420}, + ("Category Two times Ones", 2, 7): {0: 7662, 2: 40343, 4: 51995}, + ("Category Two times Ones", 2, 8): {0: 5354, 2: 35526, 4: 59120}, ("Category Two times Ones", 3, 0): {0: 100000}, ("Category Two times Ones", 3, 1): {0: 58021, 2: 41979}, - ("Category Two times Ones", 3, 2): {0: 33548, 4: 66452}, - ("Category Two times Ones", 3, 3): {0: 19375, 4: 80625}, - ("Category Two times Ones", 3, 4): {0: 10998, 4: 89002}, - ("Category Two times Ones", 3, 5): {0: 6519, 6: 93481}, - ("Category Two times Ones", 3, 6): {0: 3619, 6: 96381}, - ("Category Two times Ones", 3, 7): {0: 2195, 6: 97805}, - ("Category Two times Ones", 3, 8): {0: 13675, 6: 86325}, + ("Category Two times Ones", 3, 2): {0: 33548, 2: 66452}, + ("Category Two times Ones", 3, 3): {0: 19375, 2: 42372, 4: 38253}, + ("Category Two times Ones", 3, 4): {0: 10998, 2: 36435, 4: 52567}, + ("Category Two times Ones", 3, 5): {0: 7954, 4: 92046}, + ("Category Two times Ones", 3, 6): {0: 347, 4: 99653}, + ("Category Two times Ones", 3, 7): {0: 2, 4: 62851, 6: 37147}, + ("Category Two times Ones", 3, 8): {6: 99476, 4: 524}, ("Category Two times Ones", 4, 0): {0: 100000}, ("Category Two times Ones", 4, 1): {0: 48235, 2: 51765}, - ("Category Two times Ones", 4, 2): {0: 23289, 4: 76711}, - ("Category Two times Ones", 4, 3): {0: 11177, 6: 88823}, - ("Category Two times Ones", 4, 4): {0: 5499, 6: 94501}, - ("Category Two times Ones", 4, 5): {0: 18356, 6: 81644}, - ("Category Two times Ones", 4, 6): {0: 11169, 8: 88831}, - ("Category Two times Ones", 4, 7): {0: 6945, 8: 93055}, - ("Category Two times Ones", 4, 8): {0: 4091, 8: 95909}, + ("Category Two times Ones", 4, 2): {0: 23289, 2: 40678, 4: 36033}, + ("Category Two times Ones", 4, 3): {0: 11177, 2: 32677, 4: 56146}, + ("Category Two times Ones", 4, 4): {0: 5522, 4: 60436, 6: 34042}, + ("Category Two times Ones", 4, 5): {0: 4358, 6: 95642}, + ("Category Two times Ones", 4, 6): {0: 20, 6: 99980}, + ("Category Two times Ones", 4, 7): {6: 100000}, + ("Category Two times Ones", 4, 8): {6: 65250, 8: 34750}, ("Category Two times Ones", 5, 0): {0: 100000}, - ("Category Two times Ones", 5, 1): {0: 40028, 4: 59972}, - ("Category Two times Ones", 5, 2): {0: 16009, 6: 83991}, - ("Category Two times Ones", 5, 3): {0: 6489, 6: 93511}, - ("Category Two times Ones", 5, 4): {0: 16690, 8: 83310}, - ("Category Two times Ones", 5, 5): {0: 9016, 8: 90984}, - ("Category Two times Ones", 5, 6): {0: 4602, 8: 95398}, - ("Category Two times Ones", 5, 7): {0: 13627, 10: 86373}, - ("Category Two times Ones", 5, 8): {0: 8742, 10: 91258}, + ("Category Two times Ones", 5, 1): {0: 40028, 2: 59972}, + ("Category Two times Ones", 5, 2): {0: 16009, 2: 35901, 4: 48090}, + ("Category Two times Ones", 5, 3): {0: 6820, 4: 57489, 6: 35691}, + ("Category Two times Ones", 5, 4): {0: 5285, 6: 94715}, + ("Category Two times Ones", 5, 5): {0: 18, 6: 66613, 8: 33369}, + ("Category Two times Ones", 5, 6): {8: 99073, 6: 927}, + ("Category Two times Ones", 5, 7): {8: 100000}, + ("Category Two times Ones", 5, 8): {8: 100000}, ("Category Two times Ones", 6, 0): {0: 100000}, - ("Category Two times Ones", 6, 1): {0: 33502, 4: 66498}, - ("Category Two times Ones", 6, 2): {0: 11210, 6: 88790}, - ("Category Two times Ones", 6, 3): {0: 3673, 6: 96327}, - ("Category Two times Ones", 6, 4): {0: 9291, 8: 90709}, - ("Category Two times Ones", 6, 5): {0: 441, 8: 99559}, - ("Category Two times Ones", 6, 6): {0: 10255, 10: 89745}, - ("Category Two times Ones", 6, 7): {0: 5646, 10: 94354}, - ("Category Two times Ones", 6, 8): {0: 14287, 12: 85713}, + ("Category Two times Ones", 6, 1): {0: 33502, 2: 66498}, + ("Category Two times Ones", 6, 2): {0: 13681, 4: 59162, 2: 27157}, + ("Category Two times Ones", 6, 3): {0: 5486, 6: 94514}, + ("Category Two times Ones", 6, 4): {0: 190, 6: 62108, 8: 37702}, + ("Category Two times Ones", 6, 5): {8: 99882, 6: 118}, + ("Category Two times Ones", 6, 6): {8: 65144, 10: 34856}, + ("Category Two times Ones", 6, 7): {10: 99524, 8: 476}, + ("Category Two times Ones", 6, 8): {10: 100000}, ("Category Two times Ones", 7, 0): {0: 100000}, - ("Category Two times Ones", 7, 1): {0: 27683, 4: 72317}, - ("Category Two times Ones", 7, 2): {0: 7824, 6: 92176}, - ("Category Two times Ones", 7, 3): {0: 13167, 8: 86833}, - ("Category Two times Ones", 7, 4): {0: 564, 10: 99436}, - ("Category Two times Ones", 7, 5): {0: 9824, 10: 90176}, - ("Category Two times Ones", 7, 6): {0: 702, 12: 99298}, - ("Category Two times Ones", 7, 7): {0: 10186, 12: 89814}, - ("Category Two times Ones", 7, 8): {0: 942, 12: 99058}, + ("Category Two times Ones", 7, 1): {0: 27683, 2: 39060, 4: 33257}, + ("Category Two times Ones", 7, 2): {0: 8683, 4: 54932, 6: 36385}, + ("Category Two times Ones", 7, 3): {0: 373, 6: 66572, 8: 33055}, + ("Category Two times Ones", 7, 4): {8: 99816, 6: 184}, + ("Category Two times Ones", 7, 5): {8: 58124, 10: 41876}, + ("Category Two times Ones", 7, 6): {10: 99948, 8: 52}, + ("Category Two times Ones", 7, 7): {10: 62549, 12: 37451}, + ("Category Two times Ones", 7, 8): {12: 99818, 10: 182}, ("Category Two times Ones", 8, 0): {0: 100000}, - ("Category Two times Ones", 8, 1): {0: 23378, 4: 76622}, - ("Category Two times Ones", 8, 2): {0: 5420, 8: 94580}, - ("Category Two times Ones", 8, 3): {0: 8560, 10: 91440}, - ("Category Two times Ones", 8, 4): {0: 12199, 12: 87801}, - ("Category Two times Ones", 8, 5): {0: 879, 12: 99121}, - ("Category Two times Ones", 8, 6): {0: 9033, 14: 90967}, - ("Category Two times Ones", 8, 7): {0: 15767, 14: 84233}, - ("Category Two times Ones", 8, 8): {2: 9033, 14: 90967}, + ("Category Two times Ones", 8, 1): {0: 23378, 2: 37157, 4: 39465}, + ("Category Two times Ones", 8, 2): {0: 5602, 6: 94398}, + ("Category Two times Ones", 8, 3): {0: 8, 6: 10911, 8: 89081}, + ("Category Two times Ones", 8, 4): {8: 59809, 10: 40191}, + ("Category Two times Ones", 8, 5): {10: 68808, 12: 31114, 8: 78}, + ("Category Two times Ones", 8, 6): {12: 98712, 10: 1287, 8: 1}, + ("Category Two times Ones", 8, 7): {12: 100000}, + ("Category Two times Ones", 8, 8): {12: 59018, 14: 40982}, ("Category Half of Sixes", 0, 0): {0: 100000}, ("Category Half of Sixes", 0, 1): {0: 100000}, ("Category Half of Sixes", 0, 2): {0: 100000}, @@ -1469,386 +1461,386 @@ yacht_weights = { ("Category Half of Sixes", 2, 0): {0: 100000}, ("Category Half of Sixes", 2, 1): {0: 69419, 3: 30581}, ("Category Half of Sixes", 2, 2): {0: 48202, 3: 51798}, - ("Category Half of Sixes", 2, 3): {0: 33376, 6: 66624}, - ("Category Half of Sixes", 2, 4): {0: 23276, 6: 76724}, - ("Category Half of Sixes", 2, 5): {0: 16092, 6: 83908}, - ("Category Half of Sixes", 2, 6): {0: 11232, 6: 88768}, - ("Category Half of Sixes", 2, 7): {0: 7589, 6: 92411}, - ("Category Half of Sixes", 2, 8): {0: 5447, 6: 94553}, + ("Category Half of Sixes", 2, 3): {0: 33376, 3: 66624}, + ("Category Half of Sixes", 2, 4): {0: 23276, 3: 49810, 6: 26914}, + ("Category Half of Sixes", 2, 5): {0: 16092, 3: 47718, 6: 36190}, + ("Category Half of Sixes", 2, 6): {0: 11232, 3: 44515, 6: 44253}, + ("Category Half of Sixes", 2, 7): {0: 7589, 3: 40459, 6: 51952}, + ("Category Half of Sixes", 2, 8): {0: 5447, 3: 35804, 6: 58749}, ("Category Half of Sixes", 3, 0): {0: 100000}, ("Category Half of Sixes", 3, 1): {0: 57964, 3: 42036}, - ("Category Half of Sixes", 3, 2): {0: 33637, 6: 66363}, - ("Category Half of Sixes", 3, 3): {0: 19520, 6: 80480}, - ("Category Half of Sixes", 3, 4): {0: 11265, 6: 88735}, - ("Category Half of Sixes", 3, 5): {0: 6419, 6: 72177, 9: 21404}, - ("Category Half of Sixes", 3, 6): {0: 3810, 6: 66884, 9: 29306}, - ("Category Half of Sixes", 3, 7): {0: 2174, 6: 60595, 9: 37231}, - ("Category Half of Sixes", 3, 8): {0: 1237, 6: 53693, 9: 45070}, + ("Category Half of Sixes", 3, 2): {0: 33637, 3: 44263, 6: 22100}, + ("Category Half of Sixes", 3, 3): {0: 19520, 3: 42382, 6: 38098}, + ("Category Half of Sixes", 3, 4): {0: 11265, 3: 35772, 6: 52963}, + ("Category Half of Sixes", 3, 5): {0: 6419, 3: 28916, 6: 43261, 9: 21404}, + ("Category Half of Sixes", 3, 6): {0: 3810, 3: 22496, 6: 44388, 9: 29306}, + ("Category Half of Sixes", 3, 7): {0: 1317, 6: 30047, 9: 68636}, + ("Category Half of Sixes", 3, 8): {0: 750, 9: 99250}, ("Category Half of Sixes", 4, 0): {0: 100000}, - ("Category Half of Sixes", 4, 1): {0: 48121, 6: 51879}, - ("Category Half of Sixes", 4, 2): {0: 23296, 6: 76704}, - ("Category Half of Sixes", 4, 3): {0: 11233, 6: 68363, 9: 20404}, - ("Category Half of Sixes", 4, 4): {0: 5463, 6: 60738, 9: 33799}, - ("Category Half of Sixes", 4, 5): {0: 2691, 6: 50035, 12: 47274}, - ("Category Half of Sixes", 4, 6): {0: 11267, 9: 88733}, - ("Category Half of Sixes", 4, 7): {0: 6921, 9: 66034, 12: 27045}, - ("Category Half of Sixes", 4, 8): {0: 4185, 9: 61079, 12: 34736}, + ("Category Half of Sixes", 4, 1): {0: 48121, 3: 51879}, + ("Category Half of Sixes", 4, 2): {0: 23296, 3: 40989, 6: 35715}, + ("Category Half of Sixes", 4, 3): {0: 11233, 3: 32653, 6: 35710, 9: 20404}, + ("Category Half of Sixes", 4, 4): {0: 5463, 3: 23270, 6: 37468, 9: 33799}, + ("Category Half of Sixes", 4, 5): {0: 5225, 6: 29678, 9: 65097}, + ("Category Half of Sixes", 4, 6): {0: 3535, 9: 96465}, + ("Category Half of Sixes", 4, 7): {0: 6, 9: 72939, 12: 27055}, + ("Category Half of Sixes", 4, 8): {9: 25326, 12: 74674}, ("Category Half of Sixes", 5, 0): {0: 100000}, - ("Category Half of Sixes", 5, 1): {0: 40183, 6: 59817}, - ("Category Half of Sixes", 5, 2): {0: 16197, 6: 83803}, - ("Category Half of Sixes", 5, 3): {0: 6583, 6: 57826, 9: 35591}, - ("Category Half of Sixes", 5, 4): {0: 2636, 9: 76577, 12: 20787}, - ("Category Half of Sixes", 5, 5): {0: 8879, 9: 57821, 12: 33300}, - ("Category Half of Sixes", 5, 6): {0: 4652, 12: 95348}, - ("Category Half of Sixes", 5, 7): {0: 2365, 12: 97635}, - ("Category Half of Sixes", 5, 8): {0: 8671, 12: 64865, 15: 26464}, + ("Category Half of Sixes", 5, 1): {0: 40183, 3: 59817}, + ("Category Half of Sixes", 5, 2): {0: 16197, 3: 35494, 6: 48309}, + ("Category Half of Sixes", 5, 3): {0: 6583, 3: 23394, 6: 34432, 9: 35591}, + ("Category Half of Sixes", 5, 4): {0: 5007, 6: 25159, 9: 49038, 12: 20796}, + ("Category Half of Sixes", 5, 5): {0: 2900, 9: 38935, 12: 58165}, + ("Category Half of Sixes", 5, 6): {0: 2090, 12: 97910}, + ("Category Half of Sixes", 5, 7): {12: 99994, 9: 6}, + ("Category Half of Sixes", 5, 8): {12: 73524, 15: 26476}, ("Category Half of Sixes", 6, 0): {0: 100000}, - ("Category Half of Sixes", 6, 1): {0: 33473, 6: 66527}, - ("Category Half of Sixes", 6, 2): {0: 11147, 6: 62222, 9: 26631}, - ("Category Half of Sixes", 6, 3): {0: 3628, 9: 75348, 12: 21024}, - ("Category Half of Sixes", 6, 4): {0: 9498, 9: 52940, 15: 37562}, - ("Category Half of Sixes", 6, 5): {0: 4236, 12: 72944, 15: 22820}, - ("Category Half of Sixes", 6, 6): {0: 10168, 12: 55072, 15: 34760}, - ("Category Half of Sixes", 6, 7): {0: 5519, 15: 94481}, - ("Category Half of Sixes", 6, 8): {0: 2968, 15: 76504, 18: 20528}, + ("Category Half of Sixes", 6, 1): {0: 33473, 3: 40175, 6: 26352}, + ("Category Half of Sixes", 6, 2): {0: 11147, 3: 29592, 6: 32630, 9: 26631}, + ("Category Half of Sixes", 6, 3): {0: 2460, 6: 21148, 9: 55356, 12: 21036}, + ("Category Half of Sixes", 6, 4): {0: 997, 9: 29741, 12: 69262}, + ("Category Half of Sixes", 6, 5): {0: 831, 12: 76328, 15: 22841}, + ("Category Half of Sixes", 6, 6): {12: 29960, 15: 70040}, + ("Category Half of Sixes", 6, 7): {15: 100000}, + ("Category Half of Sixes", 6, 8): {15: 79456, 18: 20544}, ("Category Half of Sixes", 7, 0): {0: 100000}, - ("Category Half of Sixes", 7, 1): {0: 27933, 6: 72067}, - ("Category Half of Sixes", 7, 2): {0: 7794, 6: 55728, 12: 36478}, - ("Category Half of Sixes", 7, 3): {0: 2138, 9: 64554, 15: 33308}, - ("Category Half of Sixes", 7, 4): {0: 5238, 12: 69214, 15: 25548}, - ("Category Half of Sixes", 7, 5): {0: 9894, 15: 90106}, - ("Category Half of Sixes", 7, 6): {0: 4656, 15: 69353, 18: 25991}, - ("Category Half of Sixes", 7, 7): {0: 10005, 15: 52430, 18: 37565}, - ("Category Half of Sixes", 7, 8): {0: 5710, 18: 94290}, + ("Category Half of Sixes", 7, 1): {0: 27933, 3: 39105, 6: 32962}, + ("Category Half of Sixes", 7, 2): {0: 7794, 3: 23896, 6: 31832, 9: 36478}, + ("Category Half of Sixes", 7, 3): {0: 1321, 9: 40251, 12: 58428}, + ("Category Half of Sixes", 7, 4): {0: 370, 12: 74039, 15: 25591}, + ("Category Half of Sixes", 7, 5): {0: 6, 15: 98660, 12: 1334}, + ("Category Half of Sixes", 7, 6): {15: 73973, 18: 26027}, + ("Category Half of Sixes", 7, 7): {18: 100000}, + ("Category Half of Sixes", 7, 8): {18: 100000}, ("Category Half of Sixes", 8, 0): {0: 100000}, - ("Category Half of Sixes", 8, 1): {0: 23337, 6: 76663}, - ("Category Half of Sixes", 8, 2): {0: 5310, 9: 74178, 12: 20512}, - ("Category Half of Sixes", 8, 3): {0: 8656, 12: 70598, 15: 20746}, - ("Category Half of Sixes", 8, 4): {0: 291, 12: 59487, 18: 40222}, - ("Category Half of Sixes", 8, 5): {0: 5145, 15: 63787, 18: 31068}, - ("Category Half of Sixes", 8, 6): {0: 8804, 18: 91196}, - ("Category Half of Sixes", 8, 7): {0: 4347, 18: 65663, 21: 29990}, - ("Category Half of Sixes", 8, 8): {0: 9252, 21: 90748}, + ("Category Half of Sixes", 8, 1): {0: 23337, 3: 37232, 6: 39431}, + ("Category Half of Sixes", 8, 2): {0: 4652, 6: 29310, 9: 45517, 12: 20521}, + ("Category Half of Sixes", 8, 3): {0: 1300, 12: 77919, 15: 20781}, + ("Category Half of Sixes", 8, 4): {0: 21, 15: 98678, 12: 1301}, + ("Category Half of Sixes", 8, 5): {15: 68893, 18: 31107}, + ("Category Half of Sixes", 8, 6): {18: 100000}, + ("Category Half of Sixes", 8, 7): {18: 69986, 21: 30014}, + ("Category Half of Sixes", 8, 8): {21: 98839, 18: 1161}, ("Category Twos and Threes", 1, 1): {0: 66466, 2: 33534}, ("Category Twos and Threes", 1, 2): {0: 55640, 2: 44360}, - ("Category Twos and Threes", 1, 3): {0: 57822, 3: 42178}, - ("Category Twos and Threes", 1, 4): {0: 48170, 3: 51830}, - ("Category Twos and Threes", 1, 5): {0: 40294, 3: 59706}, - ("Category Twos and Threes", 1, 6): {0: 33417, 3: 66583}, - ("Category Twos and Threes", 1, 7): {0: 27852, 3: 72148}, - ("Category Twos and Threes", 1, 8): {0: 23364, 3: 76636}, - ("Category Twos and Threes", 2, 1): {0: 44565, 3: 55435}, - ("Category Twos and Threes", 2, 2): {0: 46335, 3: 53665}, - ("Category Twos and Threes", 2, 3): {0: 32347, 3: 67653}, - ("Category Twos and Threes", 2, 4): {0: 22424, 5: 77576}, - ("Category Twos and Threes", 2, 5): {0: 15661, 6: 84339}, - ("Category Twos and Threes", 2, 6): {0: 10775, 6: 89225}, - ("Category Twos and Threes", 2, 7): {0: 7375, 6: 92625}, - ("Category Twos and Threes", 2, 8): {0: 5212, 6: 94788}, - ("Category Twos and Threes", 3, 1): {0: 29892, 3: 70108}, - ("Category Twos and Threes", 3, 2): {0: 17285, 5: 82715}, - ("Category Twos and Threes", 3, 3): {0: 17436, 6: 82564}, - ("Category Twos and Threes", 3, 4): {0: 9962, 6: 90038}, - ("Category Twos and Threes", 3, 5): {0: 3347, 6: 96653}, - ("Category Twos and Threes", 3, 6): {0: 1821, 8: 98179}, - ("Category Twos and Threes", 3, 7): {0: 1082, 6: 61417, 9: 37501}, - ("Category Twos and Threes", 3, 8): {0: 13346, 9: 86654}, - ("Category Twos and Threes", 4, 1): {0: 19619, 5: 80381}, - ("Category Twos and Threes", 4, 2): {0: 18914, 6: 81086}, - ("Category Twos and Threes", 4, 3): {0: 4538, 5: 61859, 8: 33603}, - ("Category Twos and Threes", 4, 4): {0: 2183, 6: 62279, 9: 35538}, - ("Category Twos and Threes", 4, 5): {0: 16416, 9: 83584}, - ("Category Twos and Threes", 4, 6): {0: 6285, 9: 93715}, - ("Category Twos and Threes", 4, 7): {0: 30331, 11: 69669}, - ("Category Twos and Threes", 4, 8): {0: 22305, 12: 77695}, - ("Category Twos and Threes", 5, 1): {0: 13070, 5: 86930}, - ("Category Twos and Threes", 5, 2): {0: 5213, 5: 61441, 8: 33346}, - ("Category Twos and Threes", 5, 3): {0: 2126, 6: 58142, 9: 39732}, - ("Category Twos and Threes", 5, 4): {0: 848, 2: 30734, 11: 68418}, - ("Category Twos and Threes", 5, 5): {0: 29502, 12: 70498}, - ("Category Twos and Threes", 5, 6): {0: 123, 9: 52792, 12: 47085}, - ("Category Twos and Threes", 5, 7): {0: 8241, 12: 91759}, - ("Category Twos and Threes", 5, 8): {0: 13, 2: 31670, 14: 68317}, - ("Category Twos and Threes", 6, 1): {0: 22090, 6: 77910}, - ("Category Twos and Threes", 6, 2): {0: 2944, 6: 62394, 9: 34662}, - ("Category Twos and Threes", 6, 3): {0: 977, 2: 30626, 11: 68397}, - ("Category Twos and Threes", 6, 4): {0: 320, 8: 58370, 12: 41310}, - ("Category Twos and Threes", 6, 5): {0: 114, 2: 31718, 14: 68168}, - ("Category Twos and Threes", 6, 6): {0: 29669, 15: 70331}, - ("Category Twos and Threes", 6, 7): {0: 19855, 15: 80145}, - ("Category Twos and Threes", 6, 8): {0: 8524, 15: 91476}, - ("Category Twos and Threes", 7, 1): {0: 5802, 4: 54580, 7: 39618}, - ("Category Twos and Threes", 7, 2): {0: 1605, 6: 62574, 10: 35821}, - ("Category Twos and Threes", 7, 3): {0: 471, 8: 59691, 12: 39838}, - ("Category Twos and Threes", 7, 4): {0: 26620, 14: 73380}, - ("Category Twos and Threes", 7, 5): {0: 17308, 11: 37515, 15: 45177}, - ("Category Twos and Threes", 7, 6): {0: 30281, 17: 69719}, - ("Category Twos and Threes", 7, 7): {0: 28433, 18: 71567}, - ("Category Twos and Threes", 7, 8): {0: 13274, 18: 86726}, - ("Category Twos and Threes", 8, 1): {0: 3799, 5: 56614, 8: 39587}, - ("Category Twos and Threes", 8, 2): {0: 902, 7: 58003, 11: 41095}, - ("Category Twos and Threes", 8, 3): {0: 29391, 14: 70609}, - ("Category Twos and Threes", 8, 4): {0: 26041, 12: 40535, 16: 33424}, - ("Category Twos and Threes", 8, 5): {0: 26328, 14: 38760, 18: 34912}, - ("Category Twos and Threes", 8, 6): {0: 22646, 15: 45218, 19: 32136}, - ("Category Twos and Threes", 8, 7): {0: 25908, 20: 74092}, - ("Category Twos and Threes", 8, 8): {3: 18441, 17: 38826, 21: 42733}, - ("Category Sum of Odds", 1, 1): {0: 66572, 5: 33428}, - ("Category Sum of Odds", 1, 2): {0: 44489, 5: 55511}, - ("Category Sum of Odds", 1, 3): {0: 37185, 5: 62815}, - ("Category Sum of Odds", 1, 4): {0: 30917, 5: 69083}, - ("Category Sum of Odds", 1, 5): {0: 41833, 5: 58167}, - ("Category Sum of Odds", 1, 6): {0: 34902, 5: 65098}, - ("Category Sum of Odds", 1, 7): {0: 29031, 5: 70969}, - ("Category Sum of Odds", 1, 8): {0: 24051, 5: 75949}, - ("Category Sum of Odds", 2, 1): {0: 66460, 5: 33540}, - ("Category Sum of Odds", 2, 2): {0: 11216, 5: 65597, 8: 23187}, - ("Category Sum of Odds", 2, 3): {0: 30785, 8: 69215}, - ("Category Sum of Odds", 2, 4): {0: 21441, 10: 78559}, - ("Category Sum of Odds", 2, 5): {0: 14948, 10: 85052}, - ("Category Sum of Odds", 2, 6): {0: 4657, 3: 35569, 10: 59774}, - ("Category Sum of Odds", 2, 7): {0: 7262, 5: 42684, 10: 50054}, - ("Category Sum of Odds", 2, 8): {0: 4950, 5: 37432, 10: 57618}, - ("Category Sum of Odds", 3, 1): {0: 29203, 6: 70797}, - ("Category Sum of Odds", 3, 2): {0: 34454, 9: 65546}, - ("Category Sum of Odds", 3, 3): {0: 5022, 3: 32067, 8: 45663, 13: 17248}, - ("Category Sum of Odds", 3, 4): {0: 6138, 4: 33396, 13: 60466}, - ("Category Sum of Odds", 3, 5): {0: 29405, 15: 70595}, - ("Category Sum of Odds", 3, 6): {0: 21390, 15: 78610}, - ("Category Sum of Odds", 3, 7): {0: 8991, 8: 38279, 15: 52730}, - ("Category Sum of Odds", 3, 8): {0: 6340, 8: 34003, 15: 59657}, - ("Category Sum of Odds", 4, 1): {0: 28095, 4: 38198, 8: 33707}, - ("Category Sum of Odds", 4, 2): {0: 27003, 11: 72997}, - ("Category Sum of Odds", 4, 3): {0: 18712, 8: 40563, 13: 40725}, - ("Category Sum of Odds", 4, 4): {0: 30691, 15: 69309}, - ("Category Sum of Odds", 4, 5): {0: 433, 3: 32140, 13: 43150, 18: 24277}, - ("Category Sum of Odds", 4, 6): {0: 6549, 9: 32451, 15: 43220, 20: 17780}, - ("Category Sum of Odds", 4, 7): {0: 29215, 15: 45491, 20: 25294}, - ("Category Sum of Odds", 4, 8): {0: 11807, 13: 38927, 20: 49266}, - ("Category Sum of Odds", 5, 1): {0: 25139, 9: 74861}, - ("Category Sum of Odds", 5, 2): {0: 25110, 9: 40175, 14: 34715}, - ("Category Sum of Odds", 5, 3): {0: 23453, 11: 37756, 16: 38791}, - ("Category Sum of Odds", 5, 4): {0: 22993, 13: 37263, 18: 39744}, - ("Category Sum of Odds", 5, 5): {0: 25501, 15: 38407, 20: 36092}, - ("Category Sum of Odds", 5, 6): {0: 2542, 10: 32537, 18: 41122, 23: 23799}, - ("Category Sum of Odds", 5, 7): {0: 8228, 14: 32413, 20: 41289, 25: 18070}, - ("Category Sum of Odds", 5, 8): {0: 2, 2: 31173, 20: 43652, 25: 25173}, - ("Category Sum of Odds", 6, 1): {0: 23822, 6: 40166, 11: 36012}, - ("Category Sum of Odds", 6, 2): {0: 24182, 11: 37137, 16: 38681}, - ("Category Sum of Odds", 6, 3): {0: 27005, 14: 35759, 19: 37236}, - ("Category Sum of Odds", 6, 4): {0: 25133, 16: 35011, 21: 39856}, - ("Category Sum of Odds", 6, 5): {0: 24201, 18: 34934, 23: 40865}, - ("Category Sum of Odds", 6, 6): {0: 12978, 17: 32943, 23: 36836, 28: 17243}, - ("Category Sum of Odds", 6, 7): {0: 2314, 14: 32834, 23: 40134, 28: 24718}, - ("Category Sum of Odds", 6, 8): {0: 5464, 18: 34562, 25: 40735, 30: 19239}, - ("Category Sum of Odds", 7, 1): {0: 29329, 8: 37697, 13: 32974}, - ("Category Sum of Odds", 7, 2): {0: 29935, 14: 34878, 19: 35187}, - ("Category Sum of Odds", 7, 3): {0: 30638, 17: 33733, 22: 35629}, - ("Category Sum of Odds", 7, 4): {0: 163, 6: 32024, 20: 33870, 25: 33943}, - ("Category Sum of Odds", 7, 5): {0: 31200, 22: 35565, 27: 33235}, - ("Category Sum of Odds", 7, 6): {2: 30174, 24: 36670, 29: 33156}, - ("Category Sum of Odds", 7, 7): {4: 8712, 21: 35208, 28: 36799, 33: 19281}, - ("Category Sum of Odds", 7, 8): {0: 1447, 18: 32027, 28: 39941, 33: 26585}, - ("Category Sum of Odds", 8, 1): {0: 26931, 9: 35423, 14: 37646}, - ("Category Sum of Odds", 8, 2): {0: 29521, 16: 32919, 21: 37560}, - ("Category Sum of Odds", 8, 3): {0: 412, 7: 32219, 20: 32055, 25: 35314}, - ("Category Sum of Odds", 8, 4): {1: 27021, 22: 36376, 28: 36603}, - ("Category Sum of Odds", 8, 5): {1: 1069, 14: 32451, 26: 32884, 31: 33596}, - ("Category Sum of Odds", 8, 6): {4: 31598, 28: 33454, 33: 34948}, - ("Category Sum of Odds", 8, 7): {6: 27327, 29: 35647, 34: 37026}, - ("Category Sum of Odds", 8, 8): {4: 1, 26: 40489, 33: 37825, 38: 21685}, - ("Category Sum of Evens", 1, 1): {0: 49585, 6: 50415}, - ("Category Sum of Evens", 1, 2): {0: 44331, 6: 55669}, - ("Category Sum of Evens", 1, 3): {0: 29576, 6: 70424}, - ("Category Sum of Evens", 1, 4): {0: 24744, 6: 75256}, - ("Category Sum of Evens", 1, 5): {0: 20574, 6: 79426}, - ("Category Sum of Evens", 1, 6): {0: 17182, 6: 82818}, - ("Category Sum of Evens", 1, 7): {0: 14152, 6: 85848}, - ("Category Sum of Evens", 1, 8): {0: 8911, 6: 91089}, - ("Category Sum of Evens", 2, 1): {0: 25229, 8: 74771}, - ("Category Sum of Evens", 2, 2): {0: 18682, 6: 58078, 10: 23240}, - ("Category Sum of Evens", 2, 3): {0: 8099, 10: 91901}, - ("Category Sum of Evens", 2, 4): {0: 16906, 12: 83094}, - ("Category Sum of Evens", 2, 5): {0: 11901, 12: 88099}, - ("Category Sum of Evens", 2, 6): {0: 8054, 12: 91946}, - ("Category Sum of Evens", 2, 7): {0: 5695, 12: 94305}, - ("Category Sum of Evens", 2, 8): {0: 3950, 12: 96050}, - ("Category Sum of Evens", 3, 1): {0: 25054, 6: 51545, 10: 23401}, - ("Category Sum of Evens", 3, 2): {0: 17863, 10: 64652, 14: 17485}, - ("Category Sum of Evens", 3, 3): {0: 7748, 12: 75072, 16: 17180}, - ("Category Sum of Evens", 3, 4): {0: 1318, 12: 70339, 16: 28343}, - ("Category Sum of Evens", 3, 5): {0: 7680, 12: 53582, 18: 38738}, - ("Category Sum of Evens", 3, 6): {0: 1475, 12: 50152, 18: 48373}, - ("Category Sum of Evens", 3, 7): {0: 14328, 18: 85672}, - ("Category Sum of Evens", 3, 8): {0: 10001, 18: 89999}, - ("Category Sum of Evens", 4, 1): {0: 6214, 8: 67940, 12: 25846}, - ("Category Sum of Evens", 4, 2): {0: 16230, 12: 55675, 16: 28095}, - ("Category Sum of Evens", 4, 3): {0: 11069, 16: 70703, 20: 18228}, - ("Category Sum of Evens", 4, 4): {0: 13339, 20: 86661}, - ("Category Sum of Evens", 4, 5): {0: 8193, 18: 66423, 22: 25384}, - ("Category Sum of Evens", 4, 6): {0: 11127, 18: 53742, 22: 35131}, - ("Category Sum of Evens", 4, 7): {0: 7585, 18: 48073, 24: 44342}, - ("Category Sum of Evens", 4, 8): {0: 642, 18: 46588, 24: 52770}, - ("Category Sum of Evens", 5, 1): {0: 8373, 8: 50641, 16: 40986}, - ("Category Sum of Evens", 5, 2): {0: 7271, 12: 42254, 20: 50475}, - ("Category Sum of Evens", 5, 3): {0: 8350, 16: 44711, 24: 46939}, - ("Category Sum of Evens", 5, 4): {0: 8161, 18: 44426, 26: 47413}, - ("Category Sum of Evens", 5, 5): {0: 350, 8: 16033, 24: 67192, 28: 16425}, - ("Category Sum of Evens", 5, 6): {0: 10318, 24: 64804, 28: 24878}, - ("Category Sum of Evens", 5, 7): {0: 12783, 24: 52804, 28: 34413}, - ("Category Sum of Evens", 5, 8): {0: 1, 24: 56646, 30: 43353}, - ("Category Sum of Evens", 6, 1): {0: 10482, 10: 48137, 18: 41381}, - ("Category Sum of Evens", 6, 2): {0: 12446, 16: 43676, 24: 43878}, - ("Category Sum of Evens", 6, 3): {0: 11037, 20: 44249, 28: 44714}, - ("Category Sum of Evens", 6, 4): {0: 10005, 22: 42316, 30: 47679}, - ("Category Sum of Evens", 6, 5): {0: 9751, 24: 42204, 32: 48045}, - ("Category Sum of Evens", 6, 6): {0: 9692, 26: 45108, 34: 45200}, - ("Category Sum of Evens", 6, 7): {4: 1437, 26: 42351, 34: 56212}, - ("Category Sum of Evens", 6, 8): {4: 13017, 30: 51814, 36: 35169}, - ("Category Sum of Evens", 7, 1): {0: 12688, 12: 45275, 20: 42037}, - ("Category Sum of Evens", 7, 2): {0: 1433, 20: 60350, 28: 38217}, - ("Category Sum of Evens", 7, 3): {0: 13724, 24: 43514, 32: 42762}, - ("Category Sum of Evens", 7, 4): {0: 11285, 26: 40694, 34: 48021}, - ("Category Sum of Evens", 7, 5): {4: 5699, 28: 43740, 36: 50561}, - ("Category Sum of Evens", 7, 6): {4: 5478, 30: 43711, 38: 50811}, - ("Category Sum of Evens", 7, 7): {6: 9399, 32: 43251, 40: 47350}, - ("Category Sum of Evens", 7, 8): {10: 1490, 32: 40719, 40: 57791}, - ("Category Sum of Evens", 8, 1): {0: 14585, 14: 42804, 22: 42611}, - ("Category Sum of Evens", 8, 2): {0: 15891, 22: 39707, 30: 44402}, - ("Category Sum of Evens", 8, 3): {2: 297, 12: 16199, 28: 42274, 36: 41230}, - ("Category Sum of Evens", 8, 4): {0: 7625, 30: 43948, 38: 48427}, - ("Category Sum of Evens", 8, 5): {4: 413, 18: 16209, 34: 43301, 42: 40077}, - ("Category Sum of Evens", 8, 6): {6: 14927, 36: 43139, 44: 41934}, - ("Category Sum of Evens", 8, 7): {8: 5042, 36: 40440, 44: 54518}, - ("Category Sum of Evens", 8, 8): {10: 5005, 38: 44269, 46: 50726}, - ("Category Double Threes and Fours", 1, 1): {0: 66749, 8: 33251}, - ("Category Double Threes and Fours", 1, 2): {0: 44675, 8: 55325}, - ("Category Double Threes and Fours", 1, 3): {0: 29592, 8: 70408}, - ("Category Double Threes and Fours", 1, 4): {0: 24601, 8: 75399}, - ("Category Double Threes and Fours", 1, 5): {0: 20499, 8: 79501}, - ("Category Double Threes and Fours", 1, 6): {0: 17116, 8: 82884}, - ("Category Double Threes and Fours", 1, 7): {0: 14193, 8: 85807}, - ("Category Double Threes and Fours", 1, 8): {0: 11977, 8: 88023}, - ("Category Double Threes and Fours", 2, 1): {0: 44382, 8: 55618}, - ("Category Double Threes and Fours", 2, 2): {0: 19720, 8: 57236, 14: 23044}, - ("Category Double Threes and Fours", 2, 3): {0: 8765, 8: 41937, 14: 49298}, - ("Category Double Threes and Fours", 2, 4): {0: 6164, 16: 93836}, - ("Category Double Threes and Fours", 2, 5): {0: 4307, 8: 38682, 16: 57011}, - ("Category Double Threes and Fours", 2, 6): {0: 2879, 8: 32717, 16: 64404}, - ("Category Double Threes and Fours", 2, 7): {0: 6679, 16: 93321}, - ("Category Double Threes and Fours", 2, 8): {0: 4758, 16: 95242}, - ("Category Double Threes and Fours", 3, 1): {0: 29378, 8: 50024, 14: 20598}, - ("Category Double Threes and Fours", 3, 2): {0: 8894, 14: 74049, 18: 17057}, - ("Category Double Threes and Fours", 3, 3): {0: 2643, 14: 62555, 22: 34802}, - ("Category Double Threes and Fours", 3, 4): {0: 1523, 6: 19996, 16: 50281, 22: 28200}, - ("Category Double Threes and Fours", 3, 5): {0: 845, 16: 60496, 24: 38659}, - ("Category Double Threes and Fours", 3, 6): {0: 499, 16: 51131, 24: 48370}, - ("Category Double Threes and Fours", 3, 7): {0: 5542, 16: 37755, 24: 56703}, - ("Category Double Threes and Fours", 3, 8): {0: 3805, 16: 32611, 24: 63584}, - ("Category Double Threes and Fours", 4, 1): {0: 19809, 8: 39303, 16: 40888}, - ("Category Double Threes and Fours", 4, 2): {0: 3972, 16: 71506, 22: 24522}, - ("Category Double Threes and Fours", 4, 3): {0: 745, 18: 53727, 22: 28503, 28: 17025}, - ("Category Double Threes and Fours", 4, 4): {0: 4862, 16: 34879, 22: 33529, 28: 26730}, - ("Category Double Threes and Fours", 4, 5): {0: 2891, 16: 25367, 24: 46333, 30: 25409}, - ("Category Double Threes and Fours", 4, 6): {0: 2525, 24: 62353, 30: 35122}, - ("Category Double Threes and Fours", 4, 7): {0: 1042, 24: 54543, 32: 44415}, - ("Category Double Threes and Fours", 4, 8): {0: 2510, 24: 44681, 32: 52809}, - ("Category Double Threes and Fours", 5, 1): {0: 13122, 14: 68022, 20: 18856}, - ("Category Double Threes and Fours", 5, 2): {0: 1676, 14: 37791, 22: 40810, 28: 19723}, - ("Category Double Threes and Fours", 5, 3): {0: 2945, 16: 28193, 22: 26795, 32: 42067}, - ("Category Double Threes and Fours", 5, 4): {0: 2807, 26: 53419, 30: 26733, 36: 17041}, - ("Category Double Threes and Fours", 5, 5): {0: 3651, 24: 38726, 32: 41484, 38: 16139}, - ("Category Double Threes and Fours", 5, 6): {0: 362, 12: 13070, 32: 61608, 38: 24960}, - ("Category Double Threes and Fours", 5, 7): {0: 161, 12: 15894, 32: 49464, 38: 34481}, - ("Category Double Threes and Fours", 5, 8): {0: 82, 12: 11438, 32: 45426, 40: 43054}, - ("Category Double Threes and Fours", 6, 1): {0: 8738, 6: 26451, 16: 43879, 22: 20932}, - ("Category Double Threes and Fours", 6, 2): {0: 784, 16: 38661, 28: 42164, 32: 18391}, - ("Category Double Threes and Fours", 6, 3): {0: 1062, 22: 34053, 28: 27996, 38: 36889}, - ("Category Double Threes and Fours", 6, 4): {0: 439, 12: 13100, 30: 43296, 40: 43165}, - ("Category Double Threes and Fours", 6, 5): {0: 3957, 34: 51190, 38: 26734, 44: 18119}, - ("Category Double Threes and Fours", 6, 6): {0: 4226, 32: 37492, 40: 40719, 46: 17563}, - ("Category Double Threes and Fours", 6, 7): {0: 31, 12: 13933, 40: 60102, 46: 25934}, - ("Category Double Threes and Fours", 6, 8): {8: 388, 22: 16287, 40: 48255, 48: 35070}, - ("Category Double Threes and Fours", 7, 1): {0: 5803, 8: 28280, 14: 26186, 26: 39731}, - ("Category Double Threes and Fours", 7, 2): {0: 3319, 20: 36331, 30: 38564, 36: 21786}, - ("Category Double Threes and Fours", 7, 3): {0: 2666, 18: 16444, 34: 41412, 44: 39478}, - ("Category Double Threes and Fours", 7, 4): {0: 99, 12: 9496, 38: 50302, 46: 40103}, - ("Category Double Threes and Fours", 7, 5): {0: 45, 12: 13200, 42: 52460, 50: 34295}, - ("Category Double Threes and Fours", 7, 6): {8: 2400, 28: 16653, 46: 60564, 52: 20383}, - ("Category Double Threes and Fours", 7, 7): {6: 7, 12: 11561, 44: 44119, 54: 44313}, - ("Category Double Threes and Fours", 7, 8): {8: 4625, 44: 40601, 48: 26475, 54: 28299}, - ("Category Double Threes and Fours", 8, 1): {0: 3982, 16: 56447, 28: 39571}, - ("Category Double Threes and Fours", 8, 2): {0: 1645, 20: 25350, 30: 37385, 42: 35620}, - ("Category Double Threes and Fours", 8, 3): {0: 6, 26: 23380, 40: 40181, 50: 36433}, - ("Category Double Threes and Fours", 8, 4): {0: 541, 20: 16547, 42: 38406, 52: 44506}, - ("Category Double Threes and Fours", 8, 5): {6: 2956, 30: 16449, 46: 43983, 56: 36612}, - ("Category Double Threes and Fours", 8, 6): {0: 2, 12: 7360, 38: 19332, 54: 53627, 58: 19679}, - ("Category Double Threes and Fours", 8, 7): {6: 9699, 48: 38611, 54: 28390, 60: 23300}, - ("Category Double Threes and Fours", 8, 8): {8: 5, 20: 10535, 52: 41790, 62: 47670}, - ("Category Quadruple Ones and Twos", 1, 1): {0: 66567, 8: 33433}, - ("Category Quadruple Ones and Twos", 1, 2): {0: 44809, 8: 55191}, - ("Category Quadruple Ones and Twos", 1, 3): {0: 37100, 8: 62900}, - ("Category Quadruple Ones and Twos", 1, 4): {0: 30963, 8: 69037}, - ("Category Quadruple Ones and Twos", 1, 5): {0: 25316, 8: 74684}, - ("Category Quadruple Ones and Twos", 1, 6): {0: 21505, 8: 78495}, - ("Category Quadruple Ones and Twos", 1, 7): {0: 17676, 8: 82324}, - ("Category Quadruple Ones and Twos", 1, 8): {0: 14971, 8: 85029}, - ("Category Quadruple Ones and Twos", 2, 1): {0: 44566, 8: 55434}, - ("Category Quadruple Ones and Twos", 2, 2): {0: 19963, 8: 57152, 12: 22885}, - ("Category Quadruple Ones and Twos", 2, 3): {0: 13766, 8: 52065, 16: 34169}, - ("Category Quadruple Ones and Twos", 2, 4): {0: 9543, 8: 46446, 16: 44011}, - ("Category Quadruple Ones and Twos", 2, 5): {0: 6472, 8: 40772, 16: 52756}, - ("Category Quadruple Ones and Twos", 2, 6): {0: 10306, 12: 46932, 16: 42762}, - ("Category Quadruple Ones and Twos", 2, 7): {0: 7120, 12: 42245, 16: 50635}, - ("Category Quadruple Ones and Twos", 2, 8): {0: 4989, 12: 37745, 16: 57266}, - ("Category Quadruple Ones and Twos", 3, 1): {0: 29440, 8: 50321, 16: 20239}, - ("Category Quadruple Ones and Twos", 3, 2): {0: 8857, 8: 42729, 16: 48414}, - ("Category Quadruple Ones and Twos", 3, 3): {0: 5063, 12: 53387, 20: 41550}, - ("Category Quadruple Ones and Twos", 3, 4): {0: 8395, 16: 64605, 24: 27000}, - ("Category Quadruple Ones and Twos", 3, 5): {0: 4895, 16: 58660, 24: 36445}, - ("Category Quadruple Ones and Twos", 3, 6): {0: 2681, 16: 52710, 24: 44609}, - ("Category Quadruple Ones and Twos", 3, 7): {0: 586, 16: 46781, 24: 52633}, - ("Category Quadruple Ones and Twos", 3, 8): {0: 941, 16: 39406, 24: 59653}, - ("Category Quadruple Ones and Twos", 4, 1): {0: 19691, 8: 46945, 16: 33364}, - ("Category Quadruple Ones and Twos", 4, 2): {0: 4023, 12: 50885, 24: 45092}, - ("Category Quadruple Ones and Twos", 4, 3): {0: 6553, 16: 52095, 28: 41352}, - ("Category Quadruple Ones and Twos", 4, 4): {0: 3221, 16: 41367, 24: 39881, 28: 15531}, - ("Category Quadruple Ones and Twos", 4, 5): {0: 1561, 20: 48731, 28: 49708}, - ("Category Quadruple Ones and Twos", 4, 6): {0: 190, 20: 38723, 28: 42931, 32: 18156}, - ("Category Quadruple Ones and Twos", 4, 7): {0: 5419, 24: 53017, 32: 41564}, - ("Category Quadruple Ones and Twos", 4, 8): {0: 3135, 24: 47352, 32: 49513}, - ("Category Quadruple Ones and Twos", 5, 1): {0: 13112, 8: 41252, 20: 45636}, - ("Category Quadruple Ones and Twos", 5, 2): {0: 7293, 16: 50711, 28: 41996}, - ("Category Quadruple Ones and Twos", 5, 3): {0: 719, 20: 55921, 32: 43360}, - ("Category Quadruple Ones and Twos", 5, 4): {0: 1152, 20: 38570, 32: 60278}, - ("Category Quadruple Ones and Twos", 5, 5): {0: 5647, 24: 40910, 36: 53443}, - ("Category Quadruple Ones and Twos", 5, 6): {0: 194, 28: 51527, 40: 48279}, - ("Category Quadruple Ones and Twos", 5, 7): {0: 1449, 28: 39301, 36: 41332, 40: 17918}, - ("Category Quadruple Ones and Twos", 5, 8): {0: 6781, 32: 52834, 40: 40385}, - ("Category Quadruple Ones and Twos", 6, 1): {0: 8646, 12: 53753, 24: 37601}, - ("Category Quadruple Ones and Twos", 6, 2): {0: 844, 16: 40583, 28: 58573}, - ("Category Quadruple Ones and Twos", 6, 3): {0: 1241, 24: 54870, 36: 43889}, - ("Category Quadruple Ones and Twos", 6, 4): {0: 1745, 28: 53286, 40: 44969}, - ("Category Quadruple Ones and Twos", 6, 5): {0: 2076, 32: 56909, 44: 41015}, - ("Category Quadruple Ones and Twos", 6, 6): {0: 6827, 32: 39400, 44: 53773}, - ("Category Quadruple Ones and Twos", 6, 7): {0: 1386, 36: 49865, 48: 48749}, - ("Category Quadruple Ones and Twos", 6, 8): {0: 1841, 36: 38680, 44: 40600, 48: 18879}, - ("Category Quadruple Ones and Twos", 7, 1): {0: 5780, 12: 46454, 24: 47766}, - ("Category Quadruple Ones and Twos", 7, 2): {0: 6122, 20: 38600, 32: 55278}, - ("Category Quadruple Ones and Twos", 7, 3): {0: 2065, 28: 52735, 40: 45200}, - ("Category Quadruple Ones and Twos", 7, 4): {0: 1950, 32: 50270, 44: 47780}, - ("Category Quadruple Ones and Twos", 7, 5): {0: 2267, 36: 49235, 48: 48498}, - ("Category Quadruple Ones and Twos", 7, 6): {0: 2500, 40: 53934, 52: 43566}, - ("Category Quadruple Ones and Twos", 7, 7): {0: 6756, 44: 53730, 56: 39514}, - ("Category Quadruple Ones and Twos", 7, 8): {0: 3625, 44: 45159, 56: 51216}, - ("Category Quadruple Ones and Twos", 8, 1): {0: 11493, 16: 50043, 28: 38464}, - ("Category Quadruple Ones and Twos", 8, 2): {0: 136, 24: 47795, 36: 52069}, - ("Category Quadruple Ones and Twos", 8, 3): {0: 2744, 32: 51640, 48: 45616}, - ("Category Quadruple Ones and Twos", 8, 4): {0: 2293, 36: 45979, 48: 51728}, - ("Category Quadruple Ones and Twos", 8, 5): {0: 2181, 40: 44909, 52: 52910}, - ("Category Quadruple Ones and Twos", 8, 6): {4: 2266, 44: 44775, 56: 52959}, - ("Category Quadruple Ones and Twos", 8, 7): {8: 2344, 48: 50198, 60: 47458}, - ("Category Quadruple Ones and Twos", 8, 8): {8: 2808, 48: 37515, 56: 37775, 64: 21902}, + ("Category Twos and Threes", 1, 3): {0: 46223, 2: 53777}, + ("Category Twos and Threes", 1, 4): {0: 38552, 2: 61448}, + ("Category Twos and Threes", 1, 5): {0: 32320, 2: 67680}, + ("Category Twos and Threes", 1, 6): {0: 10797, 3: 66593, 2: 22610}, + ("Category Twos and Threes", 1, 7): {0: 9307, 3: 90693}, + ("Category Twos and Threes", 1, 8): {0: 2173, 3: 97827}, + ("Category Twos and Threes", 2, 1): {0: 44565, 2: 55435}, + ("Category Twos and Threes", 2, 2): {0: 30855, 2: 69145}, + ("Category Twos and Threes", 2, 3): {0: 9977, 3: 67663, 2: 22360}, + ("Category Twos and Threes", 2, 4): {0: 7252, 3: 92748}, + ("Category Twos and Threes", 2, 5): {0: 1135, 3: 98865}, + ("Category Twos and Threes", 2, 6): {0: 121, 3: 99879}, + ("Category Twos and Threes", 2, 7): {2: 48, 5: 60169, 3: 39783}, + ("Category Twos and Threes", 2, 8): {5: 99998, 3: 2}, + ("Category Twos and Threes", 3, 1): {0: 29892, 2: 70108}, + ("Category Twos and Threes", 3, 2): {0: 8977, 3: 69968, 2: 21055}, + ("Category Twos and Threes", 3, 3): {0: 5237, 3: 94763}, + ("Category Twos and Threes", 3, 4): {2: 1781, 5: 65980, 3: 32239}, + ("Category Twos and Threes", 3, 5): {2: 609, 6: 65803, 5: 22563, 3: 11025}, + ("Category Twos and Threes", 3, 6): {6: 100000}, + ("Category Twos and Threes", 3, 7): {6: 100000}, + ("Category Twos and Threes", 3, 8): {6: 100000}, + ("Category Twos and Threes", 4, 1): {0: 11769, 3: 60627, 2: 27604}, + ("Category Twos and Threes", 4, 2): {2: 15639, 4: 60280, 3: 24081}, + ("Category Twos and Threes", 4, 3): {5: 72517, 2: 4298, 4: 16567, 3: 6618}, + ("Category Twos and Threes", 4, 4): {6: 73910, 5: 18921, 2: 1121, 4: 4322, 3: 1726}, + ("Category Twos and Threes", 4, 5): {2: 430, 7: 61608, 6: 28377, 5: 7264, 4: 1659, 3: 662}, + ("Category Twos and Threes", 4, 6): {9: 60343, 7: 24434, 6: 15223}, + ("Category Twos and Threes", 4, 7): {9: 100000}, + ("Category Twos and Threes", 4, 8): {9: 100000}, + ("Category Twos and Threes", 5, 1): {0: 11610, 3: 88390}, + ("Category Twos and Threes", 5, 2): {5: 70562, 3: 11158, 2: 534, 4: 17746}, + ("Category Twos and Threes", 5, 3): {6: 74716, 5: 23240, 3: 774, 2: 37, 4: 1233}, + ("Category Twos and Threes", 5, 4): {8: 68531, 6: 29461, 5: 1962, 3: 18, 4: 28}, + ("Category Twos and Threes", 5, 5): {9: 70635, 8: 26461, 6: 2860, 5: 44}, + ("Category Twos and Threes", 5, 6): {9: 100000}, + ("Category Twos and Threes", 5, 7): {11: 67606, 9: 32394}, + ("Category Twos and Threes", 5, 8): {12: 68354, 11: 21395, 9: 10251}, + ("Category Twos and Threes", 6, 1): {2: 4096, 4: 64713, 3: 31191}, + ("Category Twos and Threes", 6, 2): {2: 169, 6: 68210, 5: 22433, 3: 3547, 4: 5641}, + ("Category Twos and Threes", 6, 3): {2: 11, 8: 68425, 6: 23593, 5: 7338, 3: 244, 4: 389}, + ("Category Twos and Threes", 6, 4): {9: 73054, 8: 26109, 6: 787, 5: 50}, + ("Category Twos and Threes", 6, 5): {8: 8568, 11: 68223, 9: 23209}, + ("Category Twos and Threes", 6, 6): {12: 70373, 11: 20213, 9: 9414}, + ("Category Twos and Threes", 6, 7): {12: 100000}, + ("Category Twos and Threes", 6, 8): {14: 68062, 12: 31938}, + ("Category Twos and Threes", 7, 1): {2: 1390, 5: 66048, 4: 21972, 3: 10590}, + ("Category Twos and Threes", 7, 2): {2: 22, 8: 60665, 5: 11253, 6: 26834, 3: 473, 4: 753}, + ("Category Twos and Threes", 7, 3): {9: 70126, 8: 26169, 5: 909, 6: 2772, 3: 9, 4: 15}, + ("Category Twos and Threes", 7, 4): {11: 70543, 9: 28824, 8: 633}, + ("Category Twos and Threes", 7, 5): {12: 74745, 11: 22893, 9: 2173, 8: 189}, + ("Category Twos and Threes", 7, 6): {11: 7636, 14: 69766, 12: 22598}, + ("Category Twos and Threes", 7, 7): {15: 71620, 14: 19800, 12: 8580}, + ("Category Twos and Threes", 7, 8): {14: 10952, 16: 61407, 15: 27641}, + ("Category Twos and Threes", 8, 1): {2: 555, 6: 60067, 5: 26375, 4: 8774, 3: 4229}, + ("Category Twos and Threes", 8, 2): {8: 99967, 2: 13, 6: 20}, + ("Category Twos and Threes", 8, 3): {8: 10167, 11: 65964, 9: 23869}, + ("Category Twos and Threes", 8, 4): {11: 37966, 13: 62034}, + ("Category Twos and Threes", 8, 5): {11: 9059, 15: 64126, 12: 26815}, + ("Category Twos and Threes", 8, 6): {14: 14139, 17: 60581, 11: 2, 15: 25278}, + ("Category Twos and Threes", 8, 7): {14: 5173, 18: 63415, 17: 22164, 15: 9248}, + ("Category Twos and Threes", 8, 8): {18: 100000}, + ("Category Sum of Odds", 1, 1): {0: 66572, 3: 33428}, + ("Category Sum of Odds", 1, 2): {0: 44489, 3: 55511}, + ("Category Sum of Odds", 1, 3): {0: 26778, 3: 33412, 5: 39810}, + ("Category Sum of Odds", 1, 4): {0: 18191, 5: 81809}, + ("Category Sum of Odds", 1, 5): {0: 2299, 5: 97701}, + ("Category Sum of Odds", 1, 6): {0: 101, 5: 99899}, + ("Category Sum of Odds", 1, 7): {5: 100000}, + ("Category Sum of Odds", 1, 8): {5: 100000}, + ("Category Sum of Odds", 2, 1): {0: 66571, 3: 33429}, + ("Category Sum of Odds", 2, 2): {0: 38206, 4: 61794}, + ("Category Sum of Odds", 2, 3): {3: 15100, 8: 34337, 4: 24422, 5: 26141}, + ("Category Sum of Odds", 2, 4): {3: 4389, 8: 75870, 5: 19741}, + ("Category Sum of Odds", 2, 5): {8: 66180, 10: 33820}, + ("Category Sum of Odds", 2, 6): {10: 99075, 8: 925}, + ("Category Sum of Odds", 2, 7): {10: 100000}, + ("Category Sum of Odds", 2, 8): {10: 100000}, + ("Category Sum of Odds", 3, 1): {0: 19440, 3: 80560}, + ("Category Sum of Odds", 3, 2): {0: 3843, 3: 30607, 6: 65550}, + ("Category Sum of Odds", 3, 3): {8: 99451, 3: 126, 4: 204, 5: 219}, + ("Category Sum of Odds", 3, 4): {8: 39493, 9: 60507}, + ("Category Sum of Odds", 3, 5): {8: 25186, 13: 36226, 9: 38588}, + ("Category Sum of Odds", 3, 6): {13: 99387, 8: 242, 9: 371}, + ("Category Sum of Odds", 3, 7): {13: 63989, 15: 36011}, + ("Category Sum of Odds", 3, 8): {15: 99350, 13: 650}, + ("Category Sum of Odds", 4, 1): {0: 7100, 3: 29425, 5: 63475}, + ("Category Sum of Odds", 4, 2): {0: 1227, 3: 30702, 8: 68071}, + ("Category Sum of Odds", 4, 3): {8: 34941, 10: 65059}, + ("Category Sum of Odds", 4, 4): {8: 30671, 11: 69329}, + ("Category Sum of Odds", 4, 5): {8: 20766, 13: 79234}, + ("Category Sum of Odds", 4, 6): {13: 67313, 18: 32687}, + ("Category Sum of Odds", 4, 7): {13: 12063, 18: 87937}, + ("Category Sum of Odds", 4, 8): {18: 66936, 20: 33064}, + ("Category Sum of Odds", 5, 1): {0: 2404, 3: 31470, 6: 66126}, + ("Category Sum of Odds", 5, 2): {6: 12689, 11: 60256, 8: 27055}, + ("Category Sum of Odds", 5, 3): {10: 36853, 13: 63147}, + ("Category Sum of Odds", 5, 4): {13: 38005, 15: 61994, 10: 1}, + ("Category Sum of Odds", 5, 5): {13: 33747, 16: 66253}, + ("Category Sum of Odds", 5, 6): {13: 23587, 18: 76413}, + ("Category Sum of Odds", 5, 7): {18: 67776, 23: 32224}, + ("Category Sum of Odds", 5, 8): {23: 99176, 18: 824}, + ("Category Sum of Odds", 6, 1): {0: 791, 3: 32146, 7: 67063}, + ("Category Sum of Odds", 6, 2): {11: 38567, 13: 61432, 8: 1}, + ("Category Sum of Odds", 6, 3): {15: 65880, 11: 5075, 13: 29045}, + ("Category Sum of Odds", 6, 4): {15: 37367, 18: 62633}, + ("Category Sum of Odds", 6, 5): {18: 38038, 20: 61948, 15: 14}, + ("Category Sum of Odds", 6, 6): {18: 33838, 21: 66162}, + ("Category Sum of Odds", 6, 7): {18: 16130, 23: 83870}, + ("Category Sum of Odds", 6, 8): {23: 66748, 28: 33252}, + ("Category Sum of Odds", 7, 1): {5: 12019, 9: 63507, 7: 24474}, + ("Category Sum of Odds", 7, 2): {11: 37365, 15: 62635}, + ("Category Sum of Odds", 7, 3): {15: 36250, 18: 63750}, + ("Category Sum of Odds", 7, 4): {18: 37627, 21: 62373}, + ("Category Sum of Odds", 7, 5): {20: 35127, 23: 64873}, + ("Category Sum of Odds", 7, 6): {20: 12629, 25: 64047, 23: 23324}, + ("Category Sum of Odds", 7, 7): {23: 32409, 26: 67591}, + ("Category Sum of Odds", 7, 8): {23: 22322, 28: 77678}, + ("Category Sum of Odds", 8, 1): {5: 4088, 10: 65985, 9: 21602, 7: 8325}, + ("Category Sum of Odds", 8, 2): {13: 35686, 17: 64314}, + ("Category Sum of Odds", 8, 3): {17: 13770, 21: 62013, 18: 24217}, + ("Category Sum of Odds", 8, 4): {21: 37763, 24: 62237}, + ("Category Sum of Odds", 8, 5): {23: 12631, 26: 66541, 21: 4, 24: 20824}, + ("Category Sum of Odds", 8, 6): {23: 4929, 29: 60982, 26: 25964, 24: 8125}, + ("Category Sum of Odds", 8, 7): {23: 1608, 30: 67370, 29: 19899, 26: 8472, 24: 2651}, + ("Category Sum of Odds", 8, 8): {28: 4861, 32: 61811, 30: 25729, 29: 7599}, + ("Category Sum of Evens", 1, 1): {0: 66318, 4: 33682}, + ("Category Sum of Evens", 1, 2): {0: 44331, 4: 55669}, + ("Category Sum of Evens", 1, 3): {0: 29576, 4: 35040, 6: 35384}, + ("Category Sum of Evens", 1, 4): {0: 22612, 6: 77388}, + ("Category Sum of Evens", 1, 5): {0: 3566, 6: 96434}, + ("Category Sum of Evens", 1, 6): {0: 209, 6: 99791}, + ("Category Sum of Evens", 1, 7): {0: 3, 6: 99997}, + ("Category Sum of Evens", 1, 8): {6: 100000}, + ("Category Sum of Evens", 2, 1): {0: 25229, 2: 36083, 6: 38688}, + ("Category Sum of Evens", 2, 2): {0: 57, 4: 38346, 8: 37232, 2: 81, 6: 24284}, + ("Category Sum of Evens", 2, 3): {6: 39504, 10: 37060, 4: 1, 8: 23435}, + ("Category Sum of Evens", 2, 4): {10: 99495, 6: 317, 8: 188}, + ("Category Sum of Evens", 2, 5): {10: 69597, 12: 30403}, + ("Category Sum of Evens", 2, 6): {12: 98377, 10: 1623}, + ("Category Sum of Evens", 2, 7): {12: 100000}, + ("Category Sum of Evens", 2, 8): {12: 100000}, + ("Category Sum of Evens", 3, 1): {0: 76, 4: 38332, 8: 37178, 2: 109, 6: 24305}, + ("Category Sum of Evens", 3, 2): {8: 67248, 12: 32556, 4: 196}, + ("Category Sum of Evens", 3, 3): {10: 44843, 14: 33195, 8: 213, 12: 21749}, + ("Category Sum of Evens", 3, 4): {10: 37288, 14: 62712}, + ("Category Sum of Evens", 3, 5): {14: 61196, 16: 38802, 10: 2}, + ("Category Sum of Evens", 3, 6): {16: 99621, 14: 379}, + ("Category Sum of Evens", 3, 7): {16: 67674, 18: 32326}, + ("Category Sum of Evens", 3, 8): {18: 100000}, + ("Category Sum of Evens", 4, 1): {6: 37636, 10: 40039, 4: 32, 8: 22293}, + ("Category Sum of Evens", 4, 2): {10: 57689, 14: 42258, 6: 53}, + ("Category Sum of Evens", 4, 3): {14: 67801, 18: 32152, 10: 47}, + ("Category Sum of Evens", 4, 4): {18: 98878, 14: 1122}, + ("Category Sum of Evens", 4, 5): {18: 60401, 20: 39599}, + ("Category Sum of Evens", 4, 6): {20: 64396, 22: 35186, 18: 418}, + ("Category Sum of Evens", 4, 7): {22: 99697, 20: 302, 18: 1}, + ("Category Sum of Evens", 4, 8): {22: 100000}, + ("Category Sum of Evens", 5, 1): {8: 35338, 12: 41027, 6: 22, 10: 23613}, + ("Category Sum of Evens", 5, 2): {12: 37027, 18: 35856, 10: 10, 14: 27107}, + ("Category Sum of Evens", 5, 3): {18: 68230, 22: 31735, 14: 35}, + ("Category Sum of Evens", 5, 4): {18: 14880, 22: 53608, 24: 31512}, + ("Category Sum of Evens", 5, 5): {24: 98732, 18: 275, 22: 993}, + ("Category Sum of Evens", 5, 6): {24: 61498, 26: 38502}, + ("Category Sum of Evens", 5, 7): {26: 65201, 28: 34488, 24: 311}, + ("Category Sum of Evens", 5, 8): {28: 99648, 26: 351, 24: 1}, + ("Category Sum of Evens", 6, 1): {10: 34538, 14: 41426, 8: 4, 12: 24032}, + ("Category Sum of Evens", 6, 2): {16: 43552, 22: 31546, 14: 235, 12: 121, 18: 24546}, + ("Category Sum of Evens", 6, 3): {22: 68714, 26: 31239, 18: 47}, + ("Category Sum of Evens", 6, 4): {26: 59168, 28: 33835, 22: 4791, 18: 1, 24: 2205}, + ("Category Sum of Evens", 6, 5): {26: 44386, 30: 32920, 28: 22694}, + ("Category Sum of Evens", 6, 6): {30: 98992, 26: 667, 28: 341}, + ("Category Sum of Evens", 6, 7): {30: 60806, 32: 39194}, + ("Category Sum of Evens", 6, 8): {32: 64584, 34: 35252, 30: 164}, + ("Category Sum of Evens", 7, 1): {12: 40703, 18: 30507, 10: 1, 14: 28789}, + ("Category Sum of Evens", 7, 2): {22: 60249, 24: 38366, 12: 1, 18: 767, 16: 614, 14: 3}, + ("Category Sum of Evens", 7, 3): {24: 47964, 30: 30240, 22: 4, 26: 21792}, + ("Category Sum of Evens", 7, 4): {30: 63108, 32: 35114, 24: 1778}, + ("Category Sum of Evens", 7, 5): {32: 62062, 34: 37406, 30: 523, 26: 6, 28: 3}, + ("Category Sum of Evens", 7, 6): {32: 40371, 36: 35507, 34: 24122}, + ("Category Sum of Evens", 7, 7): {34: 44013, 38: 31749, 32: 4, 36: 24234}, + ("Category Sum of Evens", 7, 8): {38: 99116, 34: 570, 36: 314}, + ("Category Sum of Evens", 8, 1): {18: 66673, 20: 31528, 12: 1054, 14: 745}, + ("Category Sum of Evens", 8, 2): {22: 40918, 28: 33610, 24: 25472}, + ("Category Sum of Evens", 8, 3): {28: 40893, 32: 41346, 24: 17, 30: 17737, 26: 7}, + ("Category Sum of Evens", 8, 4): {32: 63665, 36: 36316, 28: 19}, + ("Category Sum of Evens", 8, 5): {36: 58736, 38: 40234, 32: 1030}, + ("Category Sum of Evens", 8, 6): {36: 57946, 40: 42054}, + ("Category Sum of Evens", 8, 7): {38: 34984, 42: 39622, 36: 2, 40: 25392}, + ("Category Sum of Evens", 8, 8): {42: 65137, 44: 34611, 38: 146, 40: 106}, + ("Category Double Threes and Fours", 1, 1): {0: 66749, 6: 33251}, + ("Category Double Threes and Fours", 1, 2): {0: 44675, 6: 55325}, + ("Category Double Threes and Fours", 1, 3): {0: 29592, 6: 35261, 8: 35147}, + ("Category Double Threes and Fours", 1, 4): {0: 24601, 6: 29406, 8: 45993}, + ("Category Double Threes and Fours", 1, 5): {0: 20499, 6: 24420, 8: 55081}, + ("Category Double Threes and Fours", 1, 6): {0: 17116, 6: 20227, 8: 62657}, + ("Category Double Threes and Fours", 1, 7): {0: 14193, 6: 17060, 8: 68747}, + ("Category Double Threes and Fours", 1, 8): {0: 11977, 6: 13924, 8: 74099}, + ("Category Double Threes and Fours", 2, 1): {0: 44382, 6: 22191, 8: 33427}, + ("Category Double Threes and Fours", 2, 2): {0: 5, 6: 46088, 12: 30763, 8: 23144}, + ("Category Double Threes and Fours", 2, 3): {0: 5, 6: 30159, 12: 32725, 14: 37111}, + ("Category Double Threes and Fours", 2, 4): {6: 20533, 14: 79467}, + ("Category Double Threes and Fours", 2, 5): {14: 69789, 16: 30211}, + ("Category Double Threes and Fours", 2, 6): {16: 99978, 14: 22}, + ("Category Double Threes and Fours", 2, 7): {16: 100000}, + ("Category Double Threes and Fours", 2, 8): {16: 100000}, + ("Category Double Threes and Fours", 3, 1): {0: 8, 6: 49139, 12: 26176, 8: 24677}, + ("Category Double Threes and Fours", 3, 2): {0: 5, 6: 24942, 12: 27065, 14: 47988}, + ("Category Double Threes and Fours", 3, 3): {6: 12743, 14: 56776, 20: 30481}, + ("Category Double Threes and Fours", 3, 4): {14: 9753, 20: 90247}, + ("Category Double Threes and Fours", 3, 5): {20: 61293, 22: 38707}, + ("Category Double Threes and Fours", 3, 6): {22: 99615, 20: 385}, + ("Category Double Threes and Fours", 3, 7): {22: 67267, 24: 32733}, + ("Category Double Threes and Fours", 3, 8): {24: 100000}, + ("Category Double Threes and Fours", 4, 1): {6: 26819, 12: 39789, 14: 33392}, + ("Category Double Threes and Fours", 4, 2): {14: 63726, 20: 36011, 6: 106, 12: 157}, + ("Category Double Threes and Fours", 4, 3): {20: 69628, 24: 30158, 14: 214}, + ("Category Double Threes and Fours", 4, 4): {20: 11409, 24: 57067, 26: 31524}, + ("Category Double Threes and Fours", 4, 5): {20: 6566, 26: 57047, 28: 36387}, + ("Category Double Threes and Fours", 4, 6): {28: 63694, 30: 35203, 20: 113, 26: 990}, + ("Category Double Threes and Fours", 4, 7): {30: 98893, 28: 1092, 26: 15}, + ("Category Double Threes and Fours", 4, 8): {30: 100000}, + ("Category Double Threes and Fours", 5, 1): {6: 16042, 14: 83958}, + ("Category Double Threes and Fours", 5, 2): {14: 44329, 20: 24912, 24: 30759}, + ("Category Double Threes and Fours", 5, 3): {24: 57603, 28: 42155, 20: 242}, + ("Category Double Threes and Fours", 5, 4): {26: 32446, 30: 43875, 24: 21, 28: 23658}, + ("Category Double Threes and Fours", 5, 5): {30: 69209, 34: 30672, 26: 69, 28: 50}, + ("Category Double Threes and Fours", 5, 6): {34: 63882, 36: 35323, 30: 795}, + ("Category Double Threes and Fours", 5, 7): {36: 65178, 38: 34598, 34: 222, 30: 2}, + ("Category Double Threes and Fours", 5, 8): {38: 99654, 36: 345, 34: 1}, + ("Category Double Threes and Fours", 6, 1): {14: 68079, 18: 31921}, + ("Category Double Threes and Fours", 6, 2): {14: 14542, 24: 48679, 28: 36779}, + ("Category Double Threes and Fours", 6, 3): {28: 62757, 34: 36962, 24: 281}, + ("Category Double Threes and Fours", 6, 4): {34: 68150, 38: 30771, 28: 604, 26: 1, 30: 474}, + ("Category Double Threes and Fours", 6, 5): {38: 68332, 40: 30833, 34: 823, 28: 12}, + ("Category Double Threes and Fours", 6, 6): {40: 67631, 42: 31174, 38: 1181, 34: 14}, + ("Category Double Threes and Fours", 6, 7): {42: 63245, 44: 35699, 40: 1038, 38: 18}, + ("Category Double Threes and Fours", 6, 8): {44: 64056, 46: 35162, 42: 770, 40: 12}, + ("Category Double Threes and Fours", 7, 1): {14: 14976, 18: 54685, 22: 30339}, + ("Category Double Threes and Fours", 7, 2): {14: 10532, 28: 55372, 32: 34096}, + ("Category Double Threes and Fours", 7, 3): {32: 42786, 40: 32123, 28: 2, 34: 25089}, + ("Category Double Threes and Fours", 7, 4): {38: 46172, 44: 31648, 32: 226, 40: 21954}, + ("Category Double Threes and Fours", 7, 5): {44: 64883, 46: 34437, 38: 460, 32: 2, 40: 218}, + ("Category Double Threes and Fours", 7, 6): {44: 43458, 48: 33715, 46: 22827}, + ("Category Double Threes and Fours", 7, 7): {46: 44472, 50: 32885, 44: 15, 48: 22628}, + ("Category Double Threes and Fours", 7, 8): {48: 41682, 52: 37868, 46: 18, 50: 20432}, + ("Category Double Threes and Fours", 8, 1): {14: 14227, 22: 85773}, + ("Category Double Threes and Fours", 8, 2): {22: 7990, 32: 56319, 36: 35691}, + ("Category Double Threes and Fours", 8, 3): {32: 19914, 40: 43585, 44: 36501}, + ("Category Double Threes and Fours", 8, 4): {44: 63232, 48: 36613, 32: 48, 40: 107}, + ("Category Double Threes and Fours", 8, 5): {48: 62939, 52: 36798, 44: 263}, + ("Category Double Threes and Fours", 8, 6): {52: 60756, 54: 38851, 48: 392, 44: 1}, + ("Category Double Threes and Fours", 8, 7): {54: 62281, 56: 37262, 52: 455, 48: 2}, + ("Category Double Threes and Fours", 8, 8): {56: 67295, 60: 32064, 54: 637, 52: 4}, + ("Category Quadruple Ones and Twos", 1, 1): {0: 66567, 4: 16803, 8: 16630}, + ("Category Quadruple Ones and Twos", 1, 2): {0: 44809, 4: 27448, 8: 27743}, + ("Category Quadruple Ones and Twos", 1, 3): {0: 37100, 4: 23184, 8: 39716}, + ("Category Quadruple Ones and Twos", 1, 4): {0: 30963, 4: 19221, 8: 49816}, + ("Category Quadruple Ones and Twos", 1, 5): {0: 25316, 4: 16079, 8: 58605}, + ("Category Quadruple Ones and Twos", 1, 6): {0: 14381, 8: 85619}, + ("Category Quadruple Ones and Twos", 1, 7): {0: 4137, 8: 95863}, + ("Category Quadruple Ones and Twos", 1, 8): {0: 1004, 8: 98996}, + ("Category Quadruple Ones and Twos", 2, 1): {0: 44566, 4: 22273, 8: 33161}, + ("Category Quadruple Ones and Twos", 2, 2): {0: 19963, 4: 24890, 8: 32262, 12: 22885}, + ("Category Quadruple Ones and Twos", 2, 3): {0: 13766, 4: 17158, 8: 34907, 12: 18539, 16: 15630}, + ("Category Quadruple Ones and Twos", 2, 4): {0: 6655, 8: 30200, 12: 26499, 16: 36646}, + ("Category Quadruple Ones and Twos", 2, 5): {0: 982, 8: 16426, 12: 24307, 16: 58285}, + ("Category Quadruple Ones and Twos", 2, 6): {0: 68, 8: 9887, 16: 90045}, + ("Category Quadruple Ones and Twos", 2, 7): {0: 11, 16: 99989}, + ("Category Quadruple Ones and Twos", 2, 8): {16: 100000}, + ("Category Quadruple Ones and Twos", 3, 1): {0: 29440, 4: 22574, 8: 27747, 12: 20239}, + ("Category Quadruple Ones and Twos", 3, 2): {0: 8857, 4: 16295, 8: 26434, 12: 22986, 16: 25428}, + ("Category Quadruple Ones and Twos", 3, 3): {0: 3649, 8: 15314, 12: 24619, 16: 38944, 20: 17474}, + ("Category Quadruple Ones and Twos", 3, 4): {0: 11, 8: 8430, 16: 41259, 20: 50300}, + ("Category Quadruple Ones and Twos", 3, 5): {20: 80030, 24: 19902, 8: 11, 16: 57}, + ("Category Quadruple Ones and Twos", 3, 6): {20: 23895, 24: 76105}, + ("Category Quadruple Ones and Twos", 3, 7): {24: 100000}, + ("Category Quadruple Ones and Twos", 3, 8): {24: 100000}, + ("Category Quadruple Ones and Twos", 4, 1): {0: 19691, 4: 19657, 8: 27288, 12: 16126, 16: 17238}, + ("Category Quadruple Ones and Twos", 4, 2): {0: 1222, 4: 15703, 12: 24015, 16: 34944, 20: 24116}, + ("Category Quadruple Ones and Twos", 4, 3): {0: 227, 12: 14519, 20: 62257, 24: 22997}, + ("Category Quadruple Ones and Twos", 4, 4): {0: 11, 20: 17266, 24: 67114, 28: 15609}, + ("Category Quadruple Ones and Twos", 4, 5): {24: 27365, 28: 72632, 20: 3}, + ("Category Quadruple Ones and Twos", 4, 6): {28: 81782, 32: 18215, 24: 3}, + ("Category Quadruple Ones and Twos", 4, 7): {28: 22319, 32: 77681}, + ("Category Quadruple Ones and Twos", 4, 8): {32: 100000}, + ("Category Quadruple Ones and Twos", 5, 1): {0: 13112, 4: 16534, 8: 24718, 12: 18558, 16: 27078}, + ("Category Quadruple Ones and Twos", 5, 2): {0: 21, 4: 15200, 16: 28784, 20: 32131, 24: 23864}, + ("Category Quadruple Ones and Twos", 5, 3): {0: 4, 16: 8475, 24: 66718, 28: 24803}, + ("Category Quadruple Ones and Twos", 5, 4): {28: 76149, 32: 23289, 24: 550, 20: 12}, + ("Category Quadruple Ones and Twos", 5, 5): {32: 81110, 36: 16222, 28: 2663, 24: 5}, + ("Category Quadruple Ones and Twos", 5, 6): {32: 18542, 36: 81458}, + ("Category Quadruple Ones and Twos", 5, 7): {36: 82036, 40: 17964}, + ("Category Quadruple Ones and Twos", 5, 8): {36: 27864, 40: 72136}, + ("Category Quadruple Ones and Twos", 6, 1): {0: 6419, 8: 16963, 12: 22116, 16: 33903, 20: 20599}, + ("Category Quadruple Ones and Twos", 6, 2): {0: 5, 16: 8913, 24: 67749, 28: 23333}, + ("Category Quadruple Ones and Twos", 6, 3): {28: 71779, 32: 27514, 16: 82, 24: 625}, + ("Category Quadruple Ones and Twos", 6, 4): {32: 72333, 36: 27328, 28: 337, 24: 2}, + ("Category Quadruple Ones and Twos", 6, 5): {36: 73993, 40: 25138, 32: 865, 28: 4}, + ("Category Quadruple Ones and Twos", 6, 6): {40: 80918, 44: 17126, 36: 1934, 32: 22}, + ("Category Quadruple Ones and Twos", 6, 7): {40: 20298, 44: 79702}, + ("Category Quadruple Ones and Twos", 6, 8): {44: 81077, 48: 18923}, + ("Category Quadruple Ones and Twos", 7, 1): {0: 508, 8: 10298, 16: 41828, 20: 30853, 24: 16513}, + ("Category Quadruple Ones and Twos", 7, 2): {16: 7429, 28: 69817, 32: 22754}, + ("Category Quadruple Ones and Twos", 7, 3): {32: 82871, 40: 16531, 16: 57, 28: 541}, + ("Category Quadruple Ones and Twos", 7, 4): {36: 67601, 44: 17916, 32: 909, 40: 13569, 28: 5}, + ("Category Quadruple Ones and Twos", 7, 5): {40: 67395, 48: 17447, 36: 364, 44: 14790, 32: 4}, + ("Category Quadruple Ones and Twos", 7, 6): {48: 91242, 40: 7151, 36: 38, 44: 1569}, + ("Category Quadruple Ones and Twos", 7, 7): {48: 80854, 52: 19146}, + ("Category Quadruple Ones and Twos", 7, 8): {48: 25334, 52: 74666}, + ("Category Quadruple Ones and Twos", 8, 1): {0: 119, 16: 17496, 20: 26705, 24: 55680}, + ("Category Quadruple Ones and Twos", 8, 2): {24: 569, 32: 72257, 36: 21817, 28: 5357}, + ("Category Quadruple Ones and Twos", 8, 3): {36: 66654, 44: 18473, 32: 1396, 40: 13477}, + ("Category Quadruple Ones and Twos", 8, 4): {44: 73954, 48: 22240, 36: 3178, 40: 628}, + ("Category Quadruple Ones and Twos", 8, 5): {48: 76082, 52: 22415, 44: 1500, 36: 3}, + ("Category Quadruple Ones and Twos", 8, 6): {52: 74901, 56: 21332, 48: 3766, 44: 1}, + ("Category Quadruple Ones and Twos", 8, 7): {56: 96171, 52: 3640, 48: 189}, + ("Category Quadruple Ones and Twos", 8, 8): {56: 78035, 60: 21965}, ("Category Micro Straight", 1, 1): {0: 100000}, ("Category Micro Straight", 1, 2): {0: 100000}, ("Category Micro Straight", 1, 3): {0: 100000}, diff --git a/worlds/yachtdice/__init__.py b/worlds/yachtdice/__init__.py index 75993fd394..7efb8f9418 100644 --- a/worlds/yachtdice/__init__.py +++ b/worlds/yachtdice/__init__.py @@ -56,7 +56,7 @@ class YachtDiceWorld(World): item_name_groups = item_groups - ap_world_version = "2.1.3" + ap_world_version = "2.1.4" def _get_yachtdice_data(self): return { @@ -468,7 +468,7 @@ class YachtDiceWorld(World): menu.exits.append(connection) connection.connect(board) self.multiworld.regions += [menu, board] - + def get_filler_item_name(self) -> str: return "Good RNG"