Repository: randovania/randovania
Pull request #8083: Fusion: basic hints and hint features
Author: login: JeffGainsNGames
Labels: name: game: Metroid Fusion
name: feature: Hints
Created: 2025-03-11T03:54:48Z | Merged: 2025-03-14T15:46:00Z

- [x] update the gui
- [x] fix log files test


Diff:
diff --git a/randovania/games/fusion/exporter/joke_hints.py b/randovania/games/fusion/exporter/joke_hints.py
new file mode 100644
index 0000000000..bf2895111e
--- /dev/null
+++ b/randovania/games/fusion/exporter/joke_hints.py
@@ -0,0 +1,14 @@
+from __future__ import annotations
+
+from randovania.exporter.hints.joke_hints import GENERIC_JOKE_HINTS
+
+FUSION_JOKE_HINTS = GENERIC_JOKE_HINTS + [
+    "Adam has not yet authorized the use of this hint.",
+    "Space Pirates, strangely, dislike theft.",
+    "We've been trying to contact you about your ship's extended warranty.",
+    "Did you know Yellow X are lemon flavoured?",
+    "Did you know Green X are lime flavoured?",
+    "Did you know Red X are strawberry flavoured?",
+    "Did you know Blue X are blueberry flavoured?",
+    "I would tell you a hint, but Aran out of them.",
+]
diff --git a/randovania/games/fusion/exporter/patch_data_factory.py b/randovania/games/fusion/exporter/patch_data_factory.py
index ed760c55d4..8c64b81030 100644
--- a/randovania/games/fusion/exporter/patch_data_factory.py
+++ b/randovania/games/fusion/exporter/patch_data_factory.py
@@ -7,14 +7,17 @@
 
 from randovania.exporter import item_names
 from randovania.exporter.hints import credits_spoiler, guaranteed_item_hint
+from randovania.exporter.hints.hint_exporter import HintExporter
 from randovania.exporter.patch_data_factory import PatchDataFactory
 from randovania.game.game_enum import RandovaniaGame
 from randovania.game_description import default_database
 from randovania.game_description.db.hint_node import HintNode
 from randovania.games.fusion.exporter.hint_namer import FusionColor, FusionHintNamer
+from randovania.games.fusion.exporter.joke_hints import FUSION_JOKE_HINTS
 from randovania.games.fusion.layout.fusion_configuration import FusionConfiguration
 from randovania.games.fusion.layout.fusion_cosmetic_patches import FusionCosmeticPatches
 from randovania.generator.pickup_pool import pickup_creator
+from randovania.layout.base.hint_configuration import SpecificPickupHintMode
 from randovania.layout.base.pickup_model import PickupModelStyle
 from randovania.lib import json_lib
 
@@ -198,43 +201,50 @@ def _create_palette(self) -> dict:
 
     def _create_nav_text(self) -> dict:
         nav_text_json = {}
-        # namer = FusionHintNamer(self.description.all_patches, self.players_config)
-        # exporter = HintExporter(namer, self.rng, GENERIC_JOKE_HINTS)
+        namer = FusionHintNamer(self.description.all_patches, self.players_config)
+        exporter = HintExporter(namer, self.rng, FUSION_JOKE_HINTS)
 
         artifacts = [self.game.resource_database.get_item(f"Infant Metroid {i + 1}") for i in range(20)]
 
-        metroid_hint_mapping = guaranteed_item_hint.create_guaranteed_hints_for_resources(
-            self.description.all_patches,
-            self.players_config,
-            FusionHintNamer(self.description.all_patches, self.players_config),
-            False,  # TODO: make this depending on hint settings later:tm:
-            artifacts,
-            True,
-        )
-
-        charge_hint_mapping = guaranteed_item_hint.create_guaranteed_hints_for_resources(
-            self.description.all_patches,
-            self.players_config,
-            FusionHintNamer(self.description.all_patches, self.players_config),
-            True,  # TODO: make this depending on hint settings later:tm:
-            [self.game.resource_database.get_item("ChargeBeam")],
-            True,
-        )
+        metroid_precision = self.configuration.hints.specific_pickup_hints["artifacts"]
+        charge_precision = self.configuration.hints.specific_pickup_hints["charge_beam"]
+
+        if metroid_precision != SpecificPickupHintMode.DISABLED:
+            metroid_hint_mapping = guaranteed_item_hint.create_guaranteed_hints_for_resources(
+                self.description.all_patches,
+                self.players_config,
+                namer,
+                True if metroid_precision == SpecificPickupHintMode.HIDE_AREA else False,
+                artifacts,
+                True,
+            )
+        if charge_precision != SpecificPickupHintMode.DISABLED:
+            charge_hint_mapping = guaranteed_item_hint.create_guaranteed_hints_for_resources(
+                self.description.all_patches,
+                self.players_config,
+                namer,
+                True if charge_precision == SpecificPickupHintMode.HIDE_AREA else False,
+                [self.game.resource_database.get_item("ChargeBeam")],
+                True,
+            )
 
         hints = {}
 
         for node in self.game.region_list.iterate_nodes_of_type(HintNode):
             hint_location = node.extra["hint_name"]
-            if hint_location == "AuxiliaryPower":
+            if hint_location == "AuxiliaryPower" and charge_precision != SpecificPickupHintMode.DISABLED:
                 hints[hint_location] = " ".join(
                     [text for _, text in charge_hint_mapping.items() if "has no need to be located" not in text]
                 )
-            elif hint_location == "RestrictedLabs":
+            elif hint_location == "RestrictedLabs" and metroid_precision != SpecificPickupHintMode.DISABLED:
                 hints[hint_location] = " ".join(
                     [text for _, text in metroid_hint_mapping.items() if "has no need to be located" not in text]
                 )
             else:
-                hints[hint_location] = " ".join(["Hint system still in development, we appreciate your patience."])
+                hints[hint_location] = exporter.create_message_for_hint(
+                    self.patches.hints[node.identifier],
+                    True,
+                ).strip()
 
         starting_items_list = item_names.additional_starting_equipment(
             self.patches.configuration, self.patches.game, self.patches
diff --git a/randovania/games/fusion/generator/hint_distributor.py b/randovania/games/fusion/generator/hint_distributor.py
index 4c4acdf07d..8ffad5b8b0 100644
--- a/randovania/games/fusion/generator/hint_distributor.py
+++ b/randovania/games/fusion/generator/hint_distributor.py
@@ -1,18 +1,63 @@
 from __future__ import annotations
 
-from typing import override
+from typing import TYPE_CHECKING, override
 
+from randovania.game_description.db.node_identifier import NodeIdentifier
 from randovania.game_description.hint import (
-    HintItemPrecision,
-    HintLocationPrecision,
+    JokeHint,
     PrecisionPair,
 )
+from randovania.games.fusion.layout.fusion_configuration import FusionConfiguration
 from randovania.generator.hint_distributor import HintDistributor
 
+if TYPE_CHECKING:
+    from randovania.game_description.assignment import PickupTarget
+    from randovania.game_description.db.hint_node import HintNode
+    from randovania.game_description.game_patches import GamePatches
+    from randovania.generator.pre_fill_params import PreFillParams
+
 
-# TODO: add tests for distributor after hint system is confirmed
 class FusionHintDistributor(HintDistributor):
+    # Pre Filler
+
+    # Joke hints to go in pool
+    @override
+    @property
+    def num_joke_hints(self) -> int:
+        return 1
+
+    # Makes the listed features less interesting to hint
+    @override
+    def is_pickup_interesting(self, target: PickupTarget, player_id: int, hint_node: HintNode) -> bool:
+        non_interesting_features = ["key", "charge"]
+        for feature in non_interesting_features:
+            if target.pickup.has_hint_feature(feature):
+                return False
+        return True
+
+    # Set default precision for hints
     @override
     @property
     def default_precision_pair(self) -> PrecisionPair:
-        return PrecisionPair(HintLocationPrecision.REGION_ONLY, HintItemPrecision.DETAILED, True)
+        return PrecisionPair.featural()
+
+    # Make hints for specific locations
+    @override
+    async def assign_specific_location_hints(self, patches: GamePatches, prefill: PreFillParams) -> GamePatches:
+        assert isinstance(prefill.configuration, FusionConfiguration)
+        fake_hints = [
+            ("Main Deck", "Auxiliary Navigation Room", "Navigation Terminal"),
+            ("Main Deck", "Restricted Navigation Room", "Navigation Terminal"),
+        ]
+        for region, area, node in fake_hints:
+            patches = patches.assign_hint(NodeIdentifier.create(region, area, node), JokeHint())
+
+        return await super().assign_specific_location_hints(patches, prefill)
+
+    # Post Filler
+
+    # Don't use area in hints
+    @override
+    @property
+    def use_detailed_location_precision(self) -> bool:
+        return False
diff --git a/randovania/games/fusion/gui/ui_files/games_tab_fusion_widget.ui b/randovania/games/fusion/gui/ui_files/games_tab_fusion_widget.ui
index 8b4030cba7..7eef50a623 100644
--- a/randovania/games/fusion/gui/ui_files/games_tab_fusion_widget.ui
+++ b/randovania/games/fusion/gui/ui_files/games_tab_fusion_widget.ui
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>501</width>
-    <height>393</height>
+    <width>698</width>
+    <height>453</height>
    </rect>
   </property>
   <property name="currentIndex">
@@ -96,8 +96,8 @@
         <rect>
          <x>0</x>
          <y>0</y>
-         <width>499</width>
-         <height>363</height>
+         <width>696</width>
+         <height>423</height>
         </rect>
        </property>
        <layout class="QGridLayout" name="faq_scroll_layout">
@@ -135,8 +135,8 @@
         <rect>
          <x>0</x>
          <y>0</y>
-         <width>467</width>
-         <height>775</height>
+         <width>664</width>
+         <height>631</height>
         </rect>
        </property>
        <layout class="QVBoxLayout" name="verticalLayout">
@@ -234,8 +234,8 @@
         <rect>
          <x>0</x>
          <y>0</y>
-         <width>675</width>
-         <height>565</height>
+         <width>682</width>
+         <height>669</height>
         </rect>
        </property>
        <property name="sizePolicy">
@@ -266,7 +266,7 @@
            </sizepolicy>
           </property>
           <property name="text">
-           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;In Metroid Fusion, you can find hints for the following resources: &lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:700;&quot;&gt;Metroids&lt;/span&gt;: The Restricted Area Navigation Room hints where all your Infant Metroids are.&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:700;&quot;&gt;Major Items&lt;/span&gt;: All other Navigation Rooms provide a hint to a major item with varying degress of precision as described below:&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;In Metroid Fusion, players can find hints at the various Navigation Terminals spread throught the B.S.L. There are three main types of hints: &lt;/p&gt;&lt;p&gt;1) &lt;span style=&quot; font-weight:700;&quot;&gt;Infant Metroids&lt;/span&gt;: The Restricted Navigation Room gives a hint where all Infant Metroids can be found. This Navigation Terminal is always unlocked. &lt;/p&gt;&lt;p&gt;2) &lt;span style=&quot; font-weight:700;&quot;&gt;Charge Beam&lt;/span&gt;: The Auxiliary Navigation Terminal gives a hint where the Charge Beam can be found. This Navigation Terminal is always unlocked &lt;/p&gt;&lt;p&gt;3) &lt;span style=&quot; font-weight:700;&quot;&gt;Regular: &lt;/span&gt;The remaining Navigation Terminals give hints to random pickups with varying precision. Activating these Navigation Terminals require a specific Keycard to be acquired, and will prevent interaction before then.&lt;/p&gt;&lt;p&gt;The table below summarizes the above:&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
           </property>
           <property name="textFormat">
            <enum>Qt::MarkdownText</enum>
@@ -282,28 +282,31 @@
         <item>
          <widget class="QTableWidget" name="tableWidget">
           <property name="sizePolicy">
-           <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+           <sizepolicy hsizetype="Maximum" vsizetype="Expanding">
             <horstretch>0</horstretch>
             <verstretch>0</verstretch>
            </sizepolicy>
           </property>
           <property name="minimumSize">
            <size>
-            <width>660</width>
+            <width>400</width>
             <height>0</height>
            </size>
           </property>
           <property name="sizeAdjustPolicy">
-           <enum>QAbstractScrollArea::AdjustToContentsOnFirstShow</enum>
+           <enum>QAbstractScrollArea::AdjustToContents</enum>
           </property>
           <property name="autoScroll">
            <bool>true</bool>
           </property>
+          <property name="editTriggers">
+           <set>QAbstractItemView::NoEditTriggers</set>
+          </property>
           <property name="rowCount">
            <number>11</number>
           </property>
           <property name="columnCount">
-           <number>3</number>
+           <number>4</number>
           </property>
           <attribute name="horizontalHeaderVisible">
            <bool>true</bool>
@@ -312,10 +315,10 @@
            <bool>false</bool>
           </attribute>
           <attribute name="horizontalHeaderMinimumSectionSize">
-           <number>30</number>
+           <number>50</number>
           </attribute>
           <attribute name="horizontalHeaderDefaultSectionSize">
-           <number>220</number>
+           <number>150</number>
           </attribute>
           <attribute name="verticalHeaderVisible">
            <bool>false</bool>
@@ -400,7 +403,12 @@
           </column>
           <column>
            <property name="text">
-            <string>Hint Precision</string>
+            <string>Lock</string>
+           </property>
+          </column>
+          <column>
+           <property name="text">
+            <string>Hint Type</string>
            </property>
            <property name="font">
             <font>
@@ -420,7 +428,12 @@
           </item>
           <item row="0" column="2">
            <property name="text">
-            <string>Charge Beam, Configurable Precision</string>
+            <string>Unlocked</string>
+           </property>
+          </item>
+          <item row="0" column="3">
+           <property name="text">
+            <string>Specific Charge Beam, Configurable Precision</string>
            </property>
           </item>
           <item row="1" column="0">
@@ -430,12 +443,17 @@
           </item>
           <item row="1" column="1">
            <property name="text">
-            <string>Main Deck Navigation Room East</string>
+            <string>Crew Quarters Navigation Room</string>
            </property>
           </item>
           <item row="1" column="2">
            <property name="text">
-            <string>Broad Item, Broad Location</string>
+            <string>Level 1 Keycard (BLUE)</string>
+           </property>
+          </item>
+          <item row="1" column="3">
+           <property name="text">
+            <string>Regular Hint, Featural</string>
            </property>
           </item>
           <item row="2" column="0">
@@ -445,12 +463,17 @@
           </item>
           <item row="2" column="1">
            <property name="text">
-            <string>Main Deck Navigation Room West</string>
+            <string>Nexus Navigation Room</string>
            </property>
           </item>
           <item row="2" column="2">
            <property name="text">
-            <string>Broad Item, Broad Location</string>
+            <string>Level 4 Keycard (RED)</string>
+           </property>
+          </item>
+          <item row="2" column="3">
+           <property name="text">
+            <string>Regular Hint, Featural</string>
            </property>
           </item>
           <item row="3" column="0">
@@ -465,7 +488,12 @@
           </item>
           <item row="3" column="2">
            <property name="text">
-            <string>Broad Item, Broad Location</string>
+            <string>Level 0 Keycard (GREY)</string>
+           </property>
+          </item>
+          <item row="3" column="3">
+           <property name="text">
+            <string>Regular Hint, Featural</string>
            </property>
           </item>
           <item row="4" column="0">
@@ -480,7 +508,12 @@
           </item>
           <item row="4" column="2">
            <property name="text">
-            <string>Infant Metroids, Configurable Precision</string>
+            <string>Unlocked</string>
+           </property>
+          </item>
+          <item row="4" column="3">
+           <property name="text">
+            <string>Specific Infant Metroids, Configurable Precision</string>
            </property>
           </item>
           <item row="5" column="0">
@@ -495,7 +528,12 @@
           </item>
           <item row="5" column="2">
            <property name="text">
