Preview enemy reactions on move cells
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user