ChessBuilder/Systems/StateMachine/GameStates/EvaluatePosition.gd

109 lines
No EOL
5.4 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:
# 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:
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)
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:
var target_tiles = game.winConditionManager.target_tiles
var required_unit = game.winConditionManager.win_condition_data.get("unit", "")
var all_targets_reached = true
for tile_loc in target_tiles:
if !game.is_tile_reached(tile_loc, required_unit):
all_targets_reached = false
break
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