101 lines
2.9 KiB
GDScript
101 lines
2.9 KiB
GDScript
extends SceneTree
|
|
|
|
const BattleStateScript := preload("res://scripts/core/battle_state.gd")
|
|
|
|
|
|
func _init() -> void:
|
|
var failures: Array[String] = []
|
|
_check_defeat_event_log(failures)
|
|
_check_defeat_event_can_delay_victory(failures)
|
|
|
|
if failures.is_empty():
|
|
print("event unit_defeated smoke ok")
|
|
quit(0)
|
|
return
|
|
|
|
for failure in failures:
|
|
push_error(failure)
|
|
quit(1)
|
|
|
|
|
|
func _check_defeat_event_log(failures: Array[String]) -> void:
|
|
var state = _loaded_state(failures, "defeat event log")
|
|
if state == null:
|
|
return
|
|
var logs := []
|
|
state.log_added.connect(func(message: String) -> void:
|
|
logs.append(message)
|
|
)
|
|
state.fired_event_ids.clear()
|
|
state.battle_events.clear()
|
|
state.battle_events.append({
|
|
"id": "zhang_mancheng_falls",
|
|
"once": true,
|
|
"when": {"type": "unit_defeated", "unit_ids": ["yellow_turban_1"]},
|
|
"actions": [
|
|
{"type": "log", "text": "Zhang Mancheng's banner falls."}
|
|
]
|
|
})
|
|
|
|
_defeat_unit_with_skill(state, "yellow_turban_1")
|
|
if not logs.has("Zhang Mancheng's banner falls."):
|
|
failures.append("unit_defeated event log did not fire")
|
|
if not state.fired_event_ids.has("zhang_mancheng_falls"):
|
|
failures.append("unit_defeated event id was not recorded")
|
|
|
|
|
|
func _check_defeat_event_can_delay_victory(failures: Array[String]) -> void:
|
|
var state = _loaded_state(failures, "defeat event victory delay")
|
|
if state == null:
|
|
return
|
|
for enemy in state.get_living_units("enemy"):
|
|
if str(enemy.get("id", "")) != "yellow_turban_1":
|
|
enemy["alive"] = false
|
|
state.fired_event_ids.clear()
|
|
state.battle_events.clear()
|
|
state.battle_events.append({
|
|
"id": "last_rebel_reserve_arrives",
|
|
"once": true,
|
|
"when": {"type": "unit_defeated", "unit_ids": ["yellow_turban_1"]},
|
|
"actions": [
|
|
{
|
|
"type": "spawn_deployment",
|
|
"deployment": {
|
|
"unit_id": "last_rebel_reserve",
|
|
"name": "Last Rebel Reserve",
|
|
"class_id": "bandit",
|
|
"team": "enemy",
|
|
"level": 1,
|
|
"pos": [5, 5],
|
|
"base": {"hp": 24, "atk": 9, "def": 4}
|
|
}
|
|
}
|
|
]
|
|
})
|
|
|
|
_defeat_unit_with_skill(state, "yellow_turban_1")
|
|
var reserve: Dictionary = state.get_unit("last_rebel_reserve")
|
|
if reserve.is_empty() or not bool(reserve.get("alive", false)) or not bool(reserve.get("deployed", true)):
|
|
failures.append("unit_defeated reinforcement did not arrive alive and deployed")
|
|
if str(state.battle_status) != "active":
|
|
failures.append("unit_defeated reinforcement should keep battle active, got %s" % str(state.battle_status))
|
|
|
|
|
|
func _loaded_state(failures: Array[String], label: String):
|
|
var state = BattleStateScript.new()
|
|
if not state.load_battle("res://data/scenarios/001_yellow_turbans.json"):
|
|
failures.append("%s could not load smoke scenario" % label)
|
|
return null
|
|
return state
|
|
|
|
|
|
func _defeat_unit_with_skill(state, unit_id: String) -> void:
|
|
var caster: Dictionary = state.get_unit("cao_cao")
|
|
var target: Dictionary = state.get_unit(unit_id)
|
|
target["hp"] = 1
|
|
state._resolve_skill_damage(caster, target, {
|
|
"name": "Smoke Bolt",
|
|
"power": 99,
|
|
"stat": "int"
|
|
})
|