Expand opening battle map pressure
This commit is contained in:
@@ -311,8 +311,8 @@ func _check_battle_presentation_sequence_contract(failures: Array[String]) -> vo
|
||||
failures.append("missing battle presentation helper: %s" % method_name)
|
||||
|
||||
scene._begin_battle_presentation_sequence()
|
||||
scene._on_unit_motion_requested("yellow_turban_1", Vector2i(12, 1), Vector2i(11, 1))
|
||||
scene._on_unit_action_motion_requested("yellow_turban_2", Vector2i(9, 4), Vector2i(8, 4), "attack")
|
||||
scene._on_unit_motion_requested("yellow_turban_1", Vector2i(20, 1), Vector2i(19, 1))
|
||||
scene._on_unit_action_motion_requested("yellow_turban_2", Vector2i(12, 5), Vector2i(11, 5), "attack")
|
||||
scene._on_combat_feedback_requested("yellow_turban_2", "-10", "damage")
|
||||
scene._end_battle_presentation_sequence()
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ func _init() -> void:
|
||||
failures,
|
||||
"001 turn pressure risk",
|
||||
_defeat_text("res://data/scenarios/001_yellow_turbans.json"),
|
||||
"잔여 군령 17"
|
||||
"잔여 군령 21"
|
||||
)
|
||||
_check_contains(
|
||||
failures,
|
||||
@@ -332,7 +332,7 @@ func _check_opening_battle_requires_castle_capture(failures: Array[String]) -> v
|
||||
failures.append("opening castle objective smoke could not load scenario")
|
||||
return
|
||||
var marker_cells := state.get_objective_cells()
|
||||
for castle_cell in [Vector2i(12, 0), Vector2i(13, 0), Vector2i(12, 1), Vector2i(13, 1)]:
|
||||
for castle_cell in [Vector2i(19, 0), Vector2i(20, 0), Vector2i(21, 0), Vector2i(19, 1), Vector2i(20, 1), Vector2i(21, 1), Vector2i(19, 2), Vector2i(20, 2), Vector2i(21, 2)]:
|
||||
if not marker_cells.has(castle_cell):
|
||||
failures.append("opening battle should mark castle capture cell %s: %s" % [str(castle_cell), str(marker_cells)])
|
||||
if state.get_objective_cell_label(castle_cell) != "성채 장악":
|
||||
@@ -343,7 +343,7 @@ func _check_opening_battle_requires_castle_capture(failures: Array[String]) -> v
|
||||
if str(state.battle_status) != BattleStateScript.STATUS_ACTIVE:
|
||||
failures.append("opening battle should not end before castle capture, got %s" % str(state.battle_status))
|
||||
var cao_cao: Dictionary = state.get_unit("cao_cao")
|
||||
cao_cao["pos"] = Vector2i(12, 1)
|
||||
cao_cao["pos"] = Vector2i(20, 1)
|
||||
state._check_battle_status()
|
||||
if str(state.battle_status) != BattleStateScript.STATUS_ACTIVE:
|
||||
failures.append("opening battle should wait for late reserve before victory, got %s" % str(state.battle_status))
|
||||
@@ -393,11 +393,11 @@ func _check_briefing_battlefield_overview(failures: Array[String]) -> void:
|
||||
scene.free()
|
||||
return
|
||||
var overview := scene._format_briefing_battlefield_overview_text()
|
||||
_check_contains(failures, "001 briefing map size", overview, "14칸 x 10칸")
|
||||
_check_contains(failures, "001 briefing enemy count", overview, "적세 12명")
|
||||
_check_contains(failures, "001 briefing map size", overview, "22칸 x 14칸")
|
||||
_check_contains(failures, "001 briefing enemy count", overview, "적세 16명")
|
||||
_check_contains(failures, "001 briefing enemy classes", overview, "보병")
|
||||
_check_contains(failures, "001 briefing village recovery", overview, "마을 4칸 +6")
|
||||
_check_contains(failures, "001 briefing castle recovery", overview, "성채 4칸 +8")
|
||||
_check_contains(failures, "001 briefing village recovery", overview, "마을 8칸 +6")
|
||||
_check_contains(failures, "001 briefing castle recovery", overview, "성채 9칸 +8")
|
||||
scene.free()
|
||||
|
||||
|
||||
@@ -406,25 +406,25 @@ func _check_opening_battle_extended_pressure(failures: Array[String]) -> void:
|
||||
if not state.load_battle("res://data/scenarios/001_yellow_turbans.json"):
|
||||
failures.append("opening battle pressure smoke could not load scenario")
|
||||
return
|
||||
if state.get_turn_limit() != 17:
|
||||
failures.append("opening battle should allow play through turn 17, got limit %d" % state.get_turn_limit())
|
||||
if state.get_living_units(BattleStateScript.TEAM_ENEMY).size() != 12:
|
||||
failures.append("opening battle should start with 12 enemies, got %d" % state.get_living_units(BattleStateScript.TEAM_ENEMY).size())
|
||||
if state.get_turn_limit() != 21:
|
||||
failures.append("opening battle should allow play through turn 21, got limit %d" % state.get_turn_limit())
|
||||
if state.get_living_units(BattleStateScript.TEAM_ENEMY).size() != 16:
|
||||
failures.append("opening battle should start with 16 enemies, got %d" % state.get_living_units(BattleStateScript.TEAM_ENEMY).size())
|
||||
if state._condition_gate_open({"after_event": "turn_11_last_rally"}):
|
||||
failures.append("opening battle final defeat-all condition should be gated until turn 11 last rally")
|
||||
state._run_events("turn_start", BattleStateScript.TEAM_ENEMY, 4)
|
||||
if state.get_living_units(BattleStateScript.TEAM_ENEMY).size() != 14:
|
||||
failures.append("opening battle should field 14 enemies after turn 4 reserve, got %d" % state.get_living_units(BattleStateScript.TEAM_ENEMY).size())
|
||||
if state.get_living_units(BattleStateScript.TEAM_ENEMY).size() != 19:
|
||||
failures.append("opening battle should field 19 enemies after turn 4 reserve, got %d" % state.get_living_units(BattleStateScript.TEAM_ENEMY).size())
|
||||
if int(state.get_unit("xiahou_dun").get("ai_target_priority", 0)) < 9:
|
||||
failures.append("opening battle turn 4 reserve should pressure Xiahou Dun's vanguard")
|
||||
state._run_events("turn_start", BattleStateScript.TEAM_ENEMY, 7)
|
||||
if state.get_living_units(BattleStateScript.TEAM_ENEMY).size() != 16:
|
||||
failures.append("opening battle should field 16 enemies after turn 7 raiders, got %d" % state.get_living_units(BattleStateScript.TEAM_ENEMY).size())
|
||||
if state.get_living_units(BattleStateScript.TEAM_ENEMY).size() != 22:
|
||||
failures.append("opening battle should field 22 enemies after turn 7 raiders, got %d" % state.get_living_units(BattleStateScript.TEAM_ENEMY).size())
|
||||
if int(state.get_unit("cao_cao").get("ai_target_priority", 0)) < 11:
|
||||
failures.append("opening battle turn 7 raiders should pressure Cao Cao")
|
||||
state._run_events("turn_start", BattleStateScript.TEAM_ENEMY, 9)
|
||||
if state.get_living_units(BattleStateScript.TEAM_ENEMY).size() != 19:
|
||||
failures.append("opening battle should field 19 enemies after late reserve, got %d" % state.get_living_units(BattleStateScript.TEAM_ENEMY).size())
|
||||
if state.get_living_units(BattleStateScript.TEAM_ENEMY).size() != 26:
|
||||
failures.append("opening battle should field 26 enemies after late reserve, got %d" % state.get_living_units(BattleStateScript.TEAM_ENEMY).size())
|
||||
if int(state.get_unit("cao_cao").get("ai_target_priority", 0)) < 12:
|
||||
failures.append("opening battle turn 9 reserve should keep pressure on Cao Cao")
|
||||
if state._condition_gate_open({"after_event": "turn_11_last_rally"}):
|
||||
@@ -432,8 +432,8 @@ func _check_opening_battle_extended_pressure(failures: Array[String]) -> void:
|
||||
state._run_events("turn_start", BattleStateScript.TEAM_ENEMY, 11)
|
||||
if not state._condition_gate_open({"after_event": "turn_11_last_rally"}):
|
||||
failures.append("opening battle final gate should open after turn 11 last rally event")
|
||||
if state.get_living_units(BattleStateScript.TEAM_ENEMY).size() != 22:
|
||||
failures.append("opening battle should field 22 enemies after final rally, got %d" % state.get_living_units(BattleStateScript.TEAM_ENEMY).size())
|
||||
if state.get_living_units(BattleStateScript.TEAM_ENEMY).size() != 30:
|
||||
failures.append("opening battle should field 30 enemies after final rally, got %d" % state.get_living_units(BattleStateScript.TEAM_ENEMY).size())
|
||||
if int(state.get_unit("cao_cao").get("ai_target_priority", 0)) < 13 or int(state.get_unit("xiahou_dun").get("ai_target_priority", 0)) < 13:
|
||||
failures.append("opening battle turn 11 last rally should pressure both Cao Cao and Xiahou Dun")
|
||||
|
||||
@@ -1176,19 +1176,22 @@ func _assert_required_unit(failures: Array[String], state, unit_id: String, labe
|
||||
|
||||
|
||||
func _check_opening_board_avoids_side_panel(failures: Array[String]) -> void:
|
||||
var state = BattleStateScript.new()
|
||||
if not state.load_battle("res://data/scenarios/001_yellow_turbans.json"):
|
||||
var scene = BattleSceneScript.new()
|
||||
if not scene.state.load_battle("res://data/scenarios/001_yellow_turbans.json"):
|
||||
failures.append("opening board layout smoke could not load scenario")
|
||||
scene.free()
|
||||
return
|
||||
var board_rect := Rect2(
|
||||
BattleSceneScript.BOARD_OFFSET,
|
||||
Vector2(state.get_map_size()) * BattleSceneScript.TILE_SIZE
|
||||
)
|
||||
var board_rect := scene._board_rect()
|
||||
var view_rect := scene._map_view_rect()
|
||||
var side_rect := Rect2(BattleSceneScript.SIDE_PANEL_POSITION, BattleSceneScript.SIDE_PANEL_SIZE)
|
||||
if board_rect.intersects(side_rect):
|
||||
failures.append("opening board should not overlap side HUD: board %s side %s" % [str(board_rect), str(side_rect)])
|
||||
if board_rect.end.y > 720.0:
|
||||
failures.append("opening board should fit within the default viewport height: %s" % str(board_rect))
|
||||
if view_rect.intersects(side_rect):
|
||||
failures.append("opening map view should not overlap side HUD: view %s side %s" % [str(view_rect), str(side_rect)])
|
||||
if board_rect.size.x <= view_rect.size.x or board_rect.size.y <= view_rect.size.y:
|
||||
failures.append("opening board should be larger than the visible map view to exercise scrolling: board %s view %s" % [str(board_rect), str(view_rect)])
|
||||
var far_offset := scene._clamped_board_scroll_offset(Vector2(-9999.0, -9999.0))
|
||||
if far_offset.x >= -0.01 or far_offset.y >= -0.01:
|
||||
failures.append("opening board should allow both horizontal and vertical scrolling: %s" % str(far_offset))
|
||||
scene.free()
|
||||
|
||||
|
||||
func _check_objective_notice(failures: Array[String]) -> void:
|
||||
|
||||
@@ -32,6 +32,7 @@ func _check_deferred_move_events(failures: Array[String]) -> void:
|
||||
|
||||
var from_cell := Vector2i(1, 3)
|
||||
var to_cell := Vector2i(2, 3)
|
||||
state.get_unit("cao_cao")["pos"] = from_cell
|
||||
state.battle_events.append({
|
||||
"id": "pending_move_gold",
|
||||
"once": true,
|
||||
@@ -86,6 +87,7 @@ func _check_scene_post_move_menu_flow(failures: Array[String]) -> void:
|
||||
scene.briefing_panel.visible = false
|
||||
scene.result_panel.visible = false
|
||||
scene._clear_pending_move_state()
|
||||
scene.state.get_unit("cao_cao")["pos"] = Vector2i(1, 3)
|
||||
|
||||
if not scene.state.select_unit("cao_cao"):
|
||||
failures.append("could not select Cao Cao for scene flow")
|
||||
@@ -246,6 +248,7 @@ func _check_scene_post_move_attack_targeting(failures: Array[String]) -> void:
|
||||
enemy["hp"] = 24
|
||||
enemy["def"] = 1
|
||||
var cao_cao: Dictionary = scene.state.get_unit("cao_cao")
|
||||
cao_cao["pos"] = Vector2i(1, 3)
|
||||
cao_cao["agi"] = 999
|
||||
cao_cao["atk"] = 60
|
||||
scene.state.rng.seed = 1
|
||||
@@ -383,6 +386,7 @@ func _check_scene_post_move_tactic_picker_flow(failures: Array[String]) -> void:
|
||||
enemy["hp"] = 28
|
||||
enemy["def"] = 1
|
||||
var cao_cao: Dictionary = scene.state.get_unit("cao_cao")
|
||||
cao_cao["pos"] = Vector2i(1, 3)
|
||||
cao_cao["int"] = 80
|
||||
cao_cao["mp"] = 10
|
||||
|
||||
@@ -491,6 +495,7 @@ func _check_scene_post_move_item_picker_flow(failures: Array[String]) -> void:
|
||||
ally["pos"] = Vector2i(2, 4)
|
||||
ally["hp"] = 12
|
||||
var cao_cao: Dictionary = scene.state.get_unit("cao_cao")
|
||||
cao_cao["pos"] = Vector2i(1, 3)
|
||||
cao_cao["mp"] = 10
|
||||
|
||||
scene.state.battle_events.append({
|
||||
|
||||
@@ -64,7 +64,7 @@ func _check_hud_reuses_status_summary(failures: Array[String]) -> void:
|
||||
}
|
||||
]
|
||||
scene.state.selected_unit_id = "cao_cao"
|
||||
scene.hover_cell = Vector2i(1, 3)
|
||||
scene.hover_cell = Vector2i(1, 6)
|
||||
scene._update_hud()
|
||||
_check_contains(failures, "selected HUD status", scene.selected_label.text, "상태: 방비 -2 (2회)")
|
||||
_check_contains(failures, "hover tile status", scene.cell_info_label.text, "상태: 방비 -2 (2회)")
|
||||
|
||||
@@ -2967,7 +2967,7 @@ func _check_scene_texture_loading(failures: Array[String]) -> void:
|
||||
if not merchant_notice.contains("군막 상인") or not merchant_notice.contains("길가의 물자"):
|
||||
failures.append("shop merchant notice should include name and flavor lines")
|
||||
var camp_overview := scene._format_briefing_camp_overview_text(scene.state.get_briefing(), false)
|
||||
for expected in ["위치: 영천, 중평 원년", "군막:", "준비:", "군자금 0냥", "군막 회의 · 3건", "보급 대기 1건", "군상 물품 · 2종", "출진 명부 2명 중 2명", "진형 배치 4칸", "비축 물자"]:
|
||||
for expected in ["위치: 영천, 중평 원년", "군막:", "준비:", "군자금 0냥", "군막 회의 · 3건", "보급 대기 1건", "군상 물품 · 2종", "출진 명부 2명 중 2명", "진형 배치 6칸", "비축 물자"]:
|
||||
if not camp_overview.contains(expected):
|
||||
failures.append("camp overview should include %s: %s" % [expected, camp_overview])
|
||||
var bean: Dictionary = scene.state.get_item_def("bean")
|
||||
@@ -3034,14 +3034,14 @@ func _check_hud_focus_text(failures: Array[String]) -> void:
|
||||
failures.append("Cao Cao HUD focus should clarify move/attack affordance: %s" % cao_text)
|
||||
if not cao_text.contains("군령:") or not cao_text.contains("행군") or not cao_text.contains("타격") or not cao_text.contains("책략") or not cao_text.contains("병장") or not cao_text.contains("대기"):
|
||||
failures.append("Cao Cao HUD focus should summarize available actions: %s" % cao_text)
|
||||
if not cao_text.contains("지형 2,4"):
|
||||
if not cao_text.contains("지형 2,7"):
|
||||
failures.append("Cao Cao HUD focus should include current tile: %s" % cao_text)
|
||||
if not cao_text.contains("행군 1"):
|
||||
failures.append("Cao Cao HUD focus should include terrain move cost: %s" % cao_text)
|
||||
if not cao_text.contains("방비 +0"):
|
||||
failures.append("Cao Cao HUD focus should include terrain defense: %s" % cao_text)
|
||||
var xiahou_dun: Dictionary = scene.state.get_unit("xiahou_dun")
|
||||
xiahou_dun["pos"] = Vector2i(3, 1)
|
||||
xiahou_dun["pos"] = Vector2i(4, 1)
|
||||
var forest_text := scene._unit_current_terrain_text(xiahou_dun)
|
||||
if not forest_text.contains("숲") or not forest_text.contains("행군 3"):
|
||||
failures.append("Cavalry movement should use mounted move_type cost on forest: %s" % forest_text)
|
||||
@@ -3053,8 +3053,8 @@ func _check_hud_focus_text(failures: Array[String]) -> void:
|
||||
failures.append("Archer HUD focus should clarify ranged attack affordance: %s" % archer_text)
|
||||
if not archer_text.contains("군령: 적군 군기"):
|
||||
failures.append("Enemy archer HUD focus should describe enemy control: %s" % archer_text)
|
||||
if not scene._unit_current_terrain_text(archer).contains("평원"):
|
||||
failures.append("Archer terrain text should reflect its current plain tile")
|
||||
if not scene._unit_current_terrain_text(archer).contains("산지"):
|
||||
failures.append("Archer terrain text should reflect its current hill tile")
|
||||
_check_unit_class_mark(failures, scene, "cao_cao", "tactic", "책")
|
||||
_check_unit_class_mark(failures, scene, "xiahou_dun", "cavalry", "기")
|
||||
_check_unit_class_mark(failures, scene, "yellow_turban_2", "infantry", "보")
|
||||
@@ -3545,21 +3545,21 @@ func _check_hover_intent_badges(failures: Array[String]) -> void:
|
||||
return
|
||||
scene.battle_started = true
|
||||
var enemy: Dictionary = scene.state.get_unit("yellow_turban_1")
|
||||
enemy["pos"] = Vector2i(1, 2)
|
||||
enemy["pos"] = Vector2i(1, 5)
|
||||
scene.state.select_unit("cao_cao")
|
||||
scene._refresh_ranges()
|
||||
|
||||
scene.hover_cell = Vector2i(2, 3)
|
||||
scene.hover_cell = Vector2i(2, 5)
|
||||
var move_badge := scene._target_preview_badge()
|
||||
if str(move_badge.get("text", "")) != "행군" or str(move_badge.get("kind", "")) != "move":
|
||||
failures.append("reachable empty tile should show MOVE badge: %s" % str(move_badge))
|
||||
|
||||
scene.hover_cell = Vector2i(1, 4)
|
||||
scene.hover_cell = Vector2i(1, 7)
|
||||
var select_badge := scene._target_preview_badge()
|
||||
if str(select_badge.get("text", "")) != "선택" or str(select_badge.get("kind", "")) != "select":
|
||||
failures.append("friendly selectable unit should show SELECT badge: %s" % str(select_badge))
|
||||
|
||||
scene.hover_cell = Vector2i(1, 2)
|
||||
scene.hover_cell = Vector2i(1, 5)
|
||||
var attack_badge := scene._target_preview_badge()
|
||||
if attack_badge.is_empty() or str(attack_badge.get("kind", "")) == "move" or str(attack_badge.get("text", "")) == "행군":
|
||||
failures.append("enemy hover should keep attack badge priority: %s" % str(attack_badge))
|
||||
@@ -3571,7 +3571,7 @@ func _check_hover_intent_badges(failures: Array[String]) -> void:
|
||||
var cao_cao: Dictionary = scene.state.get_unit("cao_cao")
|
||||
cao_cao["moved"] = true
|
||||
scene._refresh_ranges()
|
||||
scene.hover_cell = Vector2i(2, 3)
|
||||
scene.hover_cell = Vector2i(2, 5)
|
||||
var moved_badge := scene._target_preview_badge()
|
||||
if str(moved_badge.get("kind", "")) == "move" or str(moved_badge.get("text", "")) == "행군":
|
||||
failures.append("moved unit should not show MOVE badge: %s" % str(moved_badge))
|
||||
@@ -3613,11 +3613,11 @@ func _check_counter_attack_badge_variants(failures: Array[String]) -> void:
|
||||
scene.free()
|
||||
return
|
||||
|
||||
infantry["pos"] = Vector2i(2, 3)
|
||||
infantry["pos"] = Vector2i(2, 6)
|
||||
infantry["hp"] = 99
|
||||
infantry["max_hp"] = 99
|
||||
archer["pos"] = Vector2i(10, 8)
|
||||
scene.hover_cell = Vector2i(2, 3)
|
||||
scene.hover_cell = Vector2i(2, 6)
|
||||
var counter_badge := scene._target_preview_badge()
|
||||
if str(counter_badge.get("kind", "")) != "counter" or not str(counter_badge.get("text", "")).contains("반"):
|
||||
failures.append("melee target should expose counter badge: %s" % str(counter_badge))
|
||||
@@ -3629,21 +3629,21 @@ func _check_counter_attack_badge_variants(failures: Array[String]) -> void:
|
||||
scene.basic_attack_targeting = false
|
||||
|
||||
infantry["pos"] = Vector2i(10, 8)
|
||||
archer["pos"] = Vector2i(2, 3)
|
||||
archer["pos"] = Vector2i(2, 6)
|
||||
archer["hp"] = 99
|
||||
archer["max_hp"] = 99
|
||||
scene.hover_cell = Vector2i(2, 3)
|
||||
scene.hover_cell = Vector2i(2, 6)
|
||||
var no_counter_badge := scene._target_preview_badge()
|
||||
if str(no_counter_badge.get("kind", "")) != "damage" or str(no_counter_badge.get("text", "")).contains("반"):
|
||||
failures.append("adjacent archer target should not expose counter badge: %s" % str(no_counter_badge))
|
||||
|
||||
archer["pos"] = Vector2i(10, 8)
|
||||
infantry["pos"] = Vector2i(2, 3)
|
||||
infantry["pos"] = Vector2i(2, 6)
|
||||
infantry["hp"] = 99
|
||||
infantry["max_hp"] = 99
|
||||
infantry["atk"] = 999
|
||||
cao_cao["hp"] = 1
|
||||
scene.hover_cell = Vector2i(2, 3)
|
||||
scene.hover_cell = Vector2i(2, 6)
|
||||
var danger_badge := scene._target_preview_badge()
|
||||
if str(danger_badge.get("kind", "")) != "danger" or not str(danger_badge.get("text", "")).contains("반격!"):
|
||||
failures.append("lethal counter should expose danger badge: %s" % str(danger_badge))
|
||||
@@ -3656,7 +3656,7 @@ func _check_terrain_and_unit_presentation(failures: Array[String]) -> void:
|
||||
failures.append("could not load battle scene state for presentation helpers")
|
||||
scene.free()
|
||||
return
|
||||
if scene._terrain_key_at(Vector2i(3, 1)) != "F":
|
||||
if scene._terrain_key_at(Vector2i(4, 1)) != "F":
|
||||
failures.append("terrain helper should read forest cells")
|
||||
if scene._terrain_key_at(Vector2i(6, 5)) != "T":
|
||||
failures.append("terrain helper should read village cells")
|
||||
@@ -3664,10 +3664,10 @@ func _check_terrain_and_unit_presentation(failures: Array[String]) -> void:
|
||||
failures.append("terrain helper should return empty outside the board")
|
||||
if scene.state.get_terrain_name(Vector2i(6, 5)) != "마을" or scene.state.get_terrain_heal(Vector2i(6, 5)) != 6:
|
||||
failures.append("village terrain should expose Korean name and healing")
|
||||
if scene.state.get_terrain_heal(Vector2i(12, 1)) != 8:
|
||||
if scene.state.get_terrain_heal(Vector2i(20, 1)) != 8:
|
||||
failures.append("castle terrain should expose stronger healing")
|
||||
scene._create_hud()
|
||||
scene.hover_cell = Vector2i(12, 1)
|
||||
scene.hover_cell = Vector2i(20, 1)
|
||||
scene._update_cell_info()
|
||||
if scene.cell_info_label == null or not scene.cell_info_label.text.contains("목표: 성채 장악") or not scene.cell_info_label.text.contains("회복 +8"):
|
||||
failures.append("castle objective cell info should expose capture label and healing: %s" % scene.cell_info_label.text)
|
||||
@@ -3778,11 +3778,11 @@ func _check_attack_motion_profiles(failures: Array[String]) -> void:
|
||||
failures.append("could not load battle scene state for attack profiles")
|
||||
scene.free()
|
||||
return
|
||||
_check_attack_profile(failures, scene, "cao_cao", Vector2i(1, 3), Vector2i(2, 3), "command_strike")
|
||||
_check_attack_profile(failures, scene, "xiahou_dun", Vector2i(1, 4), Vector2i(2, 4), "cavalry_charge")
|
||||
_check_attack_profile(failures, scene, "yellow_turban_1", Vector2i(12, 1), Vector2i(11, 1), "heavy_strike")
|
||||
_check_attack_profile(failures, scene, "yellow_turban_2", Vector2i(9, 4), Vector2i(8, 4), "infantry_strike")
|
||||
_check_attack_profile(failures, scene, "yellow_turban_3", Vector2i(11, 2), Vector2i(11, 0), "arrow")
|
||||
_check_attack_profile(failures, scene, "cao_cao", Vector2i(1, 6), Vector2i(2, 6), "command_strike")
|
||||
_check_attack_profile(failures, scene, "xiahou_dun", Vector2i(1, 7), Vector2i(2, 7), "cavalry_charge")
|
||||
_check_attack_profile(failures, scene, "yellow_turban_1", Vector2i(20, 1), Vector2i(19, 1), "heavy_strike")
|
||||
_check_attack_profile(failures, scene, "yellow_turban_2", Vector2i(12, 5), Vector2i(11, 5), "infantry_strike")
|
||||
_check_attack_profile(failures, scene, "yellow_turban_3", Vector2i(17, 3), Vector2i(17, 1), "arrow")
|
||||
_check_synthetic_attack_profile(failures, scene, "elite_cavalry", "cavalry_charge")
|
||||
_check_synthetic_attack_profile(failures, scene, "guard_captain", "infantry_strike")
|
||||
_check_synthetic_attack_profile(failures, scene, "marksman", "arrow", 2)
|
||||
@@ -3793,13 +3793,13 @@ func _check_attack_motion_profiles(failures: Array[String]) -> void:
|
||||
_check_skill_action_profile(failures, scene, "skill_damage", "tactic_damage", "tactic_flare")
|
||||
_check_skill_action_profile(failures, scene, "skill_heal", "tactic_heal", "healing_sigil")
|
||||
_check_skill_action_profile(failures, scene, "skill_support", "tactic_support", "order_banner")
|
||||
scene._on_unit_action_motion_requested("xiahou_dun", Vector2i(1, 4), Vector2i(2, 4), "attack")
|
||||
scene._on_unit_action_motion_requested("xiahou_dun", Vector2i(1, 7), Vector2i(2, 7), "attack")
|
||||
_check_stored_attack_motion(failures, scene, "xiahou_dun", "cavalry_charge", "melee", "attack", "charge_dust")
|
||||
scene._on_unit_action_motion_requested("yellow_turban_3", Vector2i(11, 2), Vector2i(11, 0), "attack")
|
||||
scene._on_unit_action_motion_requested("yellow_turban_3", Vector2i(17, 3), Vector2i(17, 1), "attack")
|
||||
_check_stored_attack_motion(failures, scene, "yellow_turban_3", "arrow", "ranged", "attack", "piercing_trace")
|
||||
scene._on_unit_action_motion_requested("cao_cao", Vector2i(1, 3), Vector2i(3, 3), "skill_damage")
|
||||
scene._on_unit_action_motion_requested("cao_cao", Vector2i(1, 6), Vector2i(3, 6), "skill_damage")
|
||||
_check_stored_attack_motion(failures, scene, "cao_cao", "tactic_damage", "tactic", "skill_damage", "tactic_flare")
|
||||
scene._on_unit_action_motion_requested("cao_cao", Vector2i(1, 3), Vector2i(1, 3), "skill_heal")
|
||||
scene._on_unit_action_motion_requested("cao_cao", Vector2i(1, 6), Vector2i(1, 6), "skill_heal")
|
||||
_check_stored_attack_motion(failures, scene, "cao_cao", "tactic_heal", "tactic", "skill_heal", "healing_sigil")
|
||||
_check_attack_vfx_signature(failures, scene, "arrow", "piercing_trace")
|
||||
_check_attack_vfx_signature(failures, scene, "cavalry_charge", "charge_dust")
|
||||
@@ -3977,15 +3977,15 @@ func _check_attack_motion_signal(failures: Array[String]) -> void:
|
||||
return
|
||||
if not motions.has("cao_cao|attack|6,2|7,2"):
|
||||
failures.append("attack motion signal missing expected Cao Cao attack: %s" % str(motions))
|
||||
_check_skill_motion_signal(failures, "spark", "skill_damage", Vector2i(3, 3), func(skill_state) -> void:
|
||||
_check_skill_motion_signal(failures, "spark", "skill_damage", Vector2i(3, 6), func(skill_state) -> void:
|
||||
var enemy: Dictionary = skill_state.get_unit("yellow_turban_1")
|
||||
enemy["pos"] = Vector2i(3, 3)
|
||||
enemy["pos"] = Vector2i(3, 6)
|
||||
)
|
||||
_check_skill_motion_signal(failures, "mend", "skill_heal", Vector2i(1, 3), func(skill_state) -> void:
|
||||
_check_skill_motion_signal(failures, "mend", "skill_heal", Vector2i(1, 6), func(skill_state) -> void:
|
||||
var caster: Dictionary = skill_state.get_unit("cao_cao")
|
||||
caster["hp"] = max(1, int(caster.get("hp", 1)) - 10)
|
||||
)
|
||||
_check_skill_motion_signal(failures, "guard_order", "skill_support", Vector2i(1, 3), func(_skill_state) -> void:
|
||||
_check_skill_motion_signal(failures, "guard_order", "skill_support", Vector2i(1, 6), func(_skill_state) -> void:
|
||||
pass
|
||||
)
|
||||
|
||||
@@ -4006,7 +4006,9 @@ func _check_skill_motion_signal(failures: Array[String], skill_id: String, expec
|
||||
if not state.try_cast_selected_skill(skill_id, target_cell):
|
||||
failures.append("%s should cast successfully for motion check" % skill_id)
|
||||
return
|
||||
var expected := "cao_cao|%s|1,3|%d,%d" % [expected_kind, target_cell.x, target_cell.y]
|
||||
var caster: Dictionary = state.get_unit("cao_cao")
|
||||
var caster_pos: Vector2i = caster.get("pos", Vector2i(1, 6))
|
||||
var expected := "cao_cao|%s|%d,%d|%d,%d" % [expected_kind, caster_pos.x, caster_pos.y, target_cell.x, target_cell.y]
|
||||
if not motions.has(expected):
|
||||
failures.append("%s motion signal missing `%s`: %s" % [skill_id, expected, str(motions)])
|
||||
|
||||
|
||||
Reference in New Issue
Block a user