Skip to content

Commit

Permalink
merge con el rework del combate
Browse files Browse the repository at this point in the history
  • Loading branch information
Patataman committed May 16, 2022
2 parents 97deef1 + 535c1f3 commit db27d34
Show file tree
Hide file tree
Showing 24 changed files with 403 additions and 141 deletions.
10 changes: 9 additions & 1 deletion real_deal/scripts/duel/CardEffects.gd
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
""" Fichero que contiene funciones que representan las acciones
que se puede realizar con objetos/cartas
"""

extends Node
var state_burned = preload("res://real_deal/scripts/duel/states/state_burned.gd")



# Definir un diccionario como argumento para evitar tener que repetir el for y
# otras cosas en todas las funciones
Expand Down Expand Up @@ -31,6 +33,12 @@ func apply_condition(objective, kwargs):
objective.modify_health(kwargs["amount"])
print(objective.name, " se cura ", kwargs["amount"], " puntos de daño.")

func apply_burn(objective, kwargs):
var state = state_burned.new(kwargs["amount"])
objective.add_state(state)
print(objective.name, " ha sido quemado con valor de ", kwargs["amount"])



func set_armor(objective, kwargs):
objective.set_armor(kwargs["amount"])
Expand Down
78 changes: 78 additions & 0 deletions real_deal/scripts/duel/CardStack.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
extends Object

"""
Esta clase es una pila de cartas, generalmente funciona casi igual que una lista
pero la idea es que se encarge de lanzar eventos además del comportamiento propio
de una lista. Quizá para que esto tenga sentido sería necesario hacer clases hijas
y que cada una lance los eventos del tipo que corresponde o que en la inicialización
se pueda determinar el parámetro de tipo con un diccionario de eventos.
"""

# TODO: Meter esta variable en autoload
var card_database = preload("res://real_deal/scripts/utils/CardsDatabase.gd").DATA

var _cards = []

func size():
return _cards.size()

func get_cards():
return _cards

func _init(card_names):
for card_name in card_names:
_cards.append(card_database[card_name].duplicate(true))

func can_draw():
return not _cards.empty()

func add_card(card):
_cards.append(card)

func draw_all_cards():
var cards = _cards.duplicate()
_cards.clear()
return cards

func add_cards(cards):
_cards += cards

func get_next_card():
if can_draw():
return _cards.pop_front()
# TODO: Controlar que se acaben las cartas (quizá en el getter)
# llamar a reshuffle() ???
# TODO: Quizá añadir el nodo, la instancia y demás cosas visuales
# NO PROBADA
# TODO: Controlar cuando la carta es eliminada por el efecto de una carta

func get_random_card():
#return _cards.pop_at(rand_range(0, _cards.size() -1)) Dice que no existe a pesar de que aparece en la documentación
return _cards.pop_front()

func get_concrete_card(card):
_cards.remove(card)
return card

func remove_card(card):
""" Elimina la carta de la pila y la retorna si no es exiliada
@card: Diccionario de la carta en la base de datos
"""
_cards.remove(_cards.find(card)) # No he encontrado la función para eliminar un objeto de la lista

if not card["exiled"]:
return card


func add_temporally_card(card_name):
""" Hacer versión exiliada de la carta
@card: nombre de la carta en la base de datos
"""
var card = card_database[card_name].duplicate(true)
card["exiled"] = true
_cards.add_card(card)

func shuffle(): # La semilla es siempre la misma
_cards.shuffle()
2 changes: 1 addition & 1 deletion real_deal/scripts/duel/DuelCardBase.gd
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ func _input(event):

if self.card_data["target"] in ["enemy", "both"]:
for _target in get_tree().get_nodes_in_group("enemies"):
if _target.is_alive:
if _target.is_alive():
_target.add_to_group("targeteable")

if self.card_data["target"] in ["player", "both"]:
Expand Down
141 changes: 40 additions & 101 deletions real_deal/scripts/duel/DuelCharacter.gd
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
extends Area2D

# TODO: Meter esta variable en autoload
var card_database = preload("res://real_deal/scripts/utils/CardsDatabase.gd").DATA
var floating_text = preload("res://real_deal/scenes/utils/FloatingText.tscn")
var DuelCharacterCardsHandler = preload("res://real_deal/scripts/duel/DuelCharacterCardsHandler.gd")
onready var card_functions = preload("res://real_deal/scripts/duel/CardEffects.gd").new()

# Quizá podríamos pasar a usar getters y setters
# Estructuras
var _hand = null
var _deck = null
var _graveyard = null
var deck_handler = null
export var _max_hand_size = 5
export var _draw_amount = 3
var _healthBar
Expand All @@ -23,32 +21,30 @@ var _armor = null
var _damage_bonus = null

# Estados
var is_alive = true
var _burned = null
var _states = {
"on_start": [],
"on_finish": [],
"on_play_card": [],
"on_recived_card": []
}
var _ui_states

func is_alive():
return _health > 0

