init game files
This commit is contained in:
158
scripts/game/Zone.gd
Normal file
158
scripts/game/Zone.gd
Normal file
@@ -0,0 +1,158 @@
|
||||
class_name Zone
|
||||
extends RefCounted
|
||||
|
||||
## Zone - Container for cards in a specific game area
|
||||
|
||||
var zone_type: Enums.ZoneType
|
||||
var owner_index: int # Player who owns this zone (-1 for shared zones like stack)
|
||||
var _cards: Array[CardInstance] = []
|
||||
|
||||
# Signals (these would need to be connected via the parent)
|
||||
# In GDScript, RefCounted can't have signals, so we'll use callbacks
|
||||
var on_card_added: Callable = func(_card): pass
|
||||
var on_card_removed: Callable = func(_card): pass
|
||||
|
||||
func _init(type: Enums.ZoneType, owner: int = -1) -> void:
|
||||
zone_type = type
|
||||
owner_index = owner
|
||||
|
||||
## Add a card to this zone
|
||||
func add_card(card: CardInstance, at_top: bool = true) -> void:
|
||||
if card in _cards:
|
||||
push_warning("Card already in zone: " + str(card))
|
||||
return
|
||||
|
||||
card.zone_type = zone_type
|
||||
|
||||
if at_top:
|
||||
_cards.append(card)
|
||||
else:
|
||||
_cards.insert(0, card)
|
||||
|
||||
on_card_added.call(card)
|
||||
|
||||
## Remove a card from this zone
|
||||
func remove_card(card: CardInstance) -> bool:
|
||||
var index = _cards.find(card)
|
||||
if index >= 0:
|
||||
_cards.remove_at(index)
|
||||
on_card_removed.call(card)
|
||||
return true
|
||||
return false
|
||||
|
||||
## Get all cards in this zone
|
||||
func get_cards() -> Array[CardInstance]:
|
||||
return _cards.duplicate()
|
||||
|
||||
## Get card count
|
||||
func get_count() -> int:
|
||||
return _cards.size()
|
||||
|
||||
## Check if zone contains a card
|
||||
func has_card(card: CardInstance) -> bool:
|
||||
return card in _cards
|
||||
|
||||
## Get card at index
|
||||
func get_card_at(index: int) -> CardInstance:
|
||||
if index >= 0 and index < _cards.size():
|
||||
return _cards[index]
|
||||
return null
|
||||
|
||||
## Get top card (last added)
|
||||
func get_top_card() -> CardInstance:
|
||||
if _cards.size() > 0:
|
||||
return _cards[_cards.size() - 1]
|
||||
return null
|
||||
|
||||
## Remove and return top card
|
||||
func pop_top_card() -> CardInstance:
|
||||
if _cards.size() > 0:
|
||||
var card = _cards.pop_back()
|
||||
on_card_removed.call(card)
|
||||
return card
|
||||
return null
|
||||
|
||||
## Get bottom card (first added)
|
||||
func get_bottom_card() -> CardInstance:
|
||||
if _cards.size() > 0:
|
||||
return _cards[0]
|
||||
return null
|
||||
|
||||
## Check if zone is empty
|
||||
func is_empty() -> bool:
|
||||
return _cards.size() == 0
|
||||
|
||||
## Shuffle the zone (for decks)
|
||||
func shuffle() -> void:
|
||||
_cards.shuffle()
|
||||
|
||||
## Clear all cards from zone
|
||||
func clear() -> Array[CardInstance]:
|
||||
var removed = _cards.duplicate()
|
||||
_cards.clear()
|
||||
for card in removed:
|
||||
on_card_removed.call(card)
|
||||
return removed
|
||||
|
||||
## Get all Forwards in zone
|
||||
func get_forwards() -> Array[CardInstance]:
|
||||
var forwards: Array[CardInstance] = []
|
||||
for card in _cards:
|
||||
if card.is_forward():
|
||||
forwards.append(card)
|
||||
return forwards
|
||||
|
||||
## Get all Backups in zone
|
||||
func get_backups() -> Array[CardInstance]:
|
||||
var backups: Array[CardInstance] = []
|
||||
for card in _cards:
|
||||
if card.is_backup():
|
||||
backups.append(card)
|
||||
return backups
|
||||
|
||||
## Get all active cards
|
||||
func get_active_cards() -> Array[CardInstance]:
|
||||
var active: Array[CardInstance] = []
|
||||
for card in _cards:
|
||||
if card.is_active():
|
||||
active.append(card)
|
||||
return active
|
||||
|
||||
## Get all dull cards
|
||||
func get_dull_cards() -> Array[CardInstance]:
|
||||
var dull: Array[CardInstance] = []
|
||||
for card in _cards:
|
||||
if card.is_dull():
|
||||
dull.append(card)
|
||||
return dull
|
||||
|
||||
## Find cards by name
|
||||
func find_cards_by_name(card_name: String) -> Array[CardInstance]:
|
||||
var found: Array[CardInstance] = []
|
||||
for card in _cards:
|
||||
if card.card_data and card.card_data.name == card_name:
|
||||
found.append(card)
|
||||
return found
|
||||
|
||||
## Find cards by element
|
||||
func find_cards_by_element(element: Enums.Element) -> Array[CardInstance]:
|
||||
var found: Array[CardInstance] = []
|
||||
for card in _cards:
|
||||
if element in card.get_elements():
|
||||
found.append(card)
|
||||
return found
|
||||
|
||||
## Check if zone has a card with specific name (non-generic check)
|
||||
func has_card_with_name(card_name: String) -> bool:
|
||||
for card in _cards:
|
||||
if card.card_data and card.card_data.name == card_name:
|
||||
if not card.card_data.is_generic:
|
||||
return true
|
||||
return false
|
||||
|
||||
## Check if zone has any Light or Dark card
|
||||
func has_light_or_dark() -> bool:
|
||||
for card in _cards:
|
||||
if card.is_light_or_dark():
|
||||
return true
|
||||
return false
|
||||
Reference in New Issue
Block a user