72 lines
1.9 KiB
GDScript
72 lines
1.9 KiB
GDScript
class_name EasyAI
|
|
extends AIStrategy
|
|
|
|
## Easy AI - Makes suboptimal choices, sometimes skips good plays
|
|
## Good for beginners learning the game
|
|
|
|
|
|
func _init(p_player_index: int) -> void:
|
|
super._init(Difficulty.EASY, p_player_index)
|
|
|
|
|
|
func decide_main_phase_action() -> Dictionary:
|
|
var playable := get_playable_cards()
|
|
|
|
if playable.is_empty():
|
|
return { "action": "pass" }
|
|
|
|
# 30% chance to just pass even if we have playable cards
|
|
if randf() < 0.3:
|
|
return { "action": "pass" }
|
|
|
|
# Pick a random playable card (not optimal)
|
|
var card: CardInstance = playable[randi() % playable.size()]
|
|
return { "action": "play", "card": card }
|
|
|
|
|
|
func decide_cp_generation(needed_cp: Dictionary) -> Dictionary:
|
|
var player := get_player()
|
|
|
|
# Prefer dulling backups first (Easy AI doesn't optimize)
|
|
for backup in player.field_backups.get_cards():
|
|
if backup.state == Enums.CardState.ACTIVE:
|
|
return { "action": "dull_backup", "card": backup }
|
|
|
|
# Discard a random card from hand
|
|
var hand_cards := player.hand.get_cards()
|
|
if not hand_cards.is_empty():
|
|
var card: CardInstance = hand_cards[randi() % hand_cards.size()]
|
|
return { "action": "discard", "card": card }
|
|
|
|
return {}
|
|
|
|
|
|
func decide_attack_action() -> Dictionary:
|
|
var attackers := get_attackable_forwards()
|
|
|
|
if attackers.is_empty():
|
|
return { "action": "end_attacks" }
|
|
|
|
# 40% chance to not attack even if we can
|
|
if randf() < 0.4:
|
|
return { "action": "end_attacks" }
|
|
|
|
# Pick a random attacker
|
|
var attacker: CardInstance = attackers[randi() % attackers.size()]
|
|
return { "action": "attack", "card": attacker }
|
|
|
|
|
|
func decide_block_action(attacker: CardInstance) -> Dictionary:
|
|
var blockers := get_blockable_forwards()
|
|
|
|
if blockers.is_empty():
|
|
return { "action": "skip" }
|
|
|
|
# 50% chance to skip blocking even when possible
|
|
if randf() < 0.5:
|
|
return { "action": "skip" }
|
|
|
|
# Pick a random blocker (might not be optimal)
|
|
var blocker: CardInstance = blockers[randi() % blockers.size()]
|
|
return { "action": "block", "card": blocker }
|