Add local post-move tactic and item pickers
This commit is contained in:
@@ -8,6 +8,8 @@ func _init() -> void:
|
||||
var failures: Array[String] = []
|
||||
_check_deferred_move_events(failures)
|
||||
_check_scene_post_move_menu_flow(failures)
|
||||
_check_scene_post_move_tactic_picker_flow(failures)
|
||||
_check_scene_post_move_item_picker_flow(failures)
|
||||
|
||||
if failures.is_empty():
|
||||
print("post move action flow smoke ok")
|
||||
@@ -209,5 +211,194 @@ func _check_scene_post_move_attack_targeting(failures: Array[String]) -> void:
|
||||
scene.free()
|
||||
|
||||
|
||||
func _check_scene_post_move_tactic_picker_flow(failures: Array[String]) -> void:
|
||||
var scene = BattleSceneScript.new()
|
||||
scene._create_hud()
|
||||
if not scene.state.load_battle("res://data/scenarios/001_yellow_turbans.json"):
|
||||
failures.append("could not load opening battle for tactic picker flow")
|
||||
scene.free()
|
||||
return
|
||||
scene.battle_started = true
|
||||
scene.campaign_complete_screen = false
|
||||
scene.briefing_panel.visible = false
|
||||
scene.result_panel.visible = false
|
||||
scene._clear_pending_move_state()
|
||||
|
||||
var enemy: Dictionary = scene.state.get_unit("yellow_turban_1")
|
||||
enemy["pos"] = Vector2i(3, 3)
|
||||
enemy["hp"] = 28
|
||||
enemy["def"] = 1
|
||||
var cao_cao: Dictionary = scene.state.get_unit("cao_cao")
|
||||
cao_cao["int"] = 80
|
||||
cao_cao["mp"] = 10
|
||||
|
||||
scene.state.battle_events.append({
|
||||
"id": "pending_tactic_gold",
|
||||
"once": true,
|
||||
"when": {
|
||||
"type": "unit_reaches_tile",
|
||||
"unit_ids": ["cao_cao"],
|
||||
"pos": [2, 3]
|
||||
},
|
||||
"actions": [{"type": "grant_gold", "amount": 44}]
|
||||
})
|
||||
|
||||
if not scene.state.select_unit("cao_cao"):
|
||||
failures.append("could not select Cao Cao for tactic picker flow")
|
||||
scene.free()
|
||||
return
|
||||
scene._refresh_ranges()
|
||||
scene._handle_board_click(_screen_for_cell(Vector2i(2, 3)))
|
||||
if scene.post_move_tactic_button == null or scene.post_move_tactic_button.disabled:
|
||||
failures.append("post-move Tactic should be enabled when Spark has a valid target")
|
||||
|
||||
scene._on_post_move_tactic_pressed()
|
||||
if scene.post_move_picker_panel == null or not scene.post_move_picker_panel.visible or scene.post_move_picker_mode != "tactic":
|
||||
failures.append("post-move Tactic should open the local tactic picker")
|
||||
if scene.post_move_menu != null and scene.post_move_menu.visible:
|
||||
failures.append("post-move action menu should hide while the tactic picker is open")
|
||||
if scene.tactic_menu != null and scene.tactic_menu.visible:
|
||||
failures.append("post-move local tactic picker should not use the side tactic menu")
|
||||
|
||||
var escape := InputEventKey.new()
|
||||
escape.keycode = KEY_ESCAPE
|
||||
scene._handle_key(escape)
|
||||
cao_cao = scene.state.get_unit("cao_cao")
|
||||
if scene.post_move_picker_panel != null and scene.post_move_picker_panel.visible:
|
||||
failures.append("Escape should close the local tactic picker")
|
||||
if not scene._has_pending_move() or scene.post_move_menu == null or not scene.post_move_menu.visible:
|
||||
failures.append("Escape from the tactic picker should return to the post-move action menu")
|
||||
if cao_cao.get("pos", Vector2i.ZERO) != Vector2i(2, 3) or not bool(cao_cao.get("moved", false)) or bool(cao_cao.get("acted", false)):
|
||||
failures.append("Escape from the tactic picker should preserve the pending move")
|
||||
|
||||
scene._on_post_move_tactic_pressed()
|
||||
scene._on_post_move_tactic_option_pressed("spark")
|
||||
if scene.selected_skill_id != "spark":
|
||||
failures.append("choosing Spark should enter tactic targeting mode")
|
||||
if scene.post_move_picker_panel != null and scene.post_move_picker_panel.visible:
|
||||
failures.append("tactic picker should hide after choosing a tactic")
|
||||
if scene.targeting_hint_panel == null or not scene.targeting_hint_panel.visible:
|
||||
failures.append("targeting hint panel should be visible during tactic targeting")
|
||||
if not scene.skill_cells.has(Vector2i(3, 3)):
|
||||
failures.append("Spark targeting should highlight the adjacent enemy cell")
|
||||
|
||||
scene._on_targeting_back_pressed()
|
||||
cao_cao = scene.state.get_unit("cao_cao")
|
||||
if not scene._has_pending_move() or scene.post_move_menu == null or not scene.post_move_menu.visible:
|
||||
failures.append("tactic Back should return to the post-move action menu")
|
||||
if scene.selected_skill_id != "":
|
||||
failures.append("tactic Back should clear the selected tactic")
|
||||
if cao_cao.get("pos", Vector2i.ZERO) != Vector2i(2, 3) or not bool(cao_cao.get("moved", false)) or bool(cao_cao.get("acted", false)):
|
||||
failures.append("tactic Back should preserve the pending moved unit without acting")
|
||||
|
||||
scene._on_post_move_tactic_pressed()
|
||||
scene._on_post_move_tactic_option_pressed("spark")
|
||||
var enemy_hp_before := int(enemy.get("hp", 0))
|
||||
scene._handle_board_click(_screen_for_cell(Vector2i(3, 3)))
|
||||
cao_cao = scene.state.get_unit("cao_cao")
|
||||
enemy = scene.state.get_unit("yellow_turban_1")
|
||||
if scene._has_pending_move() or scene.selected_skill_id != "":
|
||||
failures.append("tactic target click should clear pending move and selected tactic")
|
||||
if not scene.state.get_selected_unit().is_empty():
|
||||
failures.append("tactic target click should clear selected unit after acting")
|
||||
if cao_cao.get("pos", Vector2i.ZERO) != Vector2i(2, 3) or not bool(cao_cao.get("moved", false)) or not bool(cao_cao.get("acted", false)):
|
||||
failures.append("tactic target click should commit the moved caster action")
|
||||
if int(enemy.get("hp", 0)) >= enemy_hp_before and bool(enemy.get("alive", true)):
|
||||
failures.append("tactic target click should damage or defeat the target")
|
||||
if scene.state.get_battle_gold_reward() != 44:
|
||||
failures.append("tactic target click should commit deferred movement event before resolving tactic")
|
||||
|
||||
scene.free()
|
||||
|
||||
|
||||
func _check_scene_post_move_item_picker_flow(failures: Array[String]) -> void:
|
||||
var scene = BattleSceneScript.new()
|
||||
scene._create_hud()
|
||||
if not scene.state.load_battle("res://data/scenarios/001_yellow_turbans.json"):
|
||||
failures.append("could not load opening battle for item picker flow")
|
||||
scene.free()
|
||||
return
|
||||
scene.battle_started = true
|
||||
scene.campaign_complete_screen = false
|
||||
scene.briefing_panel.visible = false
|
||||
scene.result_panel.visible = false
|
||||
scene._clear_pending_move_state()
|
||||
scene.state.set_inventory_snapshot({"bean": 1})
|
||||
|
||||
var ally: Dictionary = scene.state.get_unit("xiahou_dun")
|
||||
ally["pos"] = Vector2i(2, 4)
|
||||
ally["hp"] = 12
|
||||
var cao_cao: Dictionary = scene.state.get_unit("cao_cao")
|
||||
cao_cao["mp"] = 10
|
||||
|
||||
scene.state.battle_events.append({
|
||||
"id": "pending_item_gold",
|
||||
"once": true,
|
||||
"when": {
|
||||
"type": "unit_reaches_tile",
|
||||
"unit_ids": ["cao_cao"],
|
||||
"pos": [2, 3]
|
||||
},
|
||||
"actions": [{"type": "grant_gold", "amount": 55}]
|
||||
})
|
||||
|
||||
if not scene.state.select_unit("cao_cao"):
|
||||
failures.append("could not select Cao Cao for item picker flow")
|
||||
scene.free()
|
||||
return
|
||||
scene._refresh_ranges()
|
||||
scene._handle_board_click(_screen_for_cell(Vector2i(2, 3)))
|
||||
if scene.post_move_item_button == null or scene.post_move_item_button.disabled:
|
||||
failures.append("post-move Item should be enabled when Bean can heal an adjacent ally")
|
||||
|
||||
scene._on_post_move_item_pressed()
|
||||
if scene.post_move_picker_panel == null or not scene.post_move_picker_panel.visible or scene.post_move_picker_mode != "item":
|
||||
failures.append("post-move Item should open the local item picker")
|
||||
if scene.post_move_menu != null and scene.post_move_menu.visible:
|
||||
failures.append("post-move action menu should hide while the item picker is open")
|
||||
if scene.item_menu != null and scene.item_menu.visible:
|
||||
failures.append("post-move local item picker should not use the side item menu")
|
||||
|
||||
scene._on_post_move_item_option_pressed("bean")
|
||||
if scene.selected_item_id != "bean":
|
||||
failures.append("choosing Bean should enter item targeting mode")
|
||||
if scene.post_move_picker_panel != null and scene.post_move_picker_panel.visible:
|
||||
failures.append("item picker should hide after choosing an item")
|
||||
if scene.targeting_hint_panel == null or not scene.targeting_hint_panel.visible:
|
||||
failures.append("targeting hint panel should be visible during item targeting")
|
||||
if not scene.item_cells.has(Vector2i(2, 4)):
|
||||
failures.append("Bean targeting should highlight the adjacent injured ally")
|
||||
|
||||
scene._on_targeting_back_pressed()
|
||||
cao_cao = scene.state.get_unit("cao_cao")
|
||||
if not scene._has_pending_move() or scene.post_move_menu == null or not scene.post_move_menu.visible:
|
||||
failures.append("item Back should return to the post-move action menu")
|
||||
if scene.selected_item_id != "":
|
||||
failures.append("item Back should clear the selected item")
|
||||
if cao_cao.get("pos", Vector2i.ZERO) != Vector2i(2, 3) or not bool(cao_cao.get("moved", false)) or bool(cao_cao.get("acted", false)):
|
||||
failures.append("item Back should preserve the pending moved unit without acting")
|
||||
|
||||
scene._on_post_move_item_pressed()
|
||||
scene._on_post_move_item_option_pressed("bean")
|
||||
var ally_hp_before := int(ally.get("hp", 0))
|
||||
scene._handle_board_click(_screen_for_cell(Vector2i(2, 4)))
|
||||
cao_cao = scene.state.get_unit("cao_cao")
|
||||
ally = scene.state.get_unit("xiahou_dun")
|
||||
if scene._has_pending_move() or scene.selected_item_id != "":
|
||||
failures.append("item target click should clear pending move and selected item")
|
||||
if not scene.state.get_selected_unit().is_empty():
|
||||
failures.append("item target click should clear selected unit after acting")
|
||||
if cao_cao.get("pos", Vector2i.ZERO) != Vector2i(2, 3) or not bool(cao_cao.get("moved", false)) or not bool(cao_cao.get("acted", false)):
|
||||
failures.append("item target click should commit the moved user action")
|
||||
if int(ally.get("hp", 0)) <= ally_hp_before:
|
||||
failures.append("item target click should heal the selected ally")
|
||||
if int(scene.state.get_inventory_snapshot().get("bean", 0)) != 0:
|
||||
failures.append("item target click should consume the Bean")
|
||||
if scene.state.get_battle_gold_reward() != 55:
|
||||
failures.append("item target click should commit deferred movement event before resolving item")
|
||||
|
||||
scene.free()
|
||||
|
||||
|
||||
func _screen_for_cell(cell: Vector2i) -> Vector2:
|
||||
return BattleSceneScript.BOARD_OFFSET + Vector2(cell.x, cell.y) * BattleSceneScript.TILE_SIZE + Vector2.ONE * (BattleSceneScript.TILE_SIZE * 0.5)
|
||||
|
||||
Reference in New Issue
Block a user