Preview enemy reactions on move cells

This commit is contained in:
2026-06-20 13:01:14 +09:00
parent 48160decbb
commit a039ca6037
2 changed files with 76 additions and 2 deletions

View File

@@ -6542,6 +6542,14 @@ func _ai_zone_cells_for_unit(unit: Dictionary) -> Array[Vector2i]:
return cells
func _ai_zone_contains_cell(unit: Dictionary, cell: Vector2i) -> bool:
var radius := _ai_zone_radius_for_unit(unit)
var anchor := _ai_zone_anchor_for_unit(unit)
if radius < 0 or not state.is_inside(anchor) or not state.is_inside(cell):
return false
return absi(cell.x - anchor.x) + absi(cell.y - anchor.y) <= radius
func _ai_zone_anchor_for_unit(unit: Dictionary) -> Vector2i:
var behavior := str(unit.get("ai_behavior", "")).strip_edges().to_lower()
var fallback: Vector2i = unit.get("pos", Vector2i(-1, -1))
@@ -8618,10 +8626,49 @@ func _hover_intent_preview_badge(selected: Dictionary, target: Dictionary) -> Di
return _make_target_preview_badge("선택", "select")
return {}
if move_cells.has(hover_cell):
return _make_target_preview_badge("행군", "move")
return _move_cell_preview_badge(hover_cell)
return {}
func _move_cell_preview_badge(cell: Vector2i) -> Dictionary:
var sentry_names := _ai_reaction_unit_names_for_cell(cell, "sentry")
if not sentry_names.is_empty():
var lure_badge := _make_target_preview_badge_at("유인", "advance", cell)
lure_badge["tooltip"] = "초병 반응권: %s" % _compact_name_list(sentry_names, 2)
return lure_badge
var guard_names := _ai_reaction_unit_names_for_cell(cell, "guard")
if not guard_names.is_empty():
var guard_badge := _make_target_preview_badge_at("경계", "select", cell)
guard_badge["tooltip"] = "거점 경계권: %s" % _compact_name_list(guard_names, 2)
return guard_badge
var threat_names := state.get_threatening_unit_names(cell, BattleState.TEAM_ENEMY)
if not threat_names.is_empty():
var danger_badge := _make_target_preview_badge_at("위험", "danger", cell)
danger_badge["tooltip"] = "현재 적 공격권: %s" % _compact_name_list(threat_names, 2)
return danger_badge
return _make_target_preview_badge_at("행군", "move", cell)
func _ai_reaction_unit_names_for_cell(cell: Vector2i, behavior: String) -> Array[String]:
var names: Array[String] = []
var normalized_behavior := behavior.strip_edges().to_lower()
if normalized_behavior.is_empty() or not state.is_inside(cell):
return names
for unit in state.get_living_units(BattleState.TEAM_ENEMY):
if not bool(unit.get("deployed", true)):
continue
if str(unit.get("ai_behavior", "")).strip_edges().to_lower() != normalized_behavior:
continue
if normalized_behavior == "sentry" and bool(unit.get("ai_awake", false)):
continue
if not _ai_zone_contains_cell(unit, cell):
continue
var unit_name := str(unit.get("name", unit.get("id", "부대")))
if not names.has(unit_name):
names.append(unit_name)
return names
func _make_target_preview_badge(text: String, kind: String) -> Dictionary:
return _make_target_preview_badge_at(text, kind, hover_cell)