115 lines
No EOL
6 KiB
GDScript
115 lines
No EOL
6 KiB
GDScript
extends "res://Systems/StateMachine/ChessGameState.gd"
|
|
|
|
func enter(_previous: String, _data := {}) -> void:
|
|
print("ENTERING STATE ", Constants.EVALUATE_POSITION)
|
|
|
|
# Check if WinConditionManager exists
|
|
if !game.winConditionManager:
|
|
print("Warning: WinConditionManager not initialized")
|
|
finished.emit(Constants.CLEANUP)
|
|
return
|
|
# Don't rely on the signal - directly check captured pieces here
|
|
var win_condition_met = check_win_conditions()
|
|
var loss_condition_met = check_loss_conditions()
|
|
|
|
# Only proceed to CLEANUP if no win/loss conditions were met
|
|
if !win_condition_met and !loss_condition_met:
|
|
finished.emit(Constants.CLEANUP)
|
|
|
|
# Check all possible win conditions
|
|
func check_win_conditions() -> bool:
|
|
match game.winConditionManager.win_condition:
|
|
Utils.WinConditionType.CAPTURE_UNIT:
|
|
print("check_win_conditions ", "Utils.WinConditionType.CAPTURE_UNIT")
|
|
# Directly check if king/target unit was captured
|
|
var target_unit = game.winConditionManager.win_condition_data.get("unit", "King")
|
|
|
|
for piece in game.captured_pieces_this_turn:
|
|
if piece.name == target_unit and piece.Item_Color == (1 if game.Turn == 0 else 0):
|
|
# Found captured target piece - win condition met!
|
|
var condition_data = {
|
|
"type": Utils.WinConditionType.CAPTURE_UNIT,
|
|
"message": "Enemy " + target_unit + " captured!"
|
|
}
|
|
game.winConditionManager.emit_signal("win_condition_met", condition_data)
|
|
finished.emit(Constants.CLEANUP, {"endCondition": "target_captured"})
|
|
return true
|
|
game.captured_pieces_this_turn = []
|
|
Utils.WinConditionType.BOARD_CLEARED:
|
|
print("check_win_conditions ", "Utils.WinConditionType.BOARD_CLEARED")
|
|
var remaining_enemy_pieces = game.winConditionManager.count_enemy_pieces()
|
|
if remaining_enemy_pieces <= 0:
|
|
var condition_data = {
|
|
"type": Utils.WinConditionType.BOARD_CLEARED,
|
|
"message": "Board cleared of enemy pieces!"
|
|
}
|
|
game.winConditionManager.emit_signal("win_condition_met", condition_data)
|
|
finished.emit(Constants.CLEANUP, {"endCondition": "board_cleared"})
|
|
return true
|
|
|
|
Utils.WinConditionType.TURN_NUMBER:
|
|
var target_turn = game.winConditionManager.win_condition_data.get("target_turn", 0)
|
|
print("check_win_conditions ", "Utils.WinConditionType.TURN_NUMBER ", target_turn , " ?= ", game.winConditionManager.turn_count )
|
|
if game.winConditionManager.turn_count >= target_turn:
|
|
var condition_data = {
|
|
"type": Utils.WinConditionType.TURN_NUMBER,
|
|
"message": "Turn limit reached!"
|
|
}
|
|
game.winConditionManager.emit_signal("win_condition_met", condition_data)
|
|
finished.emit(Constants.CLEANUP, {"endCondition": "turn_limit_reached"})
|
|
return true
|
|
|
|
Utils.WinConditionType.TILE_REACHED:
|
|
print("check_win_conditions ", "Utils.WinConditionType.TILE_REACHED", game.winConditionManager.win_condition_data)
|
|
var target_tiles = game.winConditionManager.win_condition_data.get("target_tiles", [])
|
|
var required_unit = game.winConditionManager.win_condition_data.get("unit", "King")
|
|
var all_targets_reached = true
|
|
# print("check_win_conditions ", required_unit, " ", target_tiles)
|
|
|
|
for tile_loc in target_tiles:
|
|
if !game.is_tile_reached(tile_loc, required_unit):
|
|
all_targets_reached = false
|
|
break
|
|
|
|
# print("all_targets_reached ", all_targets_reached,)
|
|
if all_targets_reached and target_tiles.size() > 0:
|
|
var condition_data = {
|
|
"type": Utils.WinConditionType.TILE_REACHED,
|
|
"message": "All target tiles reached!"
|
|
}
|
|
game.winConditionManager.emit_signal("win_condition_met", condition_data)
|
|
finished.emit(Constants.CLEANUP, {"endCondition": "tile_reached"})
|
|
return true
|
|
|
|
return false
|
|
|
|
# Check all possible loss conditions
|
|
func check_loss_conditions() -> bool:
|
|
match game.winConditionManager.loss_condition:
|
|
Utils.LossConditionType.UNIT_LOST:
|
|
# Directly check if king/target unit was lost
|
|
var target_unit = game.winConditionManager.loss_condition_data.get("unit", "King")
|
|
|
|
for piece in game.player_pieces_lost_this_turn:
|
|
if piece.name == target_unit and piece.Item_Color == (0 if game.Turn == 0 else 1):
|
|
# Found lost target piece - loss condition met!
|
|
var condition_data = {
|
|
"type": Utils.LossConditionType.UNIT_LOST,
|
|
"message": "Your " + target_unit + " was captured!"
|
|
}
|
|
game.winConditionManager.emit_signal("loss_condition_met", condition_data)
|
|
finished.emit(Constants.CLEANUP, {"endCondition": "unit_lost"})
|
|
return true
|
|
game.player_pieces_lost_this_turn = []
|
|
Utils.WinConditionType.TURN_NUMBER:
|
|
var turn_limit = game.winConditionManager.loss_condition_data.get("turn_limit", 0)
|
|
if game.winConditionManager.turn_count >= turn_limit:
|
|
var condition_data = {
|
|
"type": Utils.WinConditionType.TURN_NUMBER,
|
|
"message": "Turn limit exceeded!"
|
|
}
|
|
game.winConditionManager.emit_signal("loss_condition_met", condition_data)
|
|
finished.emit(Constants.CLEANUP, {"endCondition": "turn_limit_exceeded"})
|
|
return true
|
|
|
|
return false |