@tool extends Node @export_category("Debug") @export var mybutton: bool: set(value): _my_button_pressed() func _my_button_pressed(): var results = [] _visit_node(get_parent(), results) var file = FileAccess.open("user://rando_dump.txt", FileAccess.WRITE) file.store_string("".join(results)) func _visit_node(node, results: Array): var root_node = get_parent() var node_id = String(root_node.get_path_to(node).get_concatenated_names()) if node is PanelMain: var clue = node.clue var answer = node.answer if node.missing_line == "clue": clue = node.answer answer = node.clue elif node.missing_line == "symbol": answer = node.symbol results.append("panels {\n name: \"") results.append(clue.to_upper()) results.append("\"\n path: \"") results.append(node_id) results.append("\"\n clue: \"") results.append(clue) results.append("\"\n answer: \"") results.append(answer) results.append("\"\n") if node.missing_line != "symbol": var symbols = _parse_symbol(node.symbol) for symbol in symbols: results.append(" symbols: ") results.append(symbol) results.append("\n") for proxy in node.proxies: var proxy_node = node.get_node(proxy) var proxy_path = String(root_node.get_path_to(proxy_node).get_concatenated_names()) results.append(" proxies { answer: \"") if proxy_node.missing_line == "clue": results.append(proxy_node.clue) elif proxy_node.missing_line == "symbol": results.append(proxy_node.symbol) else: results.append(proxy_node.answer) results.append("\" path: \"") results.append(proxy_path) results.append("\" }\n") results.append("}\n") elif node is DoorMain: var door_data = {"door_id": node_id} if !node.senders.is_empty(): door_data["senders"] = _parse_node_paths(root_node, node, node.senders) if !node.senderGroup.is_empty(): door_data["senderGroup"] = _parse_node_paths(root_node, node, node.senderGroup) #results["doors"][node_id] = door_data elif node is Collectable: if node.unlock_type == "key": results.append("letters {\n key: \"") results.append(node.unlock_key) results.append("\"\n") if node.level == 2: results.append(" level2: true\n") results.append(" path: \"") results.append(node_id) results.append("\"\n}\n") elif node.unlock_type == "smiley": results.append("masteries {\n name: \"MASTERY\"\n path: \"") results.append(node_id) results.append("\"\n}\n") elif node is Painting or node is AutoPainting: results.append("paintings {\n name: \"") results.append(node.name.to_upper()) results.append("\"\n path: \"") results.append(node_id) results.append("\"\n}\n") elif node is Worldport: results.append("ports {\n name: \"") results.append(node.name.to_upper()) results.append("\"\n path: \"") results.append(node_id) results.append("\"\n}\n") elif node is Keyholder: results.append("keyholders {\n name: \"") results.append(node.name.to_upper()) results.append("\"\n path: \"") results.append(node_id) results.append("\"\n}\n") for child in node.get_children(): _visit_node(child, results) func _parse_symbol(symbol): var raw = symbol.strip_edges() var result = [] if raw.contains(":Syn") or raw.contains(":Ant"): result.append("SUN") if raw.contains(":Add") or raw.contains(":Rem") or raw.contains(":Adp"): result.append("SPARKLES") if raw.contains(":Hom") or raw.contains(":Rhy"): result.append("ZERO") if raw.contains(":Cat") or raw.contains(":Exa"): result.append("EXAMPLE") if raw.contains(":Par") or raw.contains(":Who"): result.append("BOXES") if raw.contains(":Plu") or raw.contains(":Sin"): result.append("PLANET") if raw.contains(":Int") or raw.contains(":Dim"): result.append("PYRAMID") if raw.contains(":Ene") or raw.contains(":Enr") or raw.contains(":Ent"): result.append("CROSS") if raw.contains(":Swe") or raw.contains(":Swu"): result.append("SWEET") if raw.contains(":Mas") or raw.contains(":Fem"): result.append("GENDER") if raw.contains(":Old") or raw.contains(":You") or raw.contains(":Ten"): result.append("AGE") if raw.contains(":Sou") or raw.contains(":Sor"): result.append("SOUND") if raw.contains(":Ana"): result.append("ANAGRAM") if raw.contains(":Job") or raw.contains(":Emp"): result.append("JOB") if raw.contains(":Sur") or raw.contains(":Srr"): result.append("STARS") if raw.contains(":Cha"): result.append("NULL") if raw.contains(":Eva"): result.append("EVAL") if raw.contains(":Sad") or raw.contains(":Odd") or raw.contains("@"): result.append("LINGO") if raw.contains("?"): result.append("QUESTION") return result func _parse_node_paths(node, parent, array): var result = [] for p in array: result.append(String(node.get_path_to(parent.get_node(p)).get_concatenated_names())) return result ; background-color: #ffdddd } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ .highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #333333 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
from dataclasses import dataclass

from Options import PerGameCommonOptions, Toggle


class ShuffleDoors(Toggle):
    """If enabled, most doors will open from receiving an item rather than fulfilling the in-game requirements."""
    display_name = "Shuffle Doors"


@dataclass
class Lingo2Options(PerGameCommonOptions):
    shuffle_doors: ShuffleDoors