90 lines
3.8 KiB
GDScript
90 lines
3.8 KiB
GDScript
extends Node
|
|
|
|
var ability_sets: Dictionary = {}
|
|
|
|
func _ready() -> void:
|
|
ability_sets[GameState.ROLE_TANK] = _build_tank_set()
|
|
ability_sets[GameState.ROLE_DAMAGE] = _build_damage_set()
|
|
ability_sets[GameState.ROLE_HEALER] = _build_healer_set()
|
|
EventBus.role_changed.connect(_on_role_changed)
|
|
|
|
func get_set(role: int) -> AbilitySet:
|
|
return ability_sets.get(role, ability_sets[GameState.ROLE_DAMAGE])
|
|
|
|
func _on_role_changed(player: Node, role: int) -> void:
|
|
var set: AbilitySet = get_set(role)
|
|
var passive: Ability = null
|
|
for a in set.abilities:
|
|
if a.type == Ability.Type.PASSIVE:
|
|
passive = a
|
|
break
|
|
var effects: Node = get_node_or_null("../EffectSystem")
|
|
if effects and passive and effects.has_method("apply_passive_aura"):
|
|
effects.apply_passive_aura(player, passive)
|
|
|
|
func _make_ability(name: String, type: int, damage: float, ability_range: float, cooldown: float, opts: Dictionary = {}) -> Ability:
|
|
var a := Ability.new()
|
|
a.ability_name = StringName(name)
|
|
a.type = type
|
|
a.damage = damage
|
|
a.ability_range = ability_range
|
|
a.cooldown = cooldown
|
|
a.uses_gcd = opts.get("uses_gcd", true)
|
|
a.aoe_radius = opts.get("aoe_radius", 0.0)
|
|
a.is_heal = opts.get("is_heal", false)
|
|
a.shield_value = opts.get("shield_value", 0.0)
|
|
a.shield_multiplier = opts.get("shield_multiplier", 0.0)
|
|
a.passive_stat = opts.get("passive_stat", &"")
|
|
a.passive_value = opts.get("passive_value", 0.5)
|
|
a.passive_radius = opts.get("passive_radius", 50.0)
|
|
a.element = opts.get("element", Element.NONE)
|
|
return a
|
|
|
|
func _build_tank_set() -> AbilitySet:
|
|
var s := AbilitySet.new()
|
|
s.role_name = &"Tank"
|
|
s.color = Color(0.3, 0.5, 0.95)
|
|
s.aa_damage = 5.0
|
|
s.aa_range = 3.0
|
|
s.aa_is_heal = false
|
|
s.abilities = [
|
|
_make_ability("Smash", Ability.Type.SINGLE, 15.0, 3.0, 2.0, {"shield_value": 10.0}),
|
|
_make_ability("Sweep", Ability.Type.AOE, 10.0, 3.0, 3.0, {"aoe_radius": 10.0, "shield_value": 5.0}),
|
|
_make_ability("Bulwark", Ability.Type.UTILITY, 0.0, 0.0, 5.0, {"uses_gcd": false, "shield_multiplier": 1.0}),
|
|
_make_ability("Aegis", Ability.Type.ULT, 0.0, 0.0, 20.0, {"shield_multiplier": 3.0}),
|
|
_make_ability("Fortify", Ability.Type.PASSIVE, 0.0, 0.0, 0.0, {"passive_stat": &"buff_shield", "passive_value": 0.5, "passive_radius": 50.0})
|
|
]
|
|
return s
|
|
|
|
func _build_damage_set() -> AbilitySet:
|
|
var s := AbilitySet.new()
|
|
s.role_name = &"Damage"
|
|
s.color = Color(0.95, 0.3, 0.3)
|
|
s.aa_damage = 10.0
|
|
s.aa_range = 10.0
|
|
s.aa_is_heal = false
|
|
s.abilities = [
|
|
_make_ability("Bolt", Ability.Type.SINGLE, 30.0, 20.0, 2.0, {"element": Element.FIRE}),
|
|
_make_ability("Inferno", Ability.Type.AOE, 20.0, 20.0, 3.0, {"aoe_radius": 5.0, "element": Element.FIRE}),
|
|
_make_ability("Barrier", Ability.Type.UTILITY, 0.0, 0.0, 5.0, {"uses_gcd": false, "shield_multiplier": 1.0}),
|
|
_make_ability("Rain", Ability.Type.ULT, 50.0, 20.0, 15.0, {"aoe_radius": 3.0, "element": Element.FIRE}),
|
|
_make_ability("Power", Ability.Type.PASSIVE, 0.0, 0.0, 0.0, {"passive_stat": &"buff_damage", "passive_value": 0.5, "passive_radius": 50.0})
|
|
]
|
|
return s
|
|
|
|
func _build_healer_set() -> AbilitySet:
|
|
var s := AbilitySet.new()
|
|
s.role_name = &"Healer"
|
|
s.color = Color(0.4, 0.85, 0.4)
|
|
s.aa_damage = 1.0
|
|
s.aa_range = 20.0
|
|
s.aa_is_heal = true
|
|
s.abilities = [
|
|
_make_ability("Mend", Ability.Type.SINGLE, 15.0, 20.0, 2.0, {"is_heal": true}),
|
|
_make_ability("Bloom", Ability.Type.AOE, 10.0, 20.0, 3.0, {"aoe_radius": 20.0, "is_heal": true}),
|
|
_make_ability("Ward", Ability.Type.UTILITY, 0.0, 0.0, 5.0, {"uses_gcd": false, "shield_multiplier": 1.0}),
|
|
_make_ability("Sanctuary", Ability.Type.ULT, 25.0, 20.0, 15.0, {"aoe_radius": 3.0, "is_heal": true}),
|
|
_make_ability("Devotion", Ability.Type.PASSIVE, 0.0, 0.0, 0.0, {"passive_stat": &"buff_heal", "passive_value": 0.5, "passive_radius": 50.0})
|
|
]
|
|
return s
|