-            <string>Broad Item, Broad Location</string>
+            <string>Level 2 Keycard (GREEN)</string>
+           </property>
+          </item>
+          <item row="5" column="3">
+           <property name="text">
+            <string>Regular Hint, Featural</string>
            </property>
           </item>
           <item row="6" column="0">
@@ -510,7 +548,12 @@
           </item>
           <item row="6" column="2">
            <property name="text">
-            <string>Broad Item, Broad Location</string>
+            <string>Level 2 Keycard (GREEN)</string>
+           </property>
+          </item>
+          <item row="6" column="3">
+           <property name="text">
+            <string>Regular Hint, Featural</string>
            </property>
           </item>
           <item row="7" column="0">
@@ -525,7 +568,12 @@
           </item>
           <item row="7" column="2">
            <property name="text">
-            <string>Broad Item, Broad Location</string>
+            <string>Level 3 Keycard (YELLOW)</string>
+           </property>
+          </item>
+          <item row="7" column="3">
+           <property name="text">
+            <string>Regular Hint, Featural</string>
            </property>
           </item>
           <item row="8" column="0">
@@ -540,7 +588,12 @@
           </item>
           <item row="8" column="2">
            <property name="text">
-            <string>Broad Item, Broad Location</string>
+            <string>Level 3 Keycard (YELLOW)</string>
+           </property>
+          </item>
+          <item row="8" column="3">
+           <property name="text">
+            <string>Regular Hint, Featural</string>
            </property>
           </item>
           <item row="9" column="0">
@@ -555,7 +608,12 @@
           </item>
           <item row="9" column="2">
            <property name="text">
-            <string>Broad Item, Broad Location</string>
+            <string>Level 4 Keycard (RED)</string>
+           </property>
+          </item>
+          <item row="9" column="3">
+           <property name="text">
+            <string>Regular Hint, Featural</string>
            </property>
           </item>
           <item row="10" column="0">
@@ -570,7 +628,12 @@
           </item>
           <item row="10" column="2">
            <property name="text">
-            <string>Broad Item, Broad Location</string>
+            <string>Level 4 Keycard (RED)</string>
+           </property>
+          </item>
+          <item row="10" column="3">
+           <property name="text">
+            <string>Regular Hint, Featural</string>
            </property>
           </item>
          </widget>
@@ -636,6 +699,11 @@
     </property>
    </layout>
   </widget>
+  <widget class="LocationHintFeatureTab" name="location_hint_features_tab">
+   <attribute name="title">
+    <string>Location Hint Features</string>
+   </attribute>
+  </widget>
  </widget>
  <layoutdefault spacing="6" margin="11"/>
  <customwidgets>
@@ -651,6 +719,11 @@
    <header location="global">randovania.gui.widgets.hint_feature_tab</header>
    <container>1</container>
   </customwidget>
+  <customwidget>
+   <class>LocationHintFeatureTab</class>
+   <extends>QWidget</extends>
+   <header location="global">randovania.gui.widgets.hint_feature_tab</header>
+  </customwidget>
  </customwidgets>
  <resources/>
  <connections/>
diff --git a/randovania/games/fusion/logic_database/Main Deck.json b/randovania/games/fusion/logic_database/Main Deck.json
index a942ce7418..0e3f8cea31 100644
--- a/randovania/games/fusion/logic_database/Main Deck.json	
+++ b/randovania/games/fusion/logic_database/Main Deck.json	
@@ -6289,7 +6289,9 @@
         },
         "Operations Ventilation": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "climbable"