func draw_text(draw, color=[0,0,0]):
""" Draw the text over the character sprite
"""
var text = floating_text.instance()
text.text = draw
text.color = color
add_child(text)


# Called when the node enters the scene tree for the first time.
func _ready():
play_animation("idle")


func _init_params(deck, is_player, max_hand_size=_max_hand_size, health=_health,
max_health=_max_health, energy=_energy, max_energy=_max_energy):
""" Inicializa valores base para todos los personajes
"""
self._hand = []
self._max_hand_size = max_hand_size
self._deck = load_deck(deck)
self._graveyard = []
self.deck_handler = DuelCharacterCardsHandler.new(deck)

self._health = health
self._max_health = max_health
Expand All @@ -59,49 +55,38 @@ func _init_params(deck, is_player, max_hand_size=_max_hand_size, health=_health,
draw_card(self._draw_amount, is_player)


func _process(delta):
pass


func load_deck(card_names):
""" Carga los datos correspondientes para cada carga en el deck
"""
var deck = []
for card_name in card_names:
deck.append(card_database[card_name].duplicate(true))
deck.shuffle() # La semilla es siempre la misma
return deck


func modify_health(amount):
# TODO: control de vida máxima y condición de muerte
# TODO: control de daño pasando por armadura y resistencias
_health = min(amount + _health, _max_health)
if not is_alive():
_dead()

# Aquí se dibuja el daño, rojo si es daño, verde si es positivo
if amount >= 0:
self.draw_text(amount, [0,255,0])
else:
self.draw_text(abs(amount), [255,0,0])
func _dead():
play_animation("dead")

self._health += amount
if self._health <= 0:
self.is_alive = false
play_animation("dead")

# ESTATES
func add_state(state):
_states[state.type].append((state))
# TODO: EVENTOS Y COSAS PARA ACTUALIZAR UI O LO QUE SURJA

func process_states(state_type):
for state in _states[state_type]:
for effect in state.get_effect():
var func_name = effect[0]
var args = effect[1]
args['objectives'] = [self]
card_functions.card_func(func_name, args)

# NO PROBADA
func set_armor(amount):
# Aquí se dibuja la armadura obtenida en color amarillo-marrón
self.draw_text(abs(amount), [226,185,0])
self._armor += amount


func draw_card(amount, is_player):
if amount > self._deck.size():
amount = self._deck.size()
if amount > deck_handler._deck.size():
amount = deck_handler._deck.size()
for i in range(amount):
var card = self._deck.pop_front()
self._hand.append(card)
var card = deck_handler.draw_card()
if is_player: # Los enemigos no tienen
get_tree().current_scene.emit_signal(
"addCard", card
Expand All @@ -112,78 +97,32 @@ func draw_card(amount, is_player):
# TODO: Quizá añadir el nodo, la instancia y demás cosas visuales


func remove_card(card_data):
deck_handler.remove_card_from_hand(card_data)

func start_turn(is_player):
# Aquí va restauración de energía, cooldown de contadores y efectos al empezar el turno
if not self._deck:
print("recargamos deck") # quizá gestionar a nivel de diseño que siempre esté el mínimo de cartas para robar
for card in self._graveyard:
self._deck.append(card)
suffle_deck()
deck_handler.prepare_deck()
self._update_state()
self.draw_card(min(self._max_hand_size - len(self._hand), self._draw_amount), is_player)
self.draw_card(self._draw_amount, is_player)


func _update_state():
print(self.name, " recupera energía y avanzan los contadores")


# NO PROBADA
# TODO: Controlar cuando la carta es eliminada por el efecto de una carta
func remove_card(card):
""" Elimina la carta de la mano del jugador
y si no se exilia, la manda al cementerio
@card: Diccionario de la carta en la base de datos
"""
self._hand.remove(self._hand.find(card)) # No he encontrado la función para eliminar un objeto de la lista

if not card["exiled"]:
self.send_to_graveyard(card)


func send_to_graveyard(card): # Atentos a que no la elimina de la mano o de donde sea
""" Manda una carta al cementerio
@card: Diccionario de la carta en la base de datos
"""
self._graveyard.append(card)


# NO PROBADA
func increase_damage(amount):
self._bonus += amount


func add_temporaly_card_to_hand(card_name):
# Hacer versión exiliada de la carta
var card = card_database[card_name].duplicate(true)
card["exiled"] = true
self._hand.append(card)


func add_temporally_card_to_deck(card_name):
# Hacer versión exiliada de la carta
var card = card_database[card_name].duplicate(true)
card["exiled"] = true
self._deck.append(card)


# NO PROBADA
func suffle_deck():
self._deck.shuffle() # La semilla es siempre la misma


# NO PROBADA
func set_energy(amount):
self.energy += amount # TODO: Control de máximo y mínimo


func get_deck():
return self._deck


func get_hand():
return self._hand


func _on_Character_animation_finished():
Expand Down
Loading

0 comments on commit db27d34

Please sign in to comment.