49 lines
1.2 KiB
GDScript
49 lines
1.2 KiB
GDScript
class_name Pool
|
|
extends RefCounted
|
|
|
|
## Geteilter Avatar-Pool. Alle 8 Spieler kaufen aus demselben Vorrat.
|
|
## Welche Elemente ein Spieler im Shop sieht, steht in PlayerState.unlocked.
|
|
|
|
var element_left: Array[int] = []
|
|
|
|
|
|
func _init() -> void:
|
|
for i in Data.ELEMENT_COUNT:
|
|
element_left.append(Data.POOL_PER_ELEMENT)
|
|
|
|
|
|
func available(element: int) -> bool:
|
|
return element < 0 or element_left[element] > 0
|
|
|
|
|
|
func take(element: int) -> bool:
|
|
if element < 0:
|
|
# Der neutrale Standard-Avatar ist unbegrenzt, nur Elemente sind knapp.
|
|
return true
|
|
if element_left[element] <= 0:
|
|
return false
|
|
element_left[element] -= 1
|
|
return true
|
|
|
|
|
|
func give_back(element: int, amount: int = 1) -> void:
|
|
if element < 0:
|
|
return
|
|
else:
|
|
element_left[element] = mini(Data.POOL_PER_ELEMENT, element_left[element] + amount)
|
|
|
|
|
|
## Gibt alle Bausteine eines Avatars zurück in den Pool.
|
|
func return_avatar(a: Avatar) -> void:
|
|
if a.is_elementless():
|
|
give_back(-1)
|
|
return
|
|
# Basis-Avatar plus verbrauchtes Futter.
|
|
give_back(a.elements[0])
|
|
if a.star >= 2:
|
|
give_back(a.elements[0], 2)
|
|
if a.star >= 3:
|
|
for e in a.elements:
|
|
give_back(e, 3)
|
|
# Zusätzlich gewählte Elemente kosten keinen Pool-Slot.
|