+            ],
             "extra": {
                 "map_name": "Main Deck35",
                 "room_id": [
@@ -7168,7 +7170,9 @@
                     "valid_starting_location": false,
                     "pickup_index": 100,
                     "location_category": "major",
-                    "hint_features": [],
+                    "hint_features": [
+                        "boss"
+                    ],
                     "connections": {
                         "Arena": {
                             "type": "and",
@@ -7408,7 +7412,9 @@
         },
         "Operations Deck Data Room": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "data_room"
+            ],
             "extra": {
                 "map_name": "Main Deck39",
                 "room_id": [
@@ -9207,7 +9213,9 @@
         },
         "Silo Scaffolding": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "climbable"
+            ],
             "extra": {
                 "map_name": "Main Deck51",
                 "room_id": [
@@ -11261,7 +11269,9 @@
         },
         "Habitation Deck": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "shutter"
+            ],
             "extra": {
                 "map_name": "Main Deck69",
                 "room_id": [
diff --git a/randovania/games/fusion/logic_database/Main Deck.txt b/randovania/games/fusion/logic_database/Main Deck.txt
index 97d30a4098..50e7ea8e38 100644
--- a/randovania/games/fusion/logic_database/Main Deck.txt	
+++ b/randovania/games/fusion/logic_database/Main Deck.txt	
@@ -1029,6 +1029,7 @@ Extra - room_id: [34, 43]
 Operations Ventilation
 Extra - map_name: Main Deck35
 Extra - room_id: [35, 36]
+Hint Features - Climbable Surface
 > Pickup (Missile Tank); Heals? False
   * Layers: default
   * Pickup 2; Category? Minor
@@ -1171,6 +1172,7 @@ Extra - room_id: [38]
 > Pickup (Morph Ball); Heals? False
   * Layers: default
   * Pickup 100; Category? Major
+  * Hint Features - Boss
   * Extra - area: 0
   * Extra - room: 38
   * Extra - source: Arachnus
@@ -1215,6 +1217,7 @@ Extra - room_id: [38]
 Operations Deck Data Room
 Extra - map_name: Main Deck39
 Extra - room_id: [39]
+Hint Features - Data Room
 > Door to Operations Deck Navigation Room; Heals? False
   * Layers: default
   * L0 Hatch to Operations Deck Navigation Room/Door to Operations Deck Data Room
@@ -1519,6 +1522,7 @@ Extra - room_id: [50]
 Silo Scaffolding
 Extra - map_name: Main Deck51
 Extra - room_id: [51]
+Hint Features - Climbable Surface
 > Pickup (Missile Tank); Heals? False
   * Layers: default
   * Pickup 7; Category? Minor
@@ -1891,6 +1895,7 @@ Extra - room_id: [67]
 Habitation Deck
 Extra - map_name: Main Deck69
 Extra - room_id: [69]
+Hint Features - 1-way Shutter
 > Pickup (Missile Tank); Heals? False
   * Layers: default
   * Pickup 9; Category? Minor
diff --git a/randovania/games/fusion/logic_database/Sector 1 SRX.json b/randovania/games/fusion/logic_database/Sector 1 SRX.json
index 322b99415a..0e8c9d8b92 100644
--- a/randovania/games/fusion/logic_database/Sector 1 SRX.json	
+++ b/randovania/games/fusion/logic_database/Sector 1 SRX.json	
@@ -3611,7 +3611,9 @@
         },
         "Lava Lake": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "climbable"
+            ],
             "extra": {
                 "map_name": "Sector 117",
                 "room_id": [
@@ -6626,7 +6628,9 @@
         },
         "Ridley Arena": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "boss"
+            ],
             "extra": {
                 "map_name": "Sector 127",
                 "room_id": [
@@ -7525,7 +7529,9 @@
         },
         "Ripper Maze": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "climbable"
+            ],
             "extra": {
                 "map_name": "Sector 130",
                 "room_id": [
@@ -10515,7 +10521,9 @@
         },
         "Charge Core Arena": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "boss"
+            ],
             "extra": {
                 "map_name": "Sector 140",
                 "room_id": [
@@ -11534,7 +11542,9 @@
         },
         "Watering Hole": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "climbable"
+            ],
             "extra": {
                 "map_name": "Sector 147",
                 "room_id": [
diff --git a/randovania/games/fusion/logic_database/Sector 1 SRX.txt b/randovania/games/fusion/logic_database/Sector 1 SRX.txt
index a0813bd0bd..9b477d2b81 100644
--- a/randovania/games/fusion/logic_database/Sector 1 SRX.txt	
+++ b/randovania/games/fusion/logic_database/Sector 1 SRX.txt	
@@ -592,6 +592,7 @@ Extra - room_id: [16]
 Lava Lake
 Extra - map_name: Sector 117
 Extra - room_id: [17]
+Hint Features - Climbable Surface
 > Pickup (Missile Tank on Cliffside); Heals? False
   * Layers: default
   * Pickup 14; Category? Minor
@@ -990,6 +991,7 @@ Extra - room_id: [26]
 Ridley Arena
 Extra - map_name: Sector 127
 Extra - room_id: [27]
+Hint Features - Boss
 > Door to Ridley Arena Access; Heals? False
   * Layers: default
   * L0 Hatch to Ridley Arena Access/Door to Ridley Arena
@@ -1105,6 +1107,7 @@ Extra - room_id: [29]
 Ripper Maze
 Extra - map_name: Sector 130
 Extra - room_id: [30]
+Hint Features - Climbable Surface
 > Pickup (Hidden Energy Tank); Heals? False
   * Layers: default
   * Pickup 17; Category? Major
@@ -1524,6 +1527,7 @@ Extra - room_id: [39]
 Charge Core Arena
 Extra - map_name: Sector 140
 Extra - room_id: [40]
+Hint Features - Boss
 > Pickup (Energy Tank); Heals? False
   * Layers: default
   * Pickup 19; Category? Major
@@ -1712,6 +1716,7 @@ Extra - room_id: [46]
 Watering Hole
 Extra - map_name: Sector 147
 Extra - room_id: [47]
+Hint Features - Climbable Surface
 > Pickup (Hidden Power Bomb Tank); Heals? False
   * Layers: default
   * Pickup 22; Category? Minor
diff --git a/randovania/games/fusion/logic_database/Sector 2 TRO.json b/randovania/games/fusion/logic_database/Sector 2 TRO.json
index 9590213a29..19bb2e5917 100644
--- a/randovania/games/fusion/logic_database/Sector 2 TRO.json	
+++ b/randovania/games/fusion/logic_database/Sector 2 TRO.json	
@@ -1211,7 +1211,9 @@
         },
         "Data Room": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "data_room"
+            ],
             "extra": {
                 "map_name": "Sector 28",
                 "room_id": [
@@ -1294,7 +1296,9 @@
         },
         "Zoro Zig-Zag": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "pillar"
+            ],
             "extra": {
                 "map_name": "Sector 29",
                 "room_id": [
@@ -3631,7 +3635,9 @@
         },
         "Zazabi Arena": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "boss"
+            ],
             "extra": {
                 "map_name": "Sector 218",
                 "room_id": [
@@ -4736,7 +4742,9 @@
         },
         "Nettori Arena": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "boss"
+            ],
             "extra": {
                 "map_name": "Sector 222",
                 "room_id": [
@@ -5828,7 +5836,9 @@
         },
         "Oasis Storage": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "pillar"
+            ],
             "extra": {
                 "map_name": "Sector 225",
                 "room_id": [
@@ -6046,7 +6056,9 @@
         },
         "Level 1 Security Room": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "security_room"
+            ],
             "extra": {
                 "map_name": "Sector 226",
                 "room_id": [
@@ -9334,7 +9346,9 @@
         },
         "Oasis": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "climbable"
+            ],
             "extra": {
                 "map_name": "Sector 242",
                 "room_id": [
@@ -10481,7 +10495,9 @@
         },
         "Ripper Tower": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "climbable"
+            ],
             "extra": {
                 "map_name": "Sector 250",
                 "room_id": [
@@ -11212,7 +11228,9 @@
         },
         "Zazabi Speedway": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "boss"
+            ],
             "extra": {
                 "map_name": "Sector 255",
                 "room_id": [
diff --git a/randovania/games/fusion/logic_database/Sector 2 TRO.txt b/randovania/games/fusion/logic_database/Sector 2 TRO.txt
index 6c4256bfb5..24139b1d59 100644
--- a/randovania/games/fusion/logic_database/Sector 2 TRO.txt	
+++ b/randovania/games/fusion/logic_database/Sector 2 TRO.txt	
@@ -227,6 +227,7 @@ Extra - room_id: [6]
 Data Room
 Extra - map_name: Sector 28
 Extra - room_id: [8]
+Hint Features - Data Room
 > Door to Data Courtyard; Heals? False
   * Layers: default
   * L1 Hatch to Data Courtyard/Door to Data Room
@@ -247,6 +248,7 @@ Extra - room_id: [8]
 Zoro Zig-Zag
 Extra - map_name: Sector 29
 Extra - room_id: [9]
+Hint Features - Pillar
 > Pickup (Missile Tank); Heals? False
   * Layers: default
   * Pickup 26; Category? Minor
@@ -627,6 +629,7 @@ Extra - room_id: [17]
 Zazabi Arena
 Extra - map_name: Sector 218
 Extra - room_id: [18]
+Hint Features - Boss
 > Door to Zazabi Arena Access; Heals? False
   * Layers: default
   * L0 Hatch to Zazabi Arena Access/Door to Zazabi Arena
@@ -801,6 +804,7 @@ Extra - room_id: [21]
 Nettori Arena
 Extra - map_name: Sector 222
 Extra - room_id: [22, 51]
+Hint Features - Boss
 > Door to Shooting Gallery; Heals? False
   * Layers: default
   * L0 Hatch to Shooting Gallery/Door to Nettori Arena
@@ -932,6 +936,7 @@ Extra - room_id: [24, 36]
 Oasis Storage
 Extra - map_name: Sector 225
 Extra - room_id: [25]
+Hint Features - Pillar
 > Pickup (Missile Tank); Heals? False
   * Layers: default
   * Pickup 30; Category? Minor
@@ -970,6 +975,7 @@ Extra - room_id: [25]
 Level 1 Security Room
 Extra - map_name: Sector 226
 Extra - room_id: [26]
+Hint Features - Security Room
 > Door to Security Access (Lower); Heals? False
   * Layers: default
   * L1 Hatch to Security Access/Door to Level 1 Security Room (Lower)
@@ -1456,6 +1462,7 @@ Extra - room_id: [41]
 Oasis
 Extra - map_name: Sector 242
 Extra - room_id: [42]
+Hint Features - Climbable Surface
 > Pickup (Missile Tank); Heals? False
   * Layers: default
   * Pickup 34; Category? Minor
@@ -1637,6 +1644,7 @@ Extra - unlocked_save_recharge_station: True
 Ripper Tower
 Extra - map_name: Sector 250
 Extra - room_id: [50]
+Hint Features - Climbable Surface
 > Pickup (Power Bomb Tank); Heals? False
   * Layers: default
   * Pickup 36; Category? Minor
@@ -1775,6 +1783,7 @@ Extra - room_id: [54]
 Zazabi Speedway
 Extra - map_name: Sector 255
 Extra - room_id: [55]
+Hint Features - Boss
 > Pickup (Power Bomb Tank); Heals? False
   * Layers: default
   * Pickup 40; Category? Minor
diff --git a/randovania/games/fusion/logic_database/Sector 3 PYR.json b/randovania/games/fusion/logic_database/Sector 3 PYR.json
index 193b8330ed..57e0e1b776 100644
--- a/randovania/games/fusion/logic_database/Sector 3 PYR.json	
+++ b/randovania/games/fusion/logic_database/Sector 3 PYR.json	
@@ -1076,7 +1076,9 @@
         },
         "Level 2 Security Room": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "security_room"
+            ],
             "extra": {
                 "map_name": "Sector 34",
                 "room_id": [
@@ -1925,7 +1927,9 @@
         },
         "Alcove": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "pillar"
+            ],
             "extra": {
                 "map_name": "Sector 38",
                 "room_id": [
@@ -3756,7 +3760,9 @@
         },
         "Lava Maze": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "climbable"
+            ],
             "extra": {
                 "map_name": "Sector 312",
                 "room_id": [
@@ -5211,7 +5217,9 @@
         },
         "Sova Processing": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "shutter"
+            ],
             "extra": {
                 "map_name": "Sector 319",
                 "room_id": [
@@ -6235,7 +6243,10 @@
         },
         "Data Room": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "boss",
+                "data_room"
+            ],
             "extra": {
                 "map_name": "Sector 321",
                 "room_id": [
@@ -7019,7 +7030,9 @@
         },
         "Main Boiler Control Room": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "boss"
+            ],
             "extra": {
                 "map_name": "Sector 325",
                 "room_id": [
@@ -8386,7 +8399,9 @@
         },
         "Fiery Storage": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "pillar"
+            ],
             "extra": {
                 "map_name": "Sector 328",
                 "room_id": [
diff --git a/randovania/games/fusion/logic_database/Sector 3 PYR.txt b/randovania/games/fusion/logic_database/Sector 3 PYR.txt
index c31f400158..3ccd9daefa 100644
--- a/randovania/games/fusion/logic_database/Sector 3 PYR.txt	
+++ b/randovania/games/fusion/logic_database/Sector 3 PYR.txt	
@@ -180,6 +180,7 @@ Extra - room_id: [3]
 Level 2 Security Room
 Extra - map_name: Sector 34
 Extra - room_id: [4]
+Hint Features - Security Room
 > Door to Security Access; Heals? False
   * Layers: default
   * L2 Hatch to Security Access/Door to Level 2 Security Room
@@ -306,6 +307,7 @@ Extra - room_id: [6, 24]
 Alcove
 Extra - map_name: Sector 38
 Extra - room_id: [8]
+Hint Features - Pillar
 > Pickup (Power Bomb Tank); Heals? False
   * Layers: default
   * Pickup 44; Category? Minor
@@ -576,6 +578,7 @@ Extra - room_id: [11]
 Lava Maze
 Extra - map_name: Sector 312
 Extra - room_id: [12]
+Hint Features - Climbable Surface
 > Pickup (Power Bomb Tank); Heals? False
   * Layers: default
   * Pickup 47; Category? Minor
@@ -773,6 +776,7 @@ Extra - room_id: [17, 29]
 Sova Processing
 Extra - map_name: Sector 319
 Extra - room_id: [19]
+Hint Features - 1-way Shutter
 > Pickup (Energy Tank); Heals? False
   * Layers: default
   * Pickup 48; Category? Major
@@ -910,6 +914,7 @@ Extra - room_id: [20]
 Data Room
 Extra - map_name: Sector 321
 Extra - room_id: [21]
+Hint Features - Boss, Data Room
 > Door to B.O.X. Arena; Heals? False
   * Layers: default
   * L2 Hatch to B.O.X. Arena/Door to Data Room
@@ -1025,6 +1030,7 @@ Extra - room_id: [23, 18]
 Main Boiler Control Room
 Extra - map_name: Sector 325
 Extra - room_id: [25]
+Hint Features - Boss
 > Door to Main Boiler; Heals? False
   * Layers: default
   * L0 Hatch to Main Boiler/Door to Main Boiler Control Room
@@ -1192,6 +1198,7 @@ Extra - room_id: [27]
 Fiery Storage
 Extra - map_name: Sector 328
 Extra - room_id: [28]
+Hint Features - Pillar
 > Pickup (Energy Tank); Heals? False
   * Layers: default
   * Pickup 50; Category? Major
diff --git a/randovania/games/fusion/logic_database/Sector 4 AQA.json b/randovania/games/fusion/logic_database/Sector 4 AQA.json
index 437f7c58da..3fed70b317 100644
--- a/randovania/games/fusion/logic_database/Sector 4 AQA.json	
+++ b/randovania/games/fusion/logic_database/Sector 4 AQA.json	
@@ -1523,7 +1523,9 @@
         },
         "Data Room": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "data_room"
+            ],
             "extra": {
                 "map_name": "Sector 44",
                 "room_id": [
@@ -1698,7 +1700,9 @@
         },
         "Reservoir East": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "climbable"
+            ],
             "extra": {
                 "map_name": "Sector 46",
                 "room_id": [
@@ -9319,7 +9323,9 @@
         },
         "Level 4 Security Room": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "security_room"
+            ],
             "extra": {
                 "map_name": "Sector 426",
                 "room_id": [
@@ -10491,7 +10497,9 @@
         },
         "Pump Control Unit": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "climbable"
+            ],
             "extra": {
                 "map_name": "Sector 433",
                 "room_id": [
@@ -12600,7 +12608,9 @@
         },
         "Drain Pipe": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "shutter"
+            ],
             "extra": {
                 "map_name": "Sector 436",
                 "room_id": [
@@ -14804,7 +14814,10 @@
         },
         "Serris Arena": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "boss",
+                "climbable"
+            ],
             "extra": {
                 "map_name": "Sector 442",
                 "room_id": [
diff --git a/randovania/games/fusion/logic_database/Sector 4 AQA.txt b/randovania/games/fusion/logic_database/Sector 4 AQA.txt
index 10687c8145..0677c96941 100644
--- a/randovania/games/fusion/logic_database/Sector 4 AQA.txt	
+++ b/randovania/games/fusion/logic_database/Sector 4 AQA.txt	
@@ -216,6 +216,7 @@ Extra - room_id: [3]
 Data Room
 Extra - map_name: Sector 44
 Extra - room_id: [4]
+Hint Features - Data Room
 > Door to Powamp Playhouse; Heals? False
   * Layers: default
   * L4 Hatch to Powamp Playhouse/Door to Data Room
@@ -254,6 +255,7 @@ Extra - room_id: [5]
 Reservoir East
 Extra - map_name: Sector 46
 Extra - room_id: [6]
+Hint Features - Climbable Surface
 > Pickup (Hidden Power Bomb Tank); Heals? False
   * Layers: default
   * Pickup 58; Category? Minor
@@ -1322,6 +1324,7 @@ Extra - room_id: [25]
 Level 4 Security Room
 Extra - map_name: Sector 426
 Extra - room_id: [26]
+Hint Features - Security Room
 > Door to Security Access; Heals? False
   * Layers: default
   * L4 Hatch to Security Access/Door to Level 4 Security Room
@@ -1520,6 +1523,7 @@ Extra - unlocked_save_recharge_station: True
 Pump Control Unit
 Extra - map_name: Sector 433
 Extra - room_id: [33]
+Hint Features - Climbable Surface
 > Pickup (Missile Tank); Heals? False
   * Layers: default
   * Pickup 67; Category? Minor
@@ -1779,6 +1783,7 @@ Extra - room_id: [35]
 Drain Pipe
 Extra - map_name: Sector 436
 Extra - room_id: [36]
+Hint Features - 1-way Shutter
 > Pickup (Hidden Missile Tank); Heals? False
   * Layers: default
   * Pickup 68; Category? Minor
@@ -2070,6 +2075,7 @@ Extra - room_id: [41]
 Serris Arena
 Extra - map_name: Sector 442
 Extra - room_id: [42]
+Hint Features - Boss, Climbable Surface
 > Door to Serris Speedway; Heals? False
   * Layers: default
   * L0 Hatch to Serris Speedway/Door to Serris Arena
diff --git a/randovania/games/fusion/logic_database/Sector 5 ARC.json b/randovania/games/fusion/logic_database/Sector 5 ARC.json
index 3601f7031e..f58f14f9a3 100644
--- a/randovania/games/fusion/logic_database/Sector 5 ARC.json	
+++ b/randovania/games/fusion/logic_database/Sector 5 ARC.json	
@@ -2462,7 +2462,9 @@
         },
         "Level 3 Security Room": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "security_room"
+            ],
             "extra": {
                 "map_name": "Sector 510",
                 "room_id": [
@@ -3623,7 +3625,9 @@
         },
         "Mini-Fridge": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "pillar"
+            ],
             "extra": {
                 "map_name": "Sector 514",
                 "room_id": [
@@ -3789,7 +3793,9 @@
         },
         "Data Room": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "data_room"
+            ],
             "extra": {
                 "map_name": "Sector 516",
                 "room_id": [
@@ -4684,7 +4690,10 @@
         },
         "Nightmare Arena": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "boss",
+                "climbable"
+            ],
             "extra": {
                 "map_name": "Sector 520",
                 "room_id": [
@@ -8157,7 +8166,9 @@
         },
         "Crow's Nest": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "shutter"
+            ],
             "extra": {
                 "map_name": "Sector 536",
                 "room_id": [
diff --git a/randovania/games/fusion/logic_database/Sector 5 ARC.txt b/randovania/games/fusion/logic_database/Sector 5 ARC.txt
index 27e2656766..03586f4f29 100644
--- a/randovania/games/fusion/logic_database/Sector 5 ARC.txt	
+++ b/randovania/games/fusion/logic_database/Sector 5 ARC.txt	
@@ -362,6 +362,7 @@ Extra - room_id: [9]
 Level 3 Security Room
 Extra - map_name: Sector 510
 Extra - room_id: [10]
+Hint Features - Security Room
 > Door to Security Shaft West; Heals? False
   * Layers: default
   * L3 Hatch to Security Shaft West/Door to Level 3 Security Room
@@ -531,6 +532,7 @@ Extra - room_id: [13]
 Mini-Fridge
 Extra - map_name: Sector 514
 Extra - room_id: [14]
+Hint Features - Pillar
 > Pickup (Energy Tank); Heals? False
   * Layers: default
   * Pickup 76; Category? Major
@@ -561,6 +563,7 @@ Extra - room_id: [14]
 Data Room
 Extra - map_name: Sector 516
 Extra - room_id: [16]
+Hint Features - Data Room
 > Other to Crow's Nest; Heals? False
   * Layers: default
   * Destroyed Door to Crow's Nest/Other to Data Room
@@ -722,6 +725,7 @@ Extra - room_id: [19]
 Nightmare Arena
 Extra - map_name: Sector 520
 Extra - room_id: [20]
+Hint Features - Boss, Climbable Surface
 > Door to Nightmare Lower Access; Heals? False
   * Layers: default
   * L0 Hatch to Nightmare Lower Access/Door to Nightmare Arena
@@ -1261,6 +1265,7 @@ Extra - room_id: [35]
 Crow's Nest
 Extra - map_name: Sector 536
 Extra - room_id: [36]
+Hint Features - 1-way Shutter
 > Pickup (Hidden Power Bomb Tank); Heals? False
   * Layers: default
   * Pickup 84; Category? Minor
diff --git a/randovania/games/fusion/logic_database/Sector 6 NOC.json b/randovania/games/fusion/logic_database/Sector 6 NOC.json
index 8c75879679..7fce58dcb5 100644
--- a/randovania/games/fusion/logic_database/Sector 6 NOC.json	
+++ b/randovania/games/fusion/logic_database/Sector 6 NOC.json	
@@ -4043,7 +4043,9 @@
         },
         "Varia Core-X Arena": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "boss"
+            ],
             "extra": {
                 "map_name": "Sector 613",
                 "room_id": [
@@ -5160,7 +5162,10 @@
         },
         "X-B.O.X. Arena": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "boss",
+                "climbable"
+            ],
             "extra": {
                 "map_name": "Sector 616",
                 "room_id": [
@@ -6229,7 +6234,10 @@
         },
         "X-B.O.X. Garage": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "boss",
+                "shutter"
+            ],
             "extra": {
                 "map_name": "Sector 618",
                 "room_id": [
@@ -8030,7 +8038,9 @@
         },
         "Twin Caverns West": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "climbable"
+            ],
             "extra": {
                 "map_name": "Sector 630",
                 "room_id": [
@@ -9458,7 +9468,9 @@
         },
         "Pillar Highway": {
             "default_node": null,
-            "hint_features": [],
+            "hint_features": [
+                "pillar"
+            ],
             "extra": {
                 "map_name": "Sector 638",
                 "room_id": [
diff --git a/randovania/games/fusion/logic_database/Sector 6 NOC.txt b/randovania/games/fusion/logic_database/Sector 6 NOC.txt
index 736a22b12d..288532721c 100644
--- a/randovania/games/fusion/logic_database/Sector 6 NOC.txt	
+++ b/randovania/games/fusion/logic_database/Sector 6 NOC.txt	
@@ -562,6 +562,7 @@ Extra - room_id: [12]
 Varia Core-X Arena
 Extra - map_name: Sector 613
 Extra - room_id: [13]
+Hint Features - Boss
 > Door to Data Room; Heals? False
   * Layers: default
   * L2 Hatch to Data Room/Door to Varia Core-X Arena
@@ -700,6 +701,7 @@ Extra - room_id: [15]
 X-B.O.X. Arena
 Extra - map_name: Sector 616
 Extra - room_id: [16]
+Hint Features - Boss, Climbable Surface
 > Door to X-B.O.X. Arena Access; Heals? False
   * Layers: default
   * L0 Hatch to X-B.O.X. Arena Access/Door to X-B.O.X. Arena
@@ -833,6 +835,7 @@ Extra - room_id: [17]
 X-B.O.X. Garage
 Extra - map_name: Sector 618
 Extra - room_id: [18]
+Hint Features - Boss, 1-way Shutter
 > Pickup (Hidden Power Bomb Tank); Heals? False
   * Layers: default
   * Pickup 90; Category? Minor
@@ -1153,6 +1156,7 @@ Extra - unlocked_save_recharge_station: True
 Twin Caverns West
 Extra - map_name: Sector 630
 Extra - room_id: [30]
+Hint Features - Climbable Surface
 > Pickup (Missile Tank); Heals? False
   * Layers: default
   * Pickup 94; Category? Minor
@@ -1384,6 +1388,7 @@ Extra - room_id: [37]
 Pillar Highway
 Extra - map_name: Sector 638
 Extra - room_id: [38]
+Hint Features - Pillar
 > Pickup (Energy Tank); Heals? False
   * Layers: default
   * Pickup 97; Category? Major
diff --git a/randovania/games/fusion/logic_database/header.json b/randovania/games/fusion/logic_database/header.json
index 15591a903e..8fbb6d4269 100644
--- a/randovania/games/fusion/logic_database/header.json
+++ b/randovania/games/fusion/logic_database/header.json
@@ -2804,7 +2804,51 @@
             "to_shuffle_proportion": 1.0
         }
     },
-    "hint_feature_database": {},
+    "hint_feature_database": {
+        "data_room": {
+            "long_name": "Data Room",
+            "hint_details": [
+                "",
+                "in a Data Room"
+            ]
+        },
+        "security_room": {
+            "long_name": "Security Room",
+            "hint_details": [
+                "",
+                "in a Security Room"
+            ]
+        },
+        "boss": {
+            "long_name": "Boss",
+            "hint_details": [
+                "",
+                "guarded by a boss"
+            ]
+        },
+        "shutter": {
+            "long_name": "1-way Shutter",
+            "hint_details": [
+                "",
+                "near a 1-way Shutter"
+            ]
+        },
+        "climbable": {
+            "long_name": "Climbable Surface",
+            "hint_details": [
+                "",
+                "near a climbable surface"
+            ],
+            "description": "This includes ladders and monkeybars, not ledges."
+        },
+        "pillar": {
+            "long_name": "Pillar",
+            "hint_details": [
+                "",
+                "near an extendable pillar"
+            ]
+        }
+    },
     "used_trick_levels": {
         "Combat": [
             1,
diff --git a/randovania/games/fusion/pickup_database/pickup-database.json b/randovania/games/fusion/pickup_database/pickup-database.json
index 3d3889146b..20915b7c1e 100644
--- a/randovania/games/fusion/pickup_database/pickup-database.json
+++ b/randovania/games/fusion/pickup_database/pickup-database.json
@@ -13,14 +13,16 @@
             "hint_details": [
                 "a ",
                 "missile system"
-            ]
+            ],
+            "hidden": true
         },
         "morph_ball": {
             "long_name": "Morph Ball",
             "hint_details": [
                 "a ",
                 "morph ball system"
-            ]
+            ],
+            "hidden": true
         },
         "movement": {
             "long_name": "Movement",
@@ -50,13 +52,6 @@
                 "morph ball-related upgrade"
             ]
         },
-        "beam_related": {
-            "long_name": "Beam Related",
-            "hint_details": [
-                "a ",
-                "beam-related upgrade"
-            ]
-        },
         "missile_related": {
             "long_name": "Missile Related",
             "hint_details": [
@@ -104,7 +99,16 @@
             "hint_details": [
                 "a ",
                 "key"
-            ]
+            ],
+            "hidden": true
+        },
+        "charge": {
+            "long_name": "Charge",
+            "hint_details": [
+                "a ",
+                "beam"
+            ],
+            "hidden": true
         }
     },
     "generated_pickups": {
@@ -130,8 +134,8 @@
             "gui_category": "beam",
             "hint_features": [
                 "beam",
-                "beam_related",
-                "major"
+                "major",
+                "charge"
             ],
             "model_name": "ChargeBeam",
             "offworld_models": {
@@ -157,7 +161,6 @@
             "gui_category": "beam",
             "hint_features": [
                 "beam",
-                "beam_related",
                 "major"
             ],
             "model_name": "WideBeam",
@@ -183,7 +186,6 @@
             "gui_category": "beam",
             "hint_features": [
                 "beam",
-                "beam_related",
                 "major"
             ],
             "model_name": "PlasmaBeam",
@@ -209,7 +211,6 @@
             "gui_category": "beam",
             "hint_features": [
                 "beam",
-                "beam_related",
                 "major"
             ],
             "model_name": "WaveBeam",
@@ -235,7 +236,6 @@
             "gui_category": "beam",
             "hint_features": [
                 "beam",
-                "beam_related",
                 "major"
             ],
             "model_name": "IceBeam",
diff --git a/test/games/fusion/generator/test_fusion_hint_distributor.py b/test/games/fusion/generator/test_fusion_hint_distributor.py
new file mode 100644
index 0000000000..e7b3470c4f
--- /dev/null
+++ b/test/games/fusion/generator/test_fusion_hint_distributor.py
@@ -0,0 +1,41 @@
+from __future__ import annotations
+
+from unittest.mock import MagicMock
+
+import pytest
+
+from randovania.game_description.assignment import PickupTarget
+from randovania.game_description.db.hint_node import HintNode
+from randovania.game_description.db.node_identifier import NodeIdentifier
+from randovania.games.fusion.generator.hint_distributor import FusionHintDistributor
+
+
+@pytest.mark.parametrize(
+    ("target_pickup", "target_player", "features", "expected"),
+    [
+        ("Charge Beam", 0, {"beam", "charge"}, False),
+        ("Gravity Suit", 0, {"suit", "life_support"}, True),
+        ("Infant Metroid 1", 0, {"key"}, False),
+        ("Energy Tank", 0, {"energy_tank"}, True),
+    ],
+)
+def test_fusion_interesting_pickups(
+    target_pickup: str, target_player: int, features: set[str], expected: bool, fusion_game_description
+):
+    # Setup
+    hint_node = fusion_game_description.region_list.typed_node_by_identifier(
+        NodeIdentifier.create("Sector 1 (SRX)", "Entrance Navigation Room", "Navigation Terminal"),
+        HintNode,
+    )
+    hint_distributor = FusionHintDistributor()
+
+    target = MagicMock(spec=PickupTarget)
+    target.pickup.name = target_pickup
+    target.pickup.has_hint_feature = lambda feat: feat in features
+    target.player = target_player
+
+    # Run
+    result = hint_distributor.is_pickup_interesting(target, 0, hint_node)
+
+    # Assert
+    assert result == expected
diff --git a/test/test_files/patcher_data/fusion/fusion/all_hidden_with_nothing/world_1.json b/test/test_files/patcher_data/fusion/fusion/all_hidden_with_nothing/world_1.json
index 7ae3186fd1..8db27aec4a 100644
--- a/test/test_files/patcher_data/fusion/fusion/all_hidden_with_nothing/world_1.json
+++ b/test/test_files/patcher_data/fusion/fusion/all_hidden_with_nothing/world_1.json
@@ -2246,17 +2246,17 @@
     "NavigationText": {
         "JapaneseKanji": {
             "NavigationTerminals": {
-                "MainDeckEast": "Hint system still in development, we appreciate your patience.",
-                "MainDeckWest": "Hint system still in development, we appreciate your patience.",
-                "OperationsDeck": "Hint system still in development, we appreciate your patience.",
+                "MainDeckEast": "The [COLOR=3]Ice Missile Data[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "MainDeckWest": "The [COLOR=3]Level 3 Keycard[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "OperationsDeck": "The [COLOR=3]Level 1 Keycard[/COLOR] can be found in [COLOR=2]Sector 2 (TRO)[/COLOR].",
                 "AuxiliaryPower": "[COLOR=3]Charge Beam[/COLOR] is located in [COLOR=2]Sector 6 (NOC)[/COLOR].",
                 "RestrictedLabs": "[COLOR=3]Infant Metroid 1[/COLOR] is located in [COLOR=2]Sector 6 (NOC) - Varia Core-X Arena[/COLOR]. [COLOR=3]Infant Metroid 2[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Charge Core Arena[/COLOR]. [COLOR=3]Infant Metroid 3[/COLOR] is located in [COLOR=2]Main Deck - Yakuza Arena[/COLOR]. [COLOR=3]Infant Metroid 4[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Ridley Arena[/COLOR]. [COLOR=3]Infant Metroid 5[/COLOR] is located in [COLOR=2]Sector 2 (TRO) - Nettori Arena[/COLOR].",
-                "Sector1Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector2Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector3Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector4Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector5Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector6Entrance": "Hint system still in development, we appreciate your patience."
+                "Sector1Entrance": "The [COLOR=3]Varia Suit[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector2Entrance": "The [COLOR=3]Wave Beam[/COLOR] can be found in [COLOR=2]Sector 4 (AQA)[/COLOR].",
+                "Sector3Entrance": "The [COLOR=3]Super Missile Data[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "Sector4Entrance": "The [COLOR=3]Screw Attack[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector5Entrance": "The [COLOR=3]Charge Beam[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR].",
+                "Sector6Entrance": "The [COLOR=3]Hi-Jump[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR]."
             },
             "ShipText": {
                 "InitialText": "Your objective is as follows: the [COLOR=3]SA-X[/COLOR] has discovered and destroyed a top secret [COLOR=3]Metroid[/COLOR] breeding facility. It released 5 infant Metroids into the station. Initial scans indicate that they are hiding at bosses. Find and capture 4 of them, to lure out the SA-X. Then initiate the station's self-destruct sequence. Uplink at [COLOR=2]Navigation Rooms[/COLOR] along the way. I can scan the station for useful equipment from there.[OBJECTIVE]Good. Move out.",
@@ -2265,17 +2265,17 @@
         },
         "JapaneseHiragana": {
             "NavigationTerminals": {
-                "MainDeckEast": "Hint system still in development, we appreciate your patience.",
-                "MainDeckWest": "Hint system still in development, we appreciate your patience.",
-                "OperationsDeck": "Hint system still in development, we appreciate your patience.",
+                "MainDeckEast": "The [COLOR=3]Ice Missile Data[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "MainDeckWest": "The [COLOR=3]Level 3 Keycard[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "OperationsDeck": "The [COLOR=3]Level 1 Keycard[/COLOR] can be found in [COLOR=2]Sector 2 (TRO)[/COLOR].",
                 "AuxiliaryPower": "[COLOR=3]Charge Beam[/COLOR] is located in [COLOR=2]Sector 6 (NOC)[/COLOR].",
                 "RestrictedLabs": "[COLOR=3]Infant Metroid 1[/COLOR] is located in [COLOR=2]Sector 6 (NOC) - Varia Core-X Arena[/COLOR]. [COLOR=3]Infant Metroid 2[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Charge Core Arena[/COLOR]. [COLOR=3]Infant Metroid 3[/COLOR] is located in [COLOR=2]Main Deck - Yakuza Arena[/COLOR]. [COLOR=3]Infant Metroid 4[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Ridley Arena[/COLOR]. [COLOR=3]Infant Metroid 5[/COLOR] is located in [COLOR=2]Sector 2 (TRO) - Nettori Arena[/COLOR].",
-                "Sector1Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector2Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector3Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector4Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector5Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector6Entrance": "Hint system still in development, we appreciate your patience."
+                "Sector1Entrance": "The [COLOR=3]Varia Suit[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector2Entrance": "The [COLOR=3]Wave Beam[/COLOR] can be found in [COLOR=2]Sector 4 (AQA)[/COLOR].",
+                "Sector3Entrance": "The [COLOR=3]Super Missile Data[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "Sector4Entrance": "The [COLOR=3]Screw Attack[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector5Entrance": "The [COLOR=3]Charge Beam[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR].",
+                "Sector6Entrance": "The [COLOR=3]Hi-Jump[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR]."
             },
             "ShipText": {
                 "InitialText": "Your objective is as follows: the [COLOR=3]SA-X[/COLOR] has discovered and destroyed a top secret [COLOR=3]Metroid[/COLOR] breeding facility. It released 5 infant Metroids into the station. Initial scans indicate that they are hiding at bosses. Find and capture 4 of them, to lure out the SA-X. Then initiate the station's self-destruct sequence. Uplink at [COLOR=2]Navigation Rooms[/COLOR] along the way. I can scan the station for useful equipment from there.[OBJECTIVE]Good. Move out.",
@@ -2284,17 +2284,17 @@
         },
         "English": {
             "NavigationTerminals": {
-                "MainDeckEast": "Hint system still in development, we appreciate your patience.",
-                "MainDeckWest": "Hint system still in development, we appreciate your patience.",
-                "OperationsDeck": "Hint system still in development, we appreciate your patience.",
+                "MainDeckEast": "The [COLOR=3]Ice Missile Data[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "MainDeckWest": "The [COLOR=3]Level 3 Keycard[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "OperationsDeck": "The [COLOR=3]Level 1 Keycard[/COLOR] can be found in [COLOR=2]Sector 2 (TRO)[/COLOR].",
                 "AuxiliaryPower": "[COLOR=3]Charge Beam[/COLOR] is located in [COLOR=2]Sector 6 (NOC)[/COLOR].",
                 "RestrictedLabs": "[COLOR=3]Infant Metroid 1[/COLOR] is located in [COLOR=2]Sector 6 (NOC) - Varia Core-X Arena[/COLOR]. [COLOR=3]Infant Metroid 2[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Charge Core Arena[/COLOR]. [COLOR=3]Infant Metroid 3[/COLOR] is located in [COLOR=2]Main Deck - Yakuza Arena[/COLOR]. [COLOR=3]Infant Metroid 4[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Ridley Arena[/COLOR]. [COLOR=3]Infant Metroid 5[/COLOR] is located in [COLOR=2]Sector 2 (TRO) - Nettori Arena[/COLOR].",
-                "Sector1Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector2Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector3Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector4Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector5Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector6Entrance": "Hint system still in development, we appreciate your patience."
+                "Sector1Entrance": "The [COLOR=3]Varia Suit[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector2Entrance": "The [COLOR=3]Wave Beam[/COLOR] can be found in [COLOR=2]Sector 4 (AQA)[/COLOR].",
+                "Sector3Entrance": "The [COLOR=3]Super Missile Data[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "Sector4Entrance": "The [COLOR=3]Screw Attack[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector5Entrance": "The [COLOR=3]Charge Beam[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR].",
+                "Sector6Entrance": "The [COLOR=3]Hi-Jump[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR]."
             },
             "ShipText": {
                 "InitialText": "Your objective is as follows: the [COLOR=3]SA-X[/COLOR] has discovered and destroyed a top secret [COLOR=3]Metroid[/COLOR] breeding facility. It released 5 infant Metroids into the station. Initial scans indicate that they are hiding at bosses. Find and capture 4 of them, to lure out the SA-X. Then initiate the station's self-destruct sequence. Uplink at [COLOR=2]Navigation Rooms[/COLOR] along the way. I can scan the station for useful equipment from there.[OBJECTIVE]Good. Move out.",
@@ -2303,17 +2303,17 @@
         },
         "German": {
             "NavigationTerminals": {
-                "MainDeckEast": "Hint system still in development, we appreciate your patience.",
-                "MainDeckWest": "Hint system still in development, we appreciate your patience.",
-                "OperationsDeck": "Hint system still in development, we appreciate your patience.",
+                "MainDeckEast": "The [COLOR=3]Ice Missile Data[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "MainDeckWest": "The [COLOR=3]Level 3 Keycard[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "OperationsDeck": "The [COLOR=3]Level 1 Keycard[/COLOR] can be found in [COLOR=2]Sector 2 (TRO)[/COLOR].",
                 "AuxiliaryPower": "[COLOR=3]Charge Beam[/COLOR] is located in [COLOR=2]Sector 6 (NOC)[/COLOR].",
                 "RestrictedLabs": "[COLOR=3]Infant Metroid 1[/COLOR] is located in [COLOR=2]Sector 6 (NOC) - Varia Core-X Arena[/COLOR]. [COLOR=3]Infant Metroid 2[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Charge Core Arena[/COLOR]. [COLOR=3]Infant Metroid 3[/COLOR] is located in [COLOR=2]Main Deck - Yakuza Arena[/COLOR]. [COLOR=3]Infant Metroid 4[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Ridley Arena[/COLOR]. [COLOR=3]Infant Metroid 5[/COLOR] is located in [COLOR=2]Sector 2 (TRO) - Nettori Arena[/COLOR].",
-                "Sector1Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector2Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector3Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector4Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector5Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector6Entrance": "Hint system still in development, we appreciate your patience."
+                "Sector1Entrance": "The [COLOR=3]Varia Suit[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector2Entrance": "The [COLOR=3]Wave Beam[/COLOR] can be found in [COLOR=2]Sector 4 (AQA)[/COLOR].",
+                "Sector3Entrance": "The [COLOR=3]Super Missile Data[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "Sector4Entrance": "The [COLOR=3]Screw Attack[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector5Entrance": "The [COLOR=3]Charge Beam[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR].",
+                "Sector6Entrance": "The [COLOR=3]Hi-Jump[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR]."
             },
             "ShipText": {
                 "InitialText": "Your objective is as follows: the [COLOR=3]SA-X[/COLOR] has discovered and destroyed a top secret [COLOR=3]Metroid[/COLOR] breeding facility. It released 5 infant Metroids into the station. Initial scans indicate that they are hiding at bosses. Find and capture 4 of them, to lure out the SA-X. Then initiate the station's self-destruct sequence. Uplink at [COLOR=2]Navigation Rooms[/COLOR] along the way. I can scan the station for useful equipment from there.[OBJECTIVE]Good. Move out.",
@@ -2322,17 +2322,17 @@
         },
         "French": {
             "NavigationTerminals": {
-                "MainDeckEast": "Hint system still in development, we appreciate your patience.",
-                "MainDeckWest": "Hint system still in development, we appreciate your patience.",
-                "OperationsDeck": "Hint system still in development, we appreciate your patience.",
+                "MainDeckEast": "The [COLOR=3]Ice Missile Data[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "MainDeckWest": "The [COLOR=3]Level 3 Keycard[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "OperationsDeck": "The [COLOR=3]Level 1 Keycard[/COLOR] can be found in [COLOR=2]Sector 2 (TRO)[/COLOR].",
                 "AuxiliaryPower": "[COLOR=3]Charge Beam[/COLOR] is located in [COLOR=2]Sector 6 (NOC)[/COLOR].",
                 "RestrictedLabs": "[COLOR=3]Infant Metroid 1[/COLOR] is located in [COLOR=2]Sector 6 (NOC) - Varia Core-X Arena[/COLOR]. [COLOR=3]Infant Metroid 2[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Charge Core Arena[/COLOR]. [COLOR=3]Infant Metroid 3[/COLOR] is located in [COLOR=2]Main Deck - Yakuza Arena[/COLOR]. [COLOR=3]Infant Metroid 4[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Ridley Arena[/COLOR]. [COLOR=3]Infant Metroid 5[/COLOR] is located in [COLOR=2]Sector 2 (TRO) - Nettori Arena[/COLOR].",
-                "Sector1Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector2Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector3Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector4Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector5Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector6Entrance": "Hint system still in development, we appreciate your patience."
+                "Sector1Entrance": "The [COLOR=3]Varia Suit[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector2Entrance": "The [COLOR=3]Wave Beam[/COLOR] can be found in [COLOR=2]Sector 4 (AQA)[/COLOR].",
+                "Sector3Entrance": "The [COLOR=3]Super Missile Data[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "Sector4Entrance": "The [COLOR=3]Screw Attack[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector5Entrance": "The [COLOR=3]Charge Beam[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR].",
+                "Sector6Entrance": "The [COLOR=3]Hi-Jump[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR]."
             },
             "ShipText": {
                 "InitialText": "Your objective is as follows: the [COLOR=3]SA-X[/COLOR] has discovered and destroyed a top secret [COLOR=3]Metroid[/COLOR] breeding facility. It released 5 infant Metroids into the station. Initial scans indicate that they are hiding at bosses. Find and capture 4 of them, to lure out the SA-X. Then initiate the station's self-destruct sequence. Uplink at [COLOR=2]Navigation Rooms[/COLOR] along the way. I can scan the station for useful equipment from there.[OBJECTIVE]Good. Move out.",
@@ -2341,17 +2341,17 @@
         },
         "Italian": {
             "NavigationTerminals": {
-                "MainDeckEast": "Hint system still in development, we appreciate your patience.",
-                "MainDeckWest": "Hint system still in development, we appreciate your patience.",
-                "OperationsDeck": "Hint system still in development, we appreciate your patience.",
+                "MainDeckEast": "The [COLOR=3]Ice Missile Data[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "MainDeckWest": "The [COLOR=3]Level 3 Keycard[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "OperationsDeck": "The [COLOR=3]Level 1 Keycard[/COLOR] can be found in [COLOR=2]Sector 2 (TRO)[/COLOR].",
                 "AuxiliaryPower": "[COLOR=3]Charge Beam[/COLOR] is located in [COLOR=2]Sector 6 (NOC)[/COLOR].",
                 "RestrictedLabs": "[COLOR=3]Infant Metroid 1[/COLOR] is located in [COLOR=2]Sector 6 (NOC) - Varia Core-X Arena[/COLOR]. [COLOR=3]Infant Metroid 2[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Charge Core Arena[/COLOR]. [COLOR=3]Infant Metroid 3[/COLOR] is located in [COLOR=2]Main Deck - Yakuza Arena[/COLOR]. [COLOR=3]Infant Metroid 4[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Ridley Arena[/COLOR]. [COLOR=3]Infant Metroid 5[/COLOR] is located in [COLOR=2]Sector 2 (TRO) - Nettori Arena[/COLOR].",
-                "Sector1Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector2Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector3Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector4Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector5Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector6Entrance": "Hint system still in development, we appreciate your patience."
+                "Sector1Entrance": "The [COLOR=3]Varia Suit[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector2Entrance": "The [COLOR=3]Wave Beam[/COLOR] can be found in [COLOR=2]Sector 4 (AQA)[/COLOR].",
+                "Sector3Entrance": "The [COLOR=3]Super Missile Data[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "Sector4Entrance": "The [COLOR=3]Screw Attack[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector5Entrance": "The [COLOR=3]Charge Beam[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR].",
+                "Sector6Entrance": "The [COLOR=3]Hi-Jump[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR]."
             },
             "ShipText": {
                 "InitialText": "Your objective is as follows: the [COLOR=3]SA-X[/COLOR] has discovered and destroyed a top secret [COLOR=3]Metroid[/COLOR] breeding facility. It released 5 infant Metroids into the station. Initial scans indicate that they are hiding at bosses. Find and capture 4 of them, to lure out the SA-X. Then initiate the station's self-destruct sequence. Uplink at [COLOR=2]Navigation Rooms[/COLOR] along the way. I can scan the station for useful equipment from there.[OBJECTIVE]Good. Move out.",
@@ -2360,17 +2360,17 @@
         },
         "Spanish": {
             "NavigationTerminals": {
-                "MainDeckEast": "Hint system still in development, we appreciate your patience.",
-                "MainDeckWest": "Hint system still in development, we appreciate your patience.",
-                "OperationsDeck": "Hint system still in development, we appreciate your patience.",
+                "MainDeckEast": "The [COLOR=3]Ice Missile Data[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "MainDeckWest": "The [COLOR=3]Level 3 Keycard[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "OperationsDeck": "The [COLOR=3]Level 1 Keycard[/COLOR] can be found in [COLOR=2]Sector 2 (TRO)[/COLOR].",
                 "AuxiliaryPower": "[COLOR=3]Charge Beam[/COLOR] is located in [COLOR=2]Sector 6 (NOC)[/COLOR].",
                 "RestrictedLabs": "[COLOR=3]Infant Metroid 1[/COLOR] is located in [COLOR=2]Sector 6 (NOC) - Varia Core-X Arena[/COLOR]. [COLOR=3]Infant Metroid 2[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Charge Core Arena[/COLOR]. [COLOR=3]Infant Metroid 3[/COLOR] is located in [COLOR=2]Main Deck - Yakuza Arena[/COLOR]. [COLOR=3]Infant Metroid 4[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Ridley Arena[/COLOR]. [COLOR=3]Infant Metroid 5[/COLOR] is located in [COLOR=2]Sector 2 (TRO) - Nettori Arena[/COLOR].",
-                "Sector1Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector2Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector3Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector4Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector5Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector6Entrance": "Hint system still in development, we appreciate your patience."
+                "Sector1Entrance": "The [COLOR=3]Varia Suit[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector2Entrance": "The [COLOR=3]Wave Beam[/COLOR] can be found in [COLOR=2]Sector 4 (AQA)[/COLOR].",
+                "Sector3Entrance": "The [COLOR=3]Super Missile Data[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "Sector4Entrance": "The [COLOR=3]Screw Attack[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector5Entrance": "The [COLOR=3]Charge Beam[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR].",
+                "Sector6Entrance": "The [COLOR=3]Hi-Jump[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR]."
             },
             "ShipText": {
                 "InitialText": "Your objective is as follows: the [COLOR=3]SA-X[/COLOR] has discovered and destroyed a top secret [COLOR=3]Metroid[/COLOR] breeding facility. It released 5 infant Metroids into the station. Initial scans indicate that they are hiding at bosses. Find and capture 4 of them, to lure out the SA-X. Then initiate the station's self-destruct sequence. Uplink at [COLOR=2]Navigation Rooms[/COLOR] along the way. I can scan the station for useful equipment from there.[OBJECTIVE]Good. Move out.",
diff --git a/test/test_files/patcher_data/fusion/fusion/short_intro/world_1.json b/test/test_files/patcher_data/fusion/fusion/short_intro/world_1.json
index 6991007421..a1b8fd93b7 100644
--- a/test/test_files/patcher_data/fusion/fusion/short_intro/world_1.json
+++ b/test/test_files/patcher_data/fusion/fusion/short_intro/world_1.json
@@ -2191,17 +2191,17 @@
     "NavigationText": {
         "JapaneseKanji": {
             "NavigationTerminals": {
-                "MainDeckEast": "Hint system still in development, we appreciate your patience.",
-                "MainDeckWest": "Hint system still in development, we appreciate your patience.",
-                "OperationsDeck": "Hint system still in development, we appreciate your patience.",
+                "MainDeckEast": "The [COLOR=3]Super Missile Data[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "MainDeckWest": "The [COLOR=3]Infant Metroid 4[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR].",
+                "OperationsDeck": "The [COLOR=3]Missile Launcher Data[/COLOR] can be found in [COLOR=2]Main Deck[/COLOR].",
                 "AuxiliaryPower": "[COLOR=3]Charge Beam[/COLOR] is located in [COLOR=2]Sector 1 (SRX)[/COLOR].",
                 "RestrictedLabs": "[COLOR=3]Infant Metroid 1[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Charge Core Arena[/COLOR]. [COLOR=3]Infant Metroid 2[/COLOR] is located in [COLOR=2]Main Deck - Arachnus Arena[/COLOR]. [COLOR=3]Infant Metroid 3[/COLOR] is located in [COLOR=2]Sector 3 (PYR) - Main Boiler Control Room[/COLOR]. [COLOR=3]Infant Metroid 4[/COLOR] is located in [COLOR=2]Sector 6 (NOC) - Varia Core-X Arena[/COLOR]. [COLOR=3]Infant Metroid 5[/COLOR] is located in [COLOR=2]Sector 2 (TRO) - Zazabi Arena[/COLOR].",
-                "Sector1Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector2Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector3Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector4Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector5Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector6Entrance": "Hint system still in development, we appreciate your patience."
+                "Sector1Entrance": "The [COLOR=3]Varia Suit[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector2Entrance": "The [COLOR=3]Level 4 Keycard[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector3Entrance": "The [COLOR=3]Morph Ball Bomb Data[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "Sector4Entrance": "The [COLOR=3]Diffusion Missile Data[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR].",
+                "Sector5Entrance": "The [COLOR=3]Gravity Suit[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "Sector6Entrance": "The [COLOR=3]Morph Ball[/COLOR] can be found in [COLOR=2]Main Deck[/COLOR]."
             },
             "ShipText": {
                 "InitialText": "Gather 4/5 Infant Metroids hiding at bosses to lure out the [COLOR=3]SA-X[/COLOR] and prepare for battle.",
@@ -2210,17 +2210,17 @@
         },
         "JapaneseHiragana": {
             "NavigationTerminals": {
-                "MainDeckEast": "Hint system still in development, we appreciate your patience.",
-                "MainDeckWest": "Hint system still in development, we appreciate your patience.",
-                "OperationsDeck": "Hint system still in development, we appreciate your patience.",
+                "MainDeckEast": "The [COLOR=3]Super Missile Data[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "MainDeckWest": "The [COLOR=3]Infant Metroid 4[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR].",
+                "OperationsDeck": "The [COLOR=3]Missile Launcher Data[/COLOR] can be found in [COLOR=2]Main Deck[/COLOR].",
                 "AuxiliaryPower": "[COLOR=3]Charge Beam[/COLOR] is located in [COLOR=2]Sector 1 (SRX)[/COLOR].",
                 "RestrictedLabs": "[COLOR=3]Infant Metroid 1[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Charge Core Arena[/COLOR]. [COLOR=3]Infant Metroid 2[/COLOR] is located in [COLOR=2]Main Deck - Arachnus Arena[/COLOR]. [COLOR=3]Infant Metroid 3[/COLOR] is located in [COLOR=2]Sector 3 (PYR) - Main Boiler Control Room[/COLOR]. [COLOR=3]Infant Metroid 4[/COLOR] is located in [COLOR=2]Sector 6 (NOC) - Varia Core-X Arena[/COLOR]. [COLOR=3]Infant Metroid 5[/COLOR] is located in [COLOR=2]Sector 2 (TRO) - Zazabi Arena[/COLOR].",
-                "Sector1Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector2Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector3Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector4Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector5Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector6Entrance": "Hint system still in development, we appreciate your patience."
+                "Sector1Entrance": "The [COLOR=3]Varia Suit[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector2Entrance": "The [COLOR=3]Level 4 Keycard[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector3Entrance": "The [COLOR=3]Morph Ball Bomb Data[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "Sector4Entrance": "The [COLOR=3]Diffusion Missile Data[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR].",
+                "Sector5Entrance": "The [COLOR=3]Gravity Suit[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "Sector6Entrance": "The [COLOR=3]Morph Ball[/COLOR] can be found in [COLOR=2]Main Deck[/COLOR]."
             },
             "ShipText": {
                 "InitialText": "Gather 4/5 Infant Metroids hiding at bosses to lure out the [COLOR=3]SA-X[/COLOR] and prepare for battle.",
@@ -2229,17 +2229,17 @@
         },
         "English": {
             "NavigationTerminals": {
-                "MainDeckEast": "Hint system still in development, we appreciate your patience.",
-                "MainDeckWest": "Hint system still in development, we appreciate your patience.",
-                "OperationsDeck": "Hint system still in development, we appreciate your patience.",
+                "MainDeckEast": "The [COLOR=3]Super Missile Data[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "MainDeckWest": "The [COLOR=3]Infant Metroid 4[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR].",
+                "OperationsDeck": "The [COLOR=3]Missile Launcher Data[/COLOR] can be found in [COLOR=2]Main Deck[/COLOR].",
                 "AuxiliaryPower": "[COLOR=3]Charge Beam[/COLOR] is located in [COLOR=2]Sector 1 (SRX)[/COLOR].",
                 "RestrictedLabs": "[COLOR=3]Infant Metroid 1[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Charge Core Arena[/COLOR]. [COLOR=3]Infant Metroid 2[/COLOR] is located in [COLOR=2]Main Deck - Arachnus Arena[/COLOR]. [COLOR=3]Infant Metroid 3[/COLOR] is located in [COLOR=2]Sector 3 (PYR) - Main Boiler Control Room[/COLOR]. [COLOR=3]Infant Metroid 4[/COLOR] is located in [COLOR=2]Sector 6 (NOC) - Varia Core-X Arena[/COLOR]. [COLOR=3]Infant Metroid 5[/COLOR] is located in [COLOR=2]Sector 2 (TRO) - Zazabi Arena[/COLOR].",
-                "Sector1Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector2Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector3Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector4Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector5Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector6Entrance": "Hint system still in development, we appreciate your patience."
+                "Sector1Entrance": "The [COLOR=3]Varia Suit[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector2Entrance": "The [COLOR=3]Level 4 Keycard[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector3Entrance": "The [COLOR=3]Morph Ball Bomb Data[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "Sector4Entrance": "The [COLOR=3]Diffusion Missile Data[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR].",
+                "Sector5Entrance": "The [COLOR=3]Gravity Suit[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "Sector6Entrance": "The [COLOR=3]Morph Ball[/COLOR] can be found in [COLOR=2]Main Deck[/COLOR]."
             },
             "ShipText": {
                 "InitialText": "Gather 4/5 Infant Metroids hiding at bosses to lure out the [COLOR=3]SA-X[/COLOR] and prepare for battle.",
@@ -2248,17 +2248,17 @@
         },
         "German": {
             "NavigationTerminals": {
-                "MainDeckEast": "Hint system still in development, we appreciate your patience.",
-                "MainDeckWest": "Hint system still in development, we appreciate your patience.",
-                "OperationsDeck": "Hint system still in development, we appreciate your patience.",
+                "MainDeckEast": "The [COLOR=3]Super Missile Data[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "MainDeckWest": "The [COLOR=3]Infant Metroid 4[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR].",
+                "OperationsDeck": "The [COLOR=3]Missile Launcher Data[/COLOR] can be found in [COLOR=2]Main Deck[/COLOR].",
                 "AuxiliaryPower": "[COLOR=3]Charge Beam[/COLOR] is located in [COLOR=2]Sector 1 (SRX)[/COLOR].",
                 "RestrictedLabs": "[COLOR=3]Infant Metroid 1[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Charge Core Arena[/COLOR]. [COLOR=3]Infant Metroid 2[/COLOR] is located in [COLOR=2]Main Deck - Arachnus Arena[/COLOR]. [COLOR=3]Infant Metroid 3[/COLOR] is located in [COLOR=2]Sector 3 (PYR) - Main Boiler Control Room[/COLOR]. [COLOR=3]Infant Metroid 4[/COLOR] is located in [COLOR=2]Sector 6 (NOC) - Varia Core-X Arena[/COLOR]. [COLOR=3]Infant Metroid 5[/COLOR] is located in [COLOR=2]Sector 2 (TRO) - Zazabi Arena[/COLOR].",
-                "Sector1Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector2Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector3Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector4Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector5Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector6Entrance": "Hint system still in development, we appreciate your patience."
+                "Sector1Entrance": "The [COLOR=3]Varia Suit[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector2Entrance": "The [COLOR=3]Level 4 Keycard[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector3Entrance": "The [COLOR=3]Morph Ball Bomb Data[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "Sector4Entrance": "The [COLOR=3]Diffusion Missile Data[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR].",
+                "Sector5Entrance": "The [COLOR=3]Gravity Suit[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "Sector6Entrance": "The [COLOR=3]Morph Ball[/COLOR] can be found in [COLOR=2]Main Deck[/COLOR]."
             },
             "ShipText": {
                 "InitialText": "Gather 4/5 Infant Metroids hiding at bosses to lure out the [COLOR=3]SA-X[/COLOR] and prepare for battle.",
@@ -2267,17 +2267,17 @@
         },
         "French": {
             "NavigationTerminals": {
-                "MainDeckEast": "Hint system still in development, we appreciate your patience.",
-                "MainDeckWest": "Hint system still in development, we appreciate your patience.",
-                "OperationsDeck": "Hint system still in development, we appreciate your patience.",
+                "MainDeckEast": "The [COLOR=3]Super Missile Data[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "MainDeckWest": "The [COLOR=3]Infant Metroid 4[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR].",
+                "OperationsDeck": "The [COLOR=3]Missile Launcher Data[/COLOR] can be found in [COLOR=2]Main Deck[/COLOR].",
                 "AuxiliaryPower": "[COLOR=3]Charge Beam[/COLOR] is located in [COLOR=2]Sector 1 (SRX)[/COLOR].",
                 "RestrictedLabs": "[COLOR=3]Infant Metroid 1[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Charge Core Arena[/COLOR]. [COLOR=3]Infant Metroid 2[/COLOR] is located in [COLOR=2]Main Deck - Arachnus Arena[/COLOR]. [COLOR=3]Infant Metroid 3[/COLOR] is located in [COLOR=2]Sector 3 (PYR) - Main Boiler Control Room[/COLOR]. [COLOR=3]Infant Metroid 4[/COLOR] is located in [COLOR=2]Sector 6 (NOC) - Varia Core-X Arena[/COLOR]. [COLOR=3]Infant Metroid 5[/COLOR] is located in [COLOR=2]Sector 2 (TRO) - Zazabi Arena[/COLOR].",
-                "Sector1Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector2Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector3Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector4Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector5Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector6Entrance": "Hint system still in development, we appreciate your patience."
+                "Sector1Entrance": "The [COLOR=3]Varia Suit[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector2Entrance": "The [COLOR=3]Level 4 Keycard[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector3Entrance": "The [COLOR=3]Morph Ball Bomb Data[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "Sector4Entrance": "The [COLOR=3]Diffusion Missile Data[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR].",
+                "Sector5Entrance": "The [COLOR=3]Gravity Suit[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "Sector6Entrance": "The [COLOR=3]Morph Ball[/COLOR] can be found in [COLOR=2]Main Deck[/COLOR]."
             },
             "ShipText": {
                 "InitialText": "Gather 4/5 Infant Metroids hiding at bosses to lure out the [COLOR=3]SA-X[/COLOR] and prepare for battle.",
@@ -2286,17 +2286,17 @@
         },
         "Italian": {
             "NavigationTerminals": {
-                "MainDeckEast": "Hint system still in development, we appreciate your patience.",
-                "MainDeckWest": "Hint system still in development, we appreciate your patience.",
-                "OperationsDeck": "Hint system still in development, we appreciate your patience.",
+                "MainDeckEast": "The [COLOR=3]Super Missile Data[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "MainDeckWest": "The [COLOR=3]Infant Metroid 4[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR].",
+                "OperationsDeck": "The [COLOR=3]Missile Launcher Data[/COLOR] can be found in [COLOR=2]Main Deck[/COLOR].",
                 "AuxiliaryPower": "[COLOR=3]Charge Beam[/COLOR] is located in [COLOR=2]Sector 1 (SRX)[/COLOR].",
                 "RestrictedLabs": "[COLOR=3]Infant Metroid 1[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Charge Core Arena[/COLOR]. [COLOR=3]Infant Metroid 2[/COLOR] is located in [COLOR=2]Main Deck - Arachnus Arena[/COLOR]. [COLOR=3]Infant Metroid 3[/COLOR] is located in [COLOR=2]Sector 3 (PYR) - Main Boiler Control Room[/COLOR]. [COLOR=3]Infant Metroid 4[/COLOR] is located in [COLOR=2]Sector 6 (NOC) - Varia Core-X Arena[/COLOR]. [COLOR=3]Infant Metroid 5[/COLOR] is located in [COLOR=2]Sector 2 (TRO) - Zazabi Arena[/COLOR].",
-                "Sector1Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector2Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector3Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector4Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector5Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector6Entrance": "Hint system still in development, we appreciate your patience."
+                "Sector1Entrance": "The [COLOR=3]Varia Suit[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector2Entrance": "The [COLOR=3]Level 4 Keycard[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector3Entrance": "The [COLOR=3]Morph Ball Bomb Data[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "Sector4Entrance": "The [COLOR=3]Diffusion Missile Data[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR].",
+                "Sector5Entrance": "The [COLOR=3]Gravity Suit[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "Sector6Entrance": "The [COLOR=3]Morph Ball[/COLOR] can be found in [COLOR=2]Main Deck[/COLOR]."
             },
             "ShipText": {
                 "InitialText": "Gather 4/5 Infant Metroids hiding at bosses to lure out the [COLOR=3]SA-X[/COLOR] and prepare for battle.",
@@ -2305,17 +2305,17 @@
         },
         "Spanish": {
             "NavigationTerminals": {
-                "MainDeckEast": "Hint system still in development, we appreciate your patience.",
-                "MainDeckWest": "Hint system still in development, we appreciate your patience.",
-                "OperationsDeck": "Hint system still in development, we appreciate your patience.",
+                "MainDeckEast": "The [COLOR=3]Super Missile Data[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "MainDeckWest": "The [COLOR=3]Infant Metroid 4[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR].",
+                "OperationsDeck": "The [COLOR=3]Missile Launcher Data[/COLOR] can be found in [COLOR=2]Main Deck[/COLOR].",
                 "AuxiliaryPower": "[COLOR=3]Charge Beam[/COLOR] is located in [COLOR=2]Sector 1 (SRX)[/COLOR].",
                 "RestrictedLabs": "[COLOR=3]Infant Metroid 1[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Charge Core Arena[/COLOR]. [COLOR=3]Infant Metroid 2[/COLOR] is located in [COLOR=2]Main Deck - Arachnus Arena[/COLOR]. [COLOR=3]Infant Metroid 3[/COLOR] is located in [COLOR=2]Sector 3 (PYR) - Main Boiler Control Room[/COLOR]. [COLOR=3]Infant Metroid 4[/COLOR] is located in [COLOR=2]Sector 6 (NOC) - Varia Core-X Arena[/COLOR]. [COLOR=3]Infant Metroid 5[/COLOR] is located in [COLOR=2]Sector 2 (TRO) - Zazabi Arena[/COLOR].",
-                "Sector1Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector2Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector3Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector4Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector5Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector6Entrance": "Hint system still in development, we appreciate your patience."
+                "Sector1Entrance": "The [COLOR=3]Varia Suit[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector2Entrance": "The [COLOR=3]Level 4 Keycard[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector3Entrance": "The [COLOR=3]Morph Ball Bomb Data[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "Sector4Entrance": "The [COLOR=3]Diffusion Missile Data[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR].",
+                "Sector5Entrance": "The [COLOR=3]Gravity Suit[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "Sector6Entrance": "The [COLOR=3]Morph Ball[/COLOR] can be found in [COLOR=2]Main Deck[/COLOR]."
             },
             "ShipText": {
                 "InitialText": "Gather 4/5 Infant Metroids hiding at bosses to lure out the [COLOR=3]SA-X[/COLOR] and prepare for battle.",
diff --git a/test/test_files/patcher_data/fusion/fusion/starter_preset/world_1.json b/test/test_files/patcher_data/fusion/fusion/starter_preset/world_1.json
index 541383fd3a..675ed5f6cb 100644
--- a/test/test_files/patcher_data/fusion/fusion/starter_preset/world_1.json
+++ b/test/test_files/patcher_data/fusion/fusion/starter_preset/world_1.json
@@ -2191,17 +2191,17 @@
     "NavigationText": {
         "JapaneseKanji": {
             "NavigationTerminals": {
-                "MainDeckEast": "Hint system still in development, we appreciate your patience.",
-                "MainDeckWest": "Hint system still in development, we appreciate your patience.",
-                "OperationsDeck": "Hint system still in development, we appreciate your patience.",
+                "MainDeckEast": "The [COLOR=3]Level 3 Keycard[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "MainDeckWest": "The [COLOR=3]Charge Beam[/COLOR] can be found in [COLOR=2]Sector 2 (TRO)[/COLOR].",
+                "OperationsDeck": "The [COLOR=3]Ice Beam[/COLOR] can be found in [COLOR=2]Sector 4 (AQA)[/COLOR].",
                 "AuxiliaryPower": "[COLOR=3]Charge Beam[/COLOR] is located in [COLOR=2]Sector 2 (TRO)[/COLOR].",
                 "RestrictedLabs": "[COLOR=3]Infant Metroid 1[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Ridley Arena[/COLOR]. [COLOR=3]Infant Metroid 2[/COLOR] is located in [COLOR=2]Main Deck - Arachnus Arena[/COLOR]. [COLOR=3]Infant Metroid 3[/COLOR] is located in [COLOR=2]Sector 4 (AQA) - Serris Arena[/COLOR]. [COLOR=3]Infant Metroid 4[/COLOR] is located in [COLOR=2]Main Deck - Yakuza Arena[/COLOR]. [COLOR=3]Infant Metroid 5[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Charge Core Arena[/COLOR].",
-                "Sector1Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector2Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector3Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector4Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector5Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector6Entrance": "Hint system still in development, we appreciate your patience."
+                "Sector1Entrance": "The [COLOR=3]Wide Beam[/COLOR] can be found in [COLOR=2]Sector 2 (TRO)[/COLOR].",
+                "Sector2Entrance": "The [COLOR=3]Wave Beam[/COLOR] can be found in [COLOR=2]Sector 1 (SRX)[/COLOR].",
+                "Sector3Entrance": "The [COLOR=3]Speed Booster[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR].",
+                "Sector4Entrance": "The [COLOR=3]Gravity Suit[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector5Entrance": "The [COLOR=3]Level 4 Keycard[/COLOR] can be found in [COLOR=2]Sector 2 (TRO)[/COLOR].",
+                "Sector6Entrance": "The [COLOR=3]Screw Attack[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR]."
             },
             "ShipText": {
                 "InitialText": "Your objective is as follows: the [COLOR=3]SA-X[/COLOR] has discovered and destroyed a top secret [COLOR=3]Metroid[/COLOR] breeding facility. It released 5 infant Metroids into the station. Initial scans indicate that they are hiding at bosses. Find and capture 4 of them, to lure out the SA-X. Then initiate the station's self-destruct sequence. Uplink at [COLOR=2]Navigation Rooms[/COLOR] along the way. I can scan the station for useful equipment from there.[OBJECTIVE]Good. Move out.",
@@ -2210,17 +2210,17 @@
         },
         "JapaneseHiragana": {
             "NavigationTerminals": {
-                "MainDeckEast": "Hint system still in development, we appreciate your patience.",
-                "MainDeckWest": "Hint system still in development, we appreciate your patience.",
-                "OperationsDeck": "Hint system still in development, we appreciate your patience.",
+                "MainDeckEast": "The [COLOR=3]Level 3 Keycard[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "MainDeckWest": "The [COLOR=3]Charge Beam[/COLOR] can be found in [COLOR=2]Sector 2 (TRO)[/COLOR].",
+                "OperationsDeck": "The [COLOR=3]Ice Beam[/COLOR] can be found in [COLOR=2]Sector 4 (AQA)[/COLOR].",
                 "AuxiliaryPower": "[COLOR=3]Charge Beam[/COLOR] is located in [COLOR=2]Sector 2 (TRO)[/COLOR].",
                 "RestrictedLabs": "[COLOR=3]Infant Metroid 1[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Ridley Arena[/COLOR]. [COLOR=3]Infant Metroid 2[/COLOR] is located in [COLOR=2]Main Deck - Arachnus Arena[/COLOR]. [COLOR=3]Infant Metroid 3[/COLOR] is located in [COLOR=2]Sector 4 (AQA) - Serris Arena[/COLOR]. [COLOR=3]Infant Metroid 4[/COLOR] is located in [COLOR=2]Main Deck - Yakuza Arena[/COLOR]. [COLOR=3]Infant Metroid 5[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Charge Core Arena[/COLOR].",
-                "Sector1Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector2Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector3Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector4Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector5Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector6Entrance": "Hint system still in development, we appreciate your patience."
+                "Sector1Entrance": "The [COLOR=3]Wide Beam[/COLOR] can be found in [COLOR=2]Sector 2 (TRO)[/COLOR].",
+                "Sector2Entrance": "The [COLOR=3]Wave Beam[/COLOR] can be found in [COLOR=2]Sector 1 (SRX)[/COLOR].",
+                "Sector3Entrance": "The [COLOR=3]Speed Booster[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR].",
+                "Sector4Entrance": "The [COLOR=3]Gravity Suit[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector5Entrance": "The [COLOR=3]Level 4 Keycard[/COLOR] can be found in [COLOR=2]Sector 2 (TRO)[/COLOR].",
+                "Sector6Entrance": "The [COLOR=3]Screw Attack[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR]."
             },
             "ShipText": {
                 "InitialText": "Your objective is as follows: the [COLOR=3]SA-X[/COLOR] has discovered and destroyed a top secret [COLOR=3]Metroid[/COLOR] breeding facility. It released 5 infant Metroids into the station. Initial scans indicate that they are hiding at bosses. Find and capture 4 of them, to lure out the SA-X. Then initiate the station's self-destruct sequence. Uplink at [COLOR=2]Navigation Rooms[/COLOR] along the way. I can scan the station for useful equipment from there.[OBJECTIVE]Good. Move out.",
@@ -2229,17 +2229,17 @@
         },
         "English": {
             "NavigationTerminals": {
-                "MainDeckEast": "Hint system still in development, we appreciate your patience.",
-                "MainDeckWest": "Hint system still in development, we appreciate your patience.",
-                "OperationsDeck": "Hint system still in development, we appreciate your patience.",
+                "MainDeckEast": "The [COLOR=3]Level 3 Keycard[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "MainDeckWest": "The [COLOR=3]Charge Beam[/COLOR] can be found in [COLOR=2]Sector 2 (TRO)[/COLOR].",
+                "OperationsDeck": "The [COLOR=3]Ice Beam[/COLOR] can be found in [COLOR=2]Sector 4 (AQA)[/COLOR].",
                 "AuxiliaryPower": "[COLOR=3]Charge Beam[/COLOR] is located in [COLOR=2]Sector 2 (TRO)[/COLOR].",
                 "RestrictedLabs": "[COLOR=3]Infant Metroid 1[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Ridley Arena[/COLOR]. [COLOR=3]Infant Metroid 2[/COLOR] is located in [COLOR=2]Main Deck - Arachnus Arena[/COLOR]. [COLOR=3]Infant Metroid 3[/COLOR] is located in [COLOR=2]Sector 4 (AQA) - Serris Arena[/COLOR]. [COLOR=3]Infant Metroid 4[/COLOR] is located in [COLOR=2]Main Deck - Yakuza Arena[/COLOR]. [COLOR=3]Infant Metroid 5[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Charge Core Arena[/COLOR].",
-                "Sector1Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector2Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector3Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector4Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector5Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector6Entrance": "Hint system still in development, we appreciate your patience."
+                "Sector1Entrance": "The [COLOR=3]Wide Beam[/COLOR] can be found in [COLOR=2]Sector 2 (TRO)[/COLOR].",
+                "Sector2Entrance": "The [COLOR=3]Wave Beam[/COLOR] can be found in [COLOR=2]Sector 1 (SRX)[/COLOR].",
+                "Sector3Entrance": "The [COLOR=3]Speed Booster[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR].",
+                "Sector4Entrance": "The [COLOR=3]Gravity Suit[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector5Entrance": "The [COLOR=3]Level 4 Keycard[/COLOR] can be found in [COLOR=2]Sector 2 (TRO)[/COLOR].",
+                "Sector6Entrance": "The [COLOR=3]Screw Attack[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR]."
             },
             "ShipText": {
                 "InitialText": "Your objective is as follows: the [COLOR=3]SA-X[/COLOR] has discovered and destroyed a top secret [COLOR=3]Metroid[/COLOR] breeding facility. It released 5 infant Metroids into the station. Initial scans indicate that they are hiding at bosses. Find and capture 4 of them, to lure out the SA-X. Then initiate the station's self-destruct sequence. Uplink at [COLOR=2]Navigation Rooms[/COLOR] along the way. I can scan the station for useful equipment from there.[OBJECTIVE]Good. Move out.",
@@ -2248,17 +2248,17 @@
         },
         "German": {
             "NavigationTerminals": {
-                "MainDeckEast": "Hint system still in development, we appreciate your patience.",
-                "MainDeckWest": "Hint system still in development, we appreciate your patience.",
-                "OperationsDeck": "Hint system still in development, we appreciate your patience.",
+                "MainDeckEast": "The [COLOR=3]Level 3 Keycard[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "MainDeckWest": "The [COLOR=3]Charge Beam[/COLOR] can be found in [COLOR=2]Sector 2 (TRO)[/COLOR].",
+                "OperationsDeck": "The [COLOR=3]Ice Beam[/COLOR] can be found in [COLOR=2]Sector 4 (AQA)[/COLOR].",
                 "AuxiliaryPower": "[COLOR=3]Charge Beam[/COLOR] is located in [COLOR=2]Sector 2 (TRO)[/COLOR].",
                 "RestrictedLabs": "[COLOR=3]Infant Metroid 1[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Ridley Arena[/COLOR]. [COLOR=3]Infant Metroid 2[/COLOR] is located in [COLOR=2]Main Deck - Arachnus Arena[/COLOR]. [COLOR=3]Infant Metroid 3[/COLOR] is located in [COLOR=2]Sector 4 (AQA) - Serris Arena[/COLOR]. [COLOR=3]Infant Metroid 4[/COLOR] is located in [COLOR=2]Main Deck - Yakuza Arena[/COLOR]. [COLOR=3]Infant Metroid 5[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Charge Core Arena[/COLOR].",
-                "Sector1Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector2Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector3Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector4Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector5Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector6Entrance": "Hint system still in development, we appreciate your patience."
+                "Sector1Entrance": "The [COLOR=3]Wide Beam[/COLOR] can be found in [COLOR=2]Sector 2 (TRO)[/COLOR].",
+                "Sector2Entrance": "The [COLOR=3]Wave Beam[/COLOR] can be found in [COLOR=2]Sector 1 (SRX)[/COLOR].",
+                "Sector3Entrance": "The [COLOR=3]Speed Booster[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR].",
+                "Sector4Entrance": "The [COLOR=3]Gravity Suit[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector5Entrance": "The [COLOR=3]Level 4 Keycard[/COLOR] can be found in [COLOR=2]Sector 2 (TRO)[/COLOR].",
+                "Sector6Entrance": "The [COLOR=3]Screw Attack[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR]."
             },
             "ShipText": {
                 "InitialText": "Your objective is as follows: the [COLOR=3]SA-X[/COLOR] has discovered and destroyed a top secret [COLOR=3]Metroid[/COLOR] breeding facility. It released 5 infant Metroids into the station. Initial scans indicate that they are hiding at bosses. Find and capture 4 of them, to lure out the SA-X. Then initiate the station's self-destruct sequence. Uplink at [COLOR=2]Navigation Rooms[/COLOR] along the way. I can scan the station for useful equipment from there.[OBJECTIVE]Good. Move out.",
@@ -2267,17 +2267,17 @@
         },
         "French": {
             "NavigationTerminals": {
-                "MainDeckEast": "Hint system still in development, we appreciate your patience.",
-                "MainDeckWest": "Hint system still in development, we appreciate your patience.",
-                "OperationsDeck": "Hint system still in development, we appreciate your patience.",
+                "MainDeckEast": "The [COLOR=3]Level 3 Keycard[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "MainDeckWest": "The [COLOR=3]Charge Beam[/COLOR] can be found in [COLOR=2]Sector 2 (TRO)[/COLOR].",
+                "OperationsDeck": "The [COLOR=3]Ice Beam[/COLOR] can be found in [COLOR=2]Sector 4 (AQA)[/COLOR].",
                 "AuxiliaryPower": "[COLOR=3]Charge Beam[/COLOR] is located in [COLOR=2]Sector 2 (TRO)[/COLOR].",
                 "RestrictedLabs": "[COLOR=3]Infant Metroid 1[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Ridley Arena[/COLOR]. [COLOR=3]Infant Metroid 2[/COLOR] is located in [COLOR=2]Main Deck - Arachnus Arena[/COLOR]. [COLOR=3]Infant Metroid 3[/COLOR] is located in [COLOR=2]Sector 4 (AQA) - Serris Arena[/COLOR]. [COLOR=3]Infant Metroid 4[/COLOR] is located in [COLOR=2]Main Deck - Yakuza Arena[/COLOR]. [COLOR=3]Infant Metroid 5[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Charge Core Arena[/COLOR].",
-                "Sector1Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector2Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector3Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector4Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector5Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector6Entrance": "Hint system still in development, we appreciate your patience."
+                "Sector1Entrance": "The [COLOR=3]Wide Beam[/COLOR] can be found in [COLOR=2]Sector 2 (TRO)[/COLOR].",
+                "Sector2Entrance": "The [COLOR=3]Wave Beam[/COLOR] can be found in [COLOR=2]Sector 1 (SRX)[/COLOR].",
+                "Sector3Entrance": "The [COLOR=3]Speed Booster[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR].",
+                "Sector4Entrance": "The [COLOR=3]Gravity Suit[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector5Entrance": "The [COLOR=3]Level 4 Keycard[/COLOR] can be found in [COLOR=2]Sector 2 (TRO)[/COLOR].",
+                "Sector6Entrance": "The [COLOR=3]Screw Attack[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR]."
             },
             "ShipText": {
                 "InitialText": "Your objective is as follows: the [COLOR=3]SA-X[/COLOR] has discovered and destroyed a top secret [COLOR=3]Metroid[/COLOR] breeding facility. It released 5 infant Metroids into the station. Initial scans indicate that they are hiding at bosses. Find and capture 4 of them, to lure out the SA-X. Then initiate the station's self-destruct sequence. Uplink at [COLOR=2]Navigation Rooms[/COLOR] along the way. I can scan the station for useful equipment from there.[OBJECTIVE]Good. Move out.",
@@ -2286,17 +2286,17 @@
         },
         "Italian": {
             "NavigationTerminals": {
-                "MainDeckEast": "Hint system still in development, we appreciate your patience.",
-                "MainDeckWest": "Hint system still in development, we appreciate your patience.",
-                "OperationsDeck": "Hint system still in development, we appreciate your patience.",
+                "MainDeckEast": "The [COLOR=3]Level 3 Keycard[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "MainDeckWest": "The [COLOR=3]Charge Beam[/COLOR] can be found in [COLOR=2]Sector 2 (TRO)[/COLOR].",
+                "OperationsDeck": "The [COLOR=3]Ice Beam[/COLOR] can be found in [COLOR=2]Sector 4 (AQA)[/COLOR].",
                 "AuxiliaryPower": "[COLOR=3]Charge Beam[/COLOR] is located in [COLOR=2]Sector 2 (TRO)[/COLOR].",
                 "RestrictedLabs": "[COLOR=3]Infant Metroid 1[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Ridley Arena[/COLOR]. [COLOR=3]Infant Metroid 2[/COLOR] is located in [COLOR=2]Main Deck - Arachnus Arena[/COLOR]. [COLOR=3]Infant Metroid 3[/COLOR] is located in [COLOR=2]Sector 4 (AQA) - Serris Arena[/COLOR]. [COLOR=3]Infant Metroid 4[/COLOR] is located in [COLOR=2]Main Deck - Yakuza Arena[/COLOR]. [COLOR=3]Infant Metroid 5[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Charge Core Arena[/COLOR].",
-                "Sector1Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector2Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector3Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector4Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector5Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector6Entrance": "Hint system still in development, we appreciate your patience."
+                "Sector1Entrance": "The [COLOR=3]Wide Beam[/COLOR] can be found in [COLOR=2]Sector 2 (TRO)[/COLOR].",
+                "Sector2Entrance": "The [COLOR=3]Wave Beam[/COLOR] can be found in [COLOR=2]Sector 1 (SRX)[/COLOR].",
+                "Sector3Entrance": "The [COLOR=3]Speed Booster[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR].",
+                "Sector4Entrance": "The [COLOR=3]Gravity Suit[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector5Entrance": "The [COLOR=3]Level 4 Keycard[/COLOR] can be found in [COLOR=2]Sector 2 (TRO)[/COLOR].",
+                "Sector6Entrance": "The [COLOR=3]Screw Attack[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR]."
             },
             "ShipText": {
                 "InitialText": "Your objective is as follows: the [COLOR=3]SA-X[/COLOR] has discovered and destroyed a top secret [COLOR=3]Metroid[/COLOR] breeding facility. It released 5 infant Metroids into the station. Initial scans indicate that they are hiding at bosses. Find and capture 4 of them, to lure out the SA-X. Then initiate the station's self-destruct sequence. Uplink at [COLOR=2]Navigation Rooms[/COLOR] along the way. I can scan the station for useful equipment from there.[OBJECTIVE]Good. Move out.",
@@ -2305,17 +2305,17 @@
         },
         "Spanish": {
             "NavigationTerminals": {
-                "MainDeckEast": "Hint system still in development, we appreciate your patience.",
-                "MainDeckWest": "Hint system still in development, we appreciate your patience.",
-                "OperationsDeck": "Hint system still in development, we appreciate your patience.",
+                "MainDeckEast": "The [COLOR=3]Level 3 Keycard[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR].",
+                "MainDeckWest": "The [COLOR=3]Charge Beam[/COLOR] can be found in [COLOR=2]Sector 2 (TRO)[/COLOR].",
+                "OperationsDeck": "The [COLOR=3]Ice Beam[/COLOR] can be found in [COLOR=2]Sector 4 (AQA)[/COLOR].",
                 "AuxiliaryPower": "[COLOR=3]Charge Beam[/COLOR] is located in [COLOR=2]Sector 2 (TRO)[/COLOR].",
                 "RestrictedLabs": "[COLOR=3]Infant Metroid 1[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Ridley Arena[/COLOR]. [COLOR=3]Infant Metroid 2[/COLOR] is located in [COLOR=2]Main Deck - Arachnus Arena[/COLOR]. [COLOR=3]Infant Metroid 3[/COLOR] is located in [COLOR=2]Sector 4 (AQA) - Serris Arena[/COLOR]. [COLOR=3]Infant Metroid 4[/COLOR] is located in [COLOR=2]Main Deck - Yakuza Arena[/COLOR]. [COLOR=3]Infant Metroid 5[/COLOR] is located in [COLOR=2]Sector 1 (SRX) - Charge Core Arena[/COLOR].",
-                "Sector1Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector2Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector3Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector4Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector5Entrance": "Hint system still in development, we appreciate your patience.",
-                "Sector6Entrance": "Hint system still in development, we appreciate your patience."
+                "Sector1Entrance": "The [COLOR=3]Wide Beam[/COLOR] can be found in [COLOR=2]Sector 2 (TRO)[/COLOR].",
+                "Sector2Entrance": "The [COLOR=3]Wave Beam[/COLOR] can be found in [COLOR=2]Sector 1 (SRX)[/COLOR].",
+                "Sector3Entrance": "The [COLOR=3]Speed Booster[/COLOR] can be found in [COLOR=2]Sector 6 (NOC)[/COLOR].",
+                "Sector4Entrance": "The [COLOR=3]Gravity Suit[/COLOR] can be found in [COLOR=2]Sector 5 (ARC)[/COLOR].",
+                "Sector5Entrance": "The [COLOR=3]Level 4 Keycard[/COLOR] can be found in [COLOR=2]Sector 2 (TRO)[/COLOR].",
+                "Sector6Entrance": "The [COLOR=3]Screw Attack[/COLOR] can be found in [COLOR=2]Sector 3 (PYR)[/COLOR]."
             },
             "ShipText": {
                 "InitialText": "Your objective is as follows: the [COLOR=3]SA-X[/COLOR] has discovered and destroyed a top secret [COLOR=3]Metroid[/COLOR] breeding facility. It released 5 infant Metroids into the station. Initial scans indicate that they are hiding at bosses. Find and capture 4 of them, to lure out the SA-X. Then initiate the station's self-destruct sequence. Uplink at [COLOR=2]Navigation Rooms[/COLOR] along the way. I can scan the station for useful equipment from there.[OBJECTIVE]Good. Move out.",


Reviews:
user: login: duncathan
body: some design questions:
- why no joke hints? 
- you have the option to exclude the region or the area hint features. any interest in doing so? (particularly you might want to think about never using the area name in random hints, if you don't want hints to be too precise) 
- do you want to remove and/or hide any of the old hint features? (`beam_related` and such)

I don't care too much what the answers are, I just wanna be sure you do have an answer for each one
state: CHANGES_REQUESTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-11T19:04:13Z
user: login: JeffGainsNGames
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-11T20:28:18Z
user: login: duncathan
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-11T20:29:56Z
user: login: JeffGainsNGames
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-11T20:31:05Z
user: login: duncathan
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-12T03:56:22Z
user: login: JeffGainsNGames
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-12T03:57:44Z
user: login: duncathan
body: also fix conflicts
state: CHANGES_REQUESTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-13T20:41:22Z
user: login: duncathan
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-03-14T15:35:23Z

Review comments:
diff_hunk: @@ -1,18 +1,68 @@
 from __future__ import annotations
 
-from typing import override
+from typing import TYPE_CHECKING, override
 
+from randovania.game_description.db.node_identifier import NodeIdentifier
 from randovania.game_description.hint import (
-    HintItemPrecision,
-    HintLocationPrecision,
+    JokeHint,
     PrecisionPair,
 )
+from randovania.games.fusion.layout.fusion_configuration import FusionConfiguration
 from randovania.generator.hint_distributor import HintDistributor
 
+if TYPE_CHECKING:
+    from randovania.game_description.assignment import PickupTarget
+    from randovania.game_description.db.hint_node import HintNode
+    from randovania.game_description.game_patches import GamePatches
+    from randovania.generator.pre_fill_params import PreFillParams
+
 
-# TODO: add tests for distributor after hint system is confirmed
 class FusionHintDistributor(HintDistributor):
+    # Pre Filler
+    # Joke hints to go in pool
+    @override
+    @property
+    def num_joke_hints(self) -> int:
+        return 0
+
+    # Makes the listed features less interesting to hint
+    @override
+    def is_pickup_interesting(self, target: PickupTarget, player_id: int, hint_node: HintNode) -> bool:
+        non_interesting_features = ["key", "energy_tank", "charge"]
+        if target.player != player_id:
+            return True
+        for feature in non_interesting_features:
+            if target.pickup.has_hint_feature(feature):
+                return False
+        return True
+
     @override
     @property
     def default_precision_pair(self) -> PrecisionPair:
-        return PrecisionPair(HintLocationPrecision.REGION_ONLY, HintItemPrecision.DETAILED, True)
+        return PrecisionPair.featural()
+
+    @override
+    async def assign_specific_location_hints(self, patches: GamePatches, prefill: PreFillParams) -> GamePatches:
+        assert isinstance(prefill.configuration, FusionConfiguration)
+        fake_hints = [
+            {
+                "region": "Main Deck",
+                "area": "Auxiliary Navigation Room",
+                "node": "Navigation Terminal",
+                "type": JokeHint(),
+            },
+            {
+                "region": "Main Deck",
+                "area": "Restricted Navigation Room",
+                "node": "Navigation Terminal",
+                "type": JokeHint(),
+            },
+        ]
+        for hint in fake_hints:
+            patches = patches.assign_hint(
+                NodeIdentifier.create(hint["region"], hint["area"], hint["node"]), hint["type"]
path: randovania/games/fusion/generator/hint_distributor.py
user: login: duncathan
body: ```py
fake_hints = [
    ("Main Deck", "Auxiliary Navigation Room", "Navigation Terminal"),
    ("Main Deck", "Restricted Navigation Room", "Navigation Terminal"),
]
for region, area, node in fake_hints:
    patches = patches.assign_hint(NodeIdentifier.create(region, area, node), JokeHint())
```
created_at: 2025-03-11T18:56:40Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,18 +1,68 @@
 from __future__ import annotations
 
-from typing import override
+from typing import TYPE_CHECKING, override
 
+from randovania.game_description.db.node_identifier import NodeIdentifier
 from randovania.game_description.hint import (
-    HintItemPrecision,
-    HintLocationPrecision,
+    JokeHint,
     PrecisionPair,
 )
+from randovania.games.fusion.layout.fusion_configuration import FusionConfiguration
 from randovania.generator.hint_distributor import HintDistributor
 
+if TYPE_CHECKING:
+    from randovania.game_description.assignment import PickupTarget
+    from randovania.game_description.db.hint_node import HintNode
+    from randovania.game_description.game_patches import GamePatches
+    from randovania.generator.pre_fill_params import PreFillParams
+
 
-# TODO: add tests for distributor after hint system is confirmed
 class FusionHintDistributor(HintDistributor):
+    # Pre Filler
+    # Joke hints to go in pool
+    @override
+    @property
+    def num_joke_hints(self) -> int:
+        return 0
+
+    # Makes the listed features less interesting to hint
+    @override
+    def is_pickup_interesting(self, target: PickupTarget, player_id: int, hint_node: HintNode) -> bool:
+        non_interesting_features = ["key", "energy_tank", "charge"]
+        if target.player != player_id:
path: randovania/games/fusion/generator/hint_distributor.py
user: login: duncathan
body: what's this check for?
created_at: 2025-03-11T18:57:21Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,18 +1,68 @@
 from __future__ import annotations
 
-from typing import override
+from typing import TYPE_CHECKING, override
 
+from randovania.game_description.db.node_identifier import NodeIdentifier
 from randovania.game_description.hint import (
-    HintItemPrecision,
-    HintLocationPrecision,
+    JokeHint,
     PrecisionPair,
 )
+from randovania.games.fusion.layout.fusion_configuration import FusionConfiguration
 from randovania.generator.hint_distributor import HintDistributor
 
+if TYPE_CHECKING:
+    from randovania.game_description.assignment import PickupTarget
+    from randovania.game_description.db.hint_node import HintNode
+    from randovania.game_description.game_patches import GamePatches
+    from randovania.generator.pre_fill_params import PreFillParams
+
 
-# TODO: add tests for distributor after hint system is confirmed
 class FusionHintDistributor(HintDistributor):
+    # Pre Filler
+    # Joke hints to go in pool
+    @override
+    @property
+    def num_joke_hints(self) -> int:
+        return 0
+
+    # Makes the listed features less interesting to hint
+    @override
+    def is_pickup_interesting(self, target: PickupTarget, player_id: int, hint_node: HintNode) -> bool:
+        non_interesting_features = ["key", "energy_tank", "charge"]
path: randovania/games/fusion/generator/hint_distributor.py
user: login: duncathan
body: you shouldn't need energy tank in here any more I don't think
created_at: 2025-03-11T18:57:41Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,18 +1,68 @@
 from __future__ import annotations
 
-from typing import override
+from typing import TYPE_CHECKING, override
 
+from randovania.game_description.db.node_identifier import NodeIdentifier
 from randovania.game_description.hint import (
-    HintItemPrecision,
-    HintLocationPrecision,
+    JokeHint,
     PrecisionPair,
 )
+from randovania.games.fusion.layout.fusion_configuration import FusionConfiguration
 from randovania.generator.hint_distributor import HintDistributor
 
+if TYPE_CHECKING:
+    from randovania.game_description.assignment import PickupTarget
+    from randovania.game_description.db.hint_node import HintNode
+    from randovania.game_description.game_patches import GamePatches
+    from randovania.generator.pre_fill_params import PreFillParams
+
 
-# TODO: add tests for distributor after hint system is confirmed
 class FusionHintDistributor(HintDistributor):
+    # Pre Filler
+    # Joke hints to go in pool
+    @override
+    @property
+    def num_joke_hints(self) -> int:
+        return 0
+
+    # Makes the listed features less interesting to hint
+    @override
+    def is_pickup_interesting(self, target: PickupTarget, player_id: int, hint_node: HintNode) -> bool:
+        non_interesting_features = ["key", "energy_tank", "charge"]
+        if target.player != player_id:
path: randovania/games/fusion/generator/hint_distributor.py
user: login: JeffGainsNGames
body: my assumption is best explained as a scenario:
World 0 is fusion and won't hint it's own charge beam if local
World 1 is prime and it's charge beam is in World 0
if it's an offworld item it should be still considered for hinting (in this scenario they both have a `charge` feature)
created_at: 2025-03-11T20:28:18Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,18 +1,68 @@
 from __future__ import annotations
 
-from typing import override
+from typing import TYPE_CHECKING, override
 
+from randovania.game_description.db.node_identifier import NodeIdentifier
 from randovania.game_description.hint import (
-    HintItemPrecision,
-    HintLocationPrecision,
+    JokeHint,
     PrecisionPair,
 )
+from randovania.games.fusion.layout.fusion_configuration import FusionConfiguration
 from randovania.generator.hint_distributor import HintDistributor
 
+if TYPE_CHECKING:
+    from randovania.game_description.assignment import PickupTarget
+    from randovania.game_description.db.hint_node import HintNode
+    from randovania.game_description.game_patches import GamePatches
+    from randovania.generator.pre_fill_params import PreFillParams
+
 
-# TODO: add tests for distributor after hint system is confirmed
 class FusionHintDistributor(HintDistributor):
+    # Pre Filler
+    # Joke hints to go in pool
+    @override
+    @property
+    def num_joke_hints(self) -> int:
+        return 0
+
+    # Makes the listed features less interesting to hint
+    @override
+    def is_pickup_interesting(self, target: PickupTarget, player_id: int, hint_node: HintNode) -> bool:
+        non_interesting_features = ["key", "energy_tank", "charge"]
+        if target.player != player_id:
path: randovania/games/fusion/generator/hint_distributor.py
user: login: duncathan
body: offworld pickups use their own game's hint distributor to determine if they're interesting 
created_at: 2025-03-11T20:29:56Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,18 +1,68 @@
 from __future__ import annotations
 
-from typing import override
+from typing import TYPE_CHECKING, override
 
+from randovania.game_description.db.node_identifier import NodeIdentifier
 from randovania.game_description.hint import (
-    HintItemPrecision,
-    HintLocationPrecision,
+    JokeHint,
     PrecisionPair,
 )
+from randovania.games.fusion.layout.fusion_configuration import FusionConfiguration
 from randovania.generator.hint_distributor import HintDistributor
 
+if TYPE_CHECKING:
+    from randovania.game_description.assignment import PickupTarget
+    from randovania.game_description.db.hint_node import HintNode
+    from randovania.game_description.game_patches import GamePatches
+    from randovania.generator.pre_fill_params import PreFillParams
+
 
-# TODO: add tests for distributor after hint system is confirmed
 class FusionHintDistributor(HintDistributor):
+    # Pre Filler
+    # Joke hints to go in pool
+    @override
+    @property
+    def num_joke_hints(self) -> int:
+        return 0
+
+    # Makes the listed features less interesting to hint
+    @override
+    def is_pickup_interesting(self, target: PickupTarget, player_id: int, hint_node: HintNode) -> bool:
+        non_interesting_features = ["key", "energy_tank", "charge"]
+        if target.player != player_id:
path: randovania/games/fusion/generator/hint_distributor.py
user: login: JeffGainsNGames
body: okay good to know, first time thinking on this from a MW perspective
makes much more sense 
created_at: 2025-03-11T20:31:05Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,15 @@
+from __future__ import annotations
+
+from randovania.exporter.hints.joke_hints import GENERIC_JOKE_HINTS
+
+FUSION_JOKE_HINTS = GENERIC_JOKE_HINTS + [
+    "Adam has not yet authorized the use of this hint.",
+    "Space Pirates, strangely, dislike theft.",
+    "We've been trying to contact you about your ship's extended warranty.",
+    "Yellow X are lemon flavoured.",
+    "Green X are lime flavoured.",
+    "Red X are strawberry flavoured.",
+    "Blue X are blueberry flavoured.",
+    "The Light Suit is fully resistant to the effects of Dark Aether.",
path: randovania/games/fusion/exporter/joke_hints.py
user: login: duncathan
body: for fusion?
created_at: 2025-03-12T03:56:21Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,15 @@
+from __future__ import annotations
+
+from randovania.exporter.hints.joke_hints import GENERIC_JOKE_HINTS
+
+FUSION_JOKE_HINTS = GENERIC_JOKE_HINTS + [
+    "Adam has not yet authorized the use of this hint.",
+    "Space Pirates, strangely, dislike theft.",
+    "We've been trying to contact you about your ship's extended warranty.",
+    "Yellow X are lemon flavoured.",
+    "Green X are lime flavoured.",
+    "Red X are strawberry flavoured.",
+    "Blue X are blueberry flavoured.",
+    "The Light Suit is fully resistant to the effects of Dark Aether.",
path: randovania/games/fusion/exporter/joke_hints.py
user: login: JeffGainsNGames
body: Copy/paste, good catch
created_at: 2025-03-12T03:57:44Z
author_association: CONTRIBUTOR
diff_hunk: @@ -2804,7 +2804,50 @@
             "to_shuffle_proportion": 1.0
         }
     },
-    "hint_feature_database": {},
+    "hint_feature_database": {
+        "data_room": {
+            "long_name": "Data Room",
+            "hint_details": [
+                "",
+                "in a Data Room"
+            ]
+        },
+        "security_room": {
+            "long_name": "Security Room",
+            "hint_details": [
+                "",
+                "in a Security Room"
+            ]
+        },
+        "boss": {
+            "long_name": "Boss",
+            "hint_details": [
+                "",
+                "guarded by a boss"
+            ]
+        },
+        "checkpoint": {
+            "long_name": "Checkpoint",
+            "hint_details": [
+                "",
+                "near a Checkpoint"
+            ]
+        },
path: randovania/games/fusion/logic_database/header.json
user: login: duncathan
body: this one needs a better name (something with "Shutter" probably)
created_at: 2025-03-13T20:40:39Z
author_association: CONTRIBUTOR

PR comments:
user: login: JeffGainsNGames
created_at: 2025-03-11T20:21:25Z
body: Thanks for the insights, I have been poking around in `HintDistributor` to see what is available to me but I haven't gotten around to the design side of things yet, just more getting all the new stuff working at minimum.


author_association: CONTRIBUTOR
user: login: codecov[bot]
created_at: 2025-03-11T21:44:00Z
body: ## [Codecov](https://app.codecov.io/gh/randovania/randovania/pull/8083?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=randovania) Report
Attention: Patch coverage is `76.74419%` with `10 lines` in your changes missing coverage. Please review.
> Project coverage is 85.65%. Comparing base [(`20ff7f7`)](https://app.codecov.io/gh/randovania/randovania/commit/20ff7f77bf683d39ad6433302a76cf9398fad683?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=randovania) to head [(`589f69b`)](https://app.codecov.io/gh/randovania/randovania/commit/589f69b0c93b9dff5a89a3bce63d5b7be2e4e47f?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=randovania).
> Report is 22 commits behind head on main.

| [Files with missing lines](https://app.codecov.io/gh/randovania/randovania/pull/8083?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=randovania) | Patch % | Lines |
|---|---|---|
| [...dovania/games/fusion/generator/hint\_distributor.py](https://app.codecov.io/gh/randovania/randovania/pull/8083?src=pr&el=tree&filepath=randovania%2Fgames%2Ffusion%2Fgenerator%2Fhint_distributor.py&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=randovania#diff-cmFuZG92YW5pYS9nYW1lcy9mdXNpb24vZ2VuZXJhdG9yL2hpbnRfZGlzdHJpYnV0b3IucHk=) | 69.23% | [8 Missing :warning: ](https://app.codecov.io/gh/randovania/randovania/pull/8083?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=randovania) |
| [...ovania/games/fusion/exporter/patch\_data\_factory.py](https://app.codecov.io/gh/randovania/randovania/pull/8083?src=pr&el=tree&filepath=randovania%2Fgames%2Ffusion%2Fexporter%2Fpatch_data_factory.py&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=randovania#diff-cmFuZG92YW5pYS9nYW1lcy9mdXNpb24vZXhwb3J0ZXIvcGF0Y2hfZGF0YV9mYWN0b3J5LnB5) | 85.71% | [0 Missing and 2 partials :warning: ](https://app.codecov.io/gh/randovania/randovania/pull/8083?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=randovania) |

<details><summary>Additional details and impacted files</summary>


```diff
@@            Coverage Diff             @@
##             main    #8083      +/-   ##
==========================================
- Coverage   85.65%   85.65%   -0.01%     
==========================================
  Files         694      695       +1     
  Lines       45039    45075      +36     
  Branches     5571     5576       +5     
==========================================
+ Hits        38580    38607      +27     
- Misses       5223     5230       +7     
- Partials     1236     1238       +2     
```

</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/randovania/randovania/pull/8083?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=randovania).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=randovania).

<details><summary>🚀 New features to boost your workflow: </summary>

- ❄ [Test Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, report on failures, and find test suite problems.
</details>
author_association: NONE
user: login: JeffGainsNGames
created_at: 2025-03-12T03:11:13Z
body: ![image](https://github.com/user-attachments/assets/6ce07906-bd31-40d3-addc-efc25a2f6075)

author_association: CONTRIBUTOR
user: login: duncathan
created_at: 2025-03-12T03:59:37Z
body: > ![image](https://private-user-images.githubusercontent.com/125271738/421661907-6ce07906-bd31-40d3-addc-efc25a2f6075.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NDE3NTIyMzQsIm5iZiI6MTc0MTc1MTkzNCwicGF0aCI6Ii8xMjUyNzE3MzgvNDIxNjYxOTA3LTZjZTA3OTA2LWJkMzEtNDBkMy1hZGRjLWVmYzI1YTJmNjA3NS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMzEyJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDMxMlQwMzU4NTRaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT01NWIxNzFhZGExMDBiY2Q0N2RmNDAzY2QxYTllYmQ0Y2I1YjM1NzdlYWNmMjI2OTYxMzc2ZTdhZjUyNjdjN2Q1JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.FAks_O2UsQ2LR1B_BkGJltUSAqYv7KFnj3biv1kpaKo)

we do have the hint locations tab that automatically fills this out... but it's also ugly as sin ATM
author_association: CONTRIBUTOR
user: login: JeffGainsNGames
created_at: 2025-03-12T18:38:07Z
body: initial features, more testing and work to be done here but will leave that for later PRs
![image](https://github.com/user-attachments/assets/6ae64b7f-327f-462b-8ae8-11ebe9f431ef)
![image](https://github.com/user-attachments/assets/5f19f592-0782-4dfa-bcd5-d00dc7cb5acd)

author_association: CONTRIBUTOR