# Proposal: interactive map elements \(Lotus/Summit doors\) à la valoplant · PR \#109 · dara/icarus

[View on GitCafe](https://git.cafe/dara/icarus/pull/109)

Repository: [dara/icarus](https://git.cafe/dara/icarus)

Visibility: public

State: open

Source repository: dara/icarus

Source branch: research/valoplant-interactive-doors

Target branch: main

Head commit: 80fe7873bfde0f6289c4dedf36b16d801bc91d39

[Discussion and reviews](https://git.cafe/dara/icarus/pull/109)

[Commits](https://git.cafe/dara/icarus/pull/109/commits?format=markdown)

[Files changed](https://git.cafe/dara/icarus/pull/109/diffs?format=markdown)

## Description

---

## What this is

**Research only — no implementation.** Adds `docs/proposals/interactive-map-elements.md`, a design proposal for clickable, stateful map elements requested by users: click a Lotus door to spin it open/closed, click a Summit door to turn it black (dropped), "like valoplant".

## Summary

**What valoplant does:** draws door markers on top of the map art that are directly clickable. Lotus's two rotating doors toggle open/closed with a rotation of the door graphic; Summit's three droppable walls toggle between up and dropped, drawn as a solid dark bar, and their state also feeds valoplant's agent pathing and vision cones.

**Proposed Icarus design:**
- `lib/const/map_interactables.dart` — static per-map `MapInteractable` definitions (id, kind, normalized position/size/angle), same style as `Maps` constants. Only Lotus and Summit have entries.
- Per-page state: `Map<String, int> interactableStates` on `StrategyPage` (absent = default), serialized through the existing page JSON so Hive, .ica round-trip, and old files work unchanged; version bump, no migration.
- `MapInteractableLayer` in `interactive_map.dart` between the map SVG and `PlacedWidgetBuilder`, using `MouseWatch` for hover/tap; `AnimatedRotation` spin for Lotus, near-black color tween for dropped Summit doors; defense side reuses the existing `Transform.flip` overlay pattern.
- Extensions ride existing rails: smoke/Viper Wall fade and Sage Wall segment breaking as additive `AbilityVisualState` / `PlacedAbility` fields, toggled via the existing undoable `updateVisualState` path.
- Phases: 1) Summit doors, 2) Lotus doors, 3) placed-element states, 4) stretch — vision-cone integration and transition animation.

See the doc for file-level details, open questions, and risks.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->

## Summary by CodeRabbit

* **Documentation**
  * Added a research proposal for clickable Lotus and Summit map doors.
  * Documented proposed static interactable definitions, persisted toggle state, undo support, serialization, hover behavior, and animated transitions.
  * Outlined phased implementation considerations, including exports, vision handling, gesture priority, migration, and calibration.
  * Captured potential future support for placed elements such as fading smokes, walls, and breakable Sage Wall segments.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
