<aside> <img src="/icons/reorder_gray.svg" alt="/icons/reorder_gray.svg" width="40px" />
Navigation
</aside>
<aside> 🛠️ QA-only Inspector tool for fast-forwarding chest, item, and frenzy states during testing without going through the normal gameplay flow.
</aside>
DebugPanelBehavior (Assets/Project Files/Game/Scripts/DebugPanelBehavior.cs) is the only component of this tool. It lives on the [DEBUG] object in the Game scene and is not part of any Watermelon Core Dev Panel module. It implements IDebugPersistentComponent, a marker interface that keeps its Inspector field values from being lost when Play Mode ends: an editor-only handler snapshots them on exit and restores them once the editor scene reloads, so a debug setup tweaked mid-test is still there next run.
DebugPanelBehavior - single MonoBehaviour with five Inspector tabs (Chest, Item, Auto Click, Frenzy, Effectors), each holding fields and [Button] actions. Select the [DEBUG] object in the Hierarchy during Play Mode to use it.[DEBUG] is a root-level GameObject in the Game scene, with no children. Its only components are Transform and DebugPanelBehavior.

The Auto Click tab wires in mainButton (MainButtonBehavior), assigned in the Inspector to the scene's main click button. If left unassigned, holding Space does nothing since the auto-click loop null-checks mainButton before calling OnObjectClicked(). The object can be moved or duplicated freely since nothing else in the scene parents under it or references it, but only one instance should exist at a time: IDebugPersistentComponent snapshotting/restoring tracks every instance in the scene independently, so duplicates would each keep their own separate saved state.
Fields: chestTier (ChestTier), chestEffects (ChestEffectType[]).
SpawnChest()Button: "Spawn Chest". Keyboard: C.
Spawns a chest at a random point from ChestSpawnAreaController.GetRandomSpawnPoint(), using the fixed chestTier and chestEffects set in the Inspector, via ChestSpawnController.SpawnChestAt. Each entry in chestEffects is matched against ChestEffectDatabase.Database to resolve the full ChestEffectEntry list. Leave chestEffects empty to spawn a chest with no effects.
Fields: itemId (string, picked via [ItemPicker]), itemValue (float), giveItemCopies (int).
SpawnItem()Button: "Spawn Item".
Looks up itemId via ItemDatabase.Database.GetItem(itemId) and, if found, spawns it with ItemDropController.SpawnDrop at a random point from ChestSpawnAreaController.GetRandomSpawnPoint(), using itemValue as its value. Goes through the normal drop/fall/interact chain, unlike GiveItemCopies() below. Does nothing if itemId does not resolve to an ItemData.
GiveItemCopies()Button: "Give Item Copies".
Calls ClickerController.AddItemPickup(itemId) in a loop, giveItemCopies times. This grants copies directly, setting the discovered flag and count as a real pickup would, but bypasses the drop/fall/interact chain and its reveal-popup queue entirely. Use it to quickly stock a stack past the Collection Book's collect threshold without waiting on drops or popups.
Fields: mainButton (MainButtonBehavior), autoClickInterval (float).
Keyboard: hold Space. No Inspector button, this tab only reacts to the held key.
While Space is held, Update() calls mainButton.OnObjectClicked() every autoClickInterval seconds, gated by mainButton.CanBeClicked(). The timer resets to 0 as soon as Space is released, so the next hold always starts with an immediate click.
No fields, buttons only.
ActivateFrenzy()Button: "Activate Frenzy".
Calls FrenzyController.Activate() directly, starting a Frenzy without waiting for the normal spawn/collect trigger.
SpawnFrenzyIcon()Button: "Spawn Frenzy Icon".
Calls FrenzyIconSpawnController.DebugForceSpawn() to force-spawn a Frenzy icon on demand, without waiting for its normal spawn conditions.
Field: effector (EffectorData, picked via the object field).
SpawnEffectorOffer()Button: "Spawn Effector Offer".
Calls EffectorOfferController.DebugForceSpawn(effector) to force the offer button for effector to appear immediately, replacing whatever offer is currently up. Still ad-gated on click like a normal offer - see Effectors.
ActivateEffector()Button: "Activate Effector".
Calls EffectorController.Activate(effector) directly, skipping the offer/ad flow entirely and turning the multiplier on right away.