gae_wild_jam/scripts/perk_effects.gd

486 lines
16 KiB
GDScript

extends Node2D
@onready var witch = get_node("/root/Game/World/Witch")
@onready var player = get_node("/root/Game/World/Player")
var fireball = preload("res://scenes/fireball.tscn")
var throwing_knife = preload("res://scenes/throwing_knive.tscn")
var cauldron
var available_perks: Array[Perk] = []
var spell_modes: Dictionary = {}
var laser_retarget_enabled = false
var shuriken_tag_enabled = false
var tornado_push_on_cast = false
var tornado_fruit_collect = false
var laser_shuriken_on_kill = false
var throwing_knife_enabled = false
var throwing_knife_cooldown: float = 2.0
var throwing_knife_count: int = 1
var _knife_timer: float = 0.0
var spellbook_scene = preload("res://scenes/spellbook.tscn")
var spellbook_count: int = 0
var spellbook_damage: int = 12
const SPELLBOOK_MAX_DAMAGE: int = 40
var spellbook_speed: float = 1.5
const SPELLBOOK_RADIUS: float = 60.0
var _spellbook_angle: float = 0.0
var _spellbooks: Array = []
var _icon_knife = preload("res://assets/weapons/knvie.png")
var _icon_laser: AtlasTexture
var _icon_tornado: AtlasTexture
var _icon_book = preload("res://assets/books_set_2/books_pentagram.png")
var _icon_brew = preload("res://assets/books_set_2/books_health_potion.png")
var _icon_shuriken: AtlasTexture
var _icon_fireball: AtlasTexture
var _icon_player: AtlasTexture
func _stat(label: String, from: String, to: String) -> String:
return "[color=#aaaaaa]" + label + "[/color]\n[color=#888888]" + from + "[/color] → [color=#77dd77]" + to + "[/color]"
func _stat_new(label: String, val: String) -> String:
return "[color=#aaaaaa]" + label + "[/color]\n[color=#77dd77]" + val + "[/color]"
func _stat_toggle(label: String) -> String:
return "[color=#aaaaaa]" + label + "[/color]\n[color=#888888]OFF[/color] → [color=#77dd77]ON[/color]"
func get_mode(slot: String) -> String:
return spell_modes.get(slot, "base")
func set_mode(slot: String, mode: String) -> void:
spell_modes[slot] = mode
func _ready() -> void:
cauldron = witch.get_node("CauldronBar")
_icon_shuriken = AtlasTexture.new()
_icon_shuriken.atlas = preload("res://assets/Fire Pixel Bullet 16x16/All_Fire_Bullet_Pixel_16x16_02.png")
_icon_shuriken.region = Rect2(496, 32, 16, 16)
_icon_fireball = AtlasTexture.new()
_icon_fireball.atlas = preload("res://assets/Fire Pixel Bullet 16x16/All_Fire_Bullet_Pixel_16x16_00.png")
_icon_fireball.region = Rect2(576, 1, 16, 16)
_icon_player = AtlasTexture.new()
_icon_player.atlas = preload("res://assets/Swordsman_lvl1/Without_shadow/Swordsman_lvl1_Idle_without_shadow.png")
_icon_player.region = Rect2(0, 0, 64, 64)
_icon_laser = AtlasTexture.new()
_icon_laser.atlas = preload("res://assets/Fire Pixel Bullet 16x16/All_Fire_Bullet_Pixel_16x16_05.png")
_icon_laser.region = Rect2(96, 16, 16, 16)
_icon_tornado = AtlasTexture.new()
_icon_tornado.atlas = preload("res://assets/Free Effect Bullet Impact Explosion 32x32 V1/Purple Effect Bullet Impact Explosion 32x32.png")
_icon_tornado.region = Rect2(192, 0, 32, 32)
var lrt = Perk.new()
lrt.name = "Laser Lock-On"
lrt.description = "Laser retargets to the next highest health enemy on kill"
lrt.stats = _stat_toggle("Retarget")
lrt.spell = SpellLibrary.LASER
lrt.icon = _icon_laser
lrt.effect = laser_retarget
available_perks.append(lrt)
var dsh = Perk.new()
dsh.name = "Double Shuriken"
dsh.description = "Fire two more shurikens at once"
dsh.stats = _stat("Shurikens", str(witch.shuriken_count), str(witch.shuriken_count + 2))
dsh.spell = SpellLibrary.SHURIKEN
dsh.icon = _icon_shuriken
dsh.effect = double_shuriken
available_perks.append(dsh)
var faoe = Perk.new()
faoe.name = "AOE Fireball"
faoe.description = "Fireballs explode on impact instead of hitting a single enemy"
faoe.stats = _stat_toggle("AOE")
faoe.spell = SpellLibrary.FIREBALL
faoe.icon = _icon_fireball
faoe.archetype_slot = "fireball.impact"
faoe.effect = fireball_set_impact_explosion
available_perks.append(faoe)
var ftor = Perk.new()
ftor.name = "Fireball: Spawn Tornado"
ftor.description = "Fireballs spawn a tornado on impact instead of exploding"
ftor.stats = _stat_toggle("Tornado")
ftor.spell = SpellLibrary.FIREBALL
ftor.icon = _icon_fireball
ftor.archetype_slot = "fireball.impact"
ftor.effect = fireball_set_impact_tornado
available_perks.append(ftor)
var fsg = Perk.new()
fsg.name = "Fireball: Shotgun"
fsg.description = "Fireball fires a spread of pellets in front of you instead of homing shots"
fsg.stats = _stat_toggle("Shotgun")
fsg.spell = SpellLibrary.FIREBALL
fsg.icon = _icon_fireball
fsg.archetype_slot = "fireball.cast"
fsg.effect = fireball_set_cast_shotgun
available_perks.append(fsg)
var fmg = Perk.new()
fmg.name = "Fireball: Minigun"
fmg.description = "Fireball rapid-fires at the nearest enemy instead of one burst"
fmg.stats = _stat_toggle("Minigun")
fmg.spell = SpellLibrary.FIREBALL
fmg.icon = _icon_fireball
fmg.archetype_slot = "fireball.cast"
fmg.effect = fireball_set_cast_minigun
available_perks.append(fmg)
var smp = Perk.new()
smp.name = "Shotgun: More Pellets"
smp.description = "Fire more pellets per shotgun blast"
smp.stats = _stat("Pellets", str(witch.fireball_pellet_count), str(witch.fireball_pellet_count + 2))
smp.spell = SpellLibrary.FIREBALL
smp.icon = _icon_fireball
smp.requires_mode = "fireball.cast:shotgun"
smp.effect = shotgun_more_pellets
available_perks.append(smp)
var msu = Perk.new()
msu.name = "Minigun: Spin-Up"
msu.description = "Fire fireballs faster in minigun mode"
msu.stats = _stat("Interval", "%.3fs" % witch.fireball_minigun_interval, "%.3fs" % maxf(0.03, witch.fireball_minigun_interval - 0.015))
msu.spell = SpellLibrary.FIREBALL
msu.icon = _icon_fireball
msu.requires_mode = "fireball.cast:minigun"
msu.effect = minigun_spin_up
available_perks.append(msu)
var fsp = Perk.new()
fsp.name = "Fireball Spread"
fsp.description = "Fireballs target more enemies"
fsp.stats = _stat("Targets", str(witch.fireball_max_targets), str(witch.fireball_max_targets + 3))
fsp.spell = SpellLibrary.FIREBALL
fsp.icon = _icon_fireball
fsp.requires_mode = "fireball.cast:base"
fsp.effect = fireball_spread
available_perks.append(fsp)
var bexp = Perk.new()
bexp.name = "Brew Explosion"
bexp.description = "Trigger an explosion on brew"
bexp.stats = _stat_toggle("Explosion")
bexp.spell = SpellLibrary.NONE
bexp.icon = _icon_brew
bexp.effect = brew_explosion
available_perks.append(bexp)
var tk = Perk.new()
tk.name = "Throwing Knife"
tk.description = "Auto-throw at nearby enemies"
tk.stats = _stat_new("Cooldown", "%.1fs" % throwing_knife_cooldown)
tk.spell = SpellLibrary.NONE
tk.icon = _icon_knife
tk.effect = enable_throwing_knife
available_perks.append(tk)
var sb = Perk.new()
sb.name = "Spellbook"
sb.description = "An orbiting book hits enemies"
sb.stats = "[color=#aaaaaa]Damage Count[/color]\n[color=#77dd77]" + str(spellbook_damage) + " 1[/color]"
sb.spell = SpellLibrary.NONE
sb.icon = _icon_book
sb.effect = unlock_spellbook
available_perks.append(sb)
var sf = Perk.new()
sf.name = "Swift Feet"
sf.description = "Move faster"
sf.stats = _stat("Speed", str(player.speed), str(player.speed + 10))
sf.spell = SpellLibrary.NONE
sf.icon = _icon_player
sf.effect = swift_feet
available_perks.append(sf)
var bh = Perk.new()
bh.name = "Battle Hardened"
bh.description = "Hit harder"
bh.stats = _stat("Strength", str(player.strength), str(player.strength + 5))
bh.spell = SpellLibrary.NONE
bh.icon = _icon_player
bh.effect = battle_hardened
available_perks.append(bh)
var rp = Perk.new()
rp.name = "Reaper's Pull"
rp.description = "Tornado continuously collects nearby fruits for its entire lifetime"
rp.stats = _stat_toggle("Auto-Collect")
rp.spell = SpellLibrary.TORNADO
rp.icon = _icon_tornado
rp.effect = enable_tornado_fruit_collect
available_perks.append(rp)
var rw = Perk.new()
rw.name = "Repulsion Wave"
rw.description = "Casting Tornado blasts all enemies away from the witch"
rw.stats = _stat_toggle("Push on Cast")
rw.spell = SpellLibrary.TORNADO
rw.icon = _icon_tornado
rw.effect = enable_tornado_push
available_perks.append(rw)
var lsk = Perk.new()
lsk.name = "Chain Kill"
lsk.description = "Laser spawns a free Shuriken at every enemy it kills"
lsk.stats = _stat_toggle("Shuriken on Kill")
lsk.spell = SpellLibrary.LASER
lsk.icon = _icon_laser
lsk.effect = enable_laser_shuriken_on_kill
available_perks.append(lsk)
var mp = Perk.new()
mp.name = "Marked Prey"
mp.description = "Shuriken marks enemies. The next spell that hits them triggers an extra explosion"
mp.stats = _stat_toggle("Mark on Hit")
mp.spell = SpellLibrary.SHURIKEN
mp.icon = _icon_shuriken
mp.effect = enable_marked_prey
available_perks.append(mp)
var ss = Perk.new()
ss.name = "Swift Strike"
ss.description = "Attack more often"
ss.stats = _stat("Attack CD", "%.2fs" % player.get_node("AttackSpeed").wait_time, "%.2fs" % maxf(0.2, player.get_node("AttackSpeed").wait_time - 0.1))
ss.spell = SpellLibrary.NONE
ss.icon = _icon_player
ss.effect = swift_strike
available_perks.append(ss)
func _process(delta: float) -> void:
if throwing_knife_enabled:
_knife_timer += delta
if _knife_timer >= throwing_knife_cooldown:
_knife_timer = 0.0
_shoot_throwing_knife()
if spellbook_count > 0:
_spellbook_angle += spellbook_speed * delta
for i in range(_spellbooks.size()):
var offset = (TAU / _spellbooks.size()) * i
_spellbooks[i].global_position = witch.global_position + Vector2(cos(_spellbook_angle + offset), sin(_spellbook_angle + offset)) * SPELLBOOK_RADIUS
func laser_retarget():
laser_retarget_enabled = true
func enable_marked_prey() -> void:
shuriken_tag_enabled = true
func enable_tornado_push() -> void:
tornado_push_on_cast = true
func enable_tornado_fruit_collect() -> void:
tornado_fruit_collect = true
func enable_laser_shuriken_on_kill() -> void:
laser_shuriken_on_kill = true
func double_shuriken():
witch.shuriken_count += 2
func fireball_set_impact_explosion() -> void:
set_mode("fireball.impact", "explosion")
func fireball_set_impact_tornado() -> void:
set_mode("fireball.impact", "spawn_tornado")
func fireball_set_cast_shotgun() -> void:
set_mode("fireball.cast", "shotgun")
func fireball_set_cast_minigun() -> void:
set_mode("fireball.cast", "minigun")
func fireball_spread():
witch.fireball_max_targets = witch.fireball_max_targets * 1.5
var fsp = Perk.new()
fsp.name = "Fireball Spread"
fsp.description = "Fireballs target more enemies"
fsp.stats = _stat("Targets", str(witch.fireball_max_targets), str(witch.fireball_max_targets * 1.5))
fsp.spell = SpellLibrary.FIREBALL
fsp.icon = _icon_fireball
fsp.requires_mode = "fireball.cast:base"
fsp.effect = fireball_spread
available_perks.append(fsp)
func shotgun_more_pellets() -> void:
witch.fireball_pellet_count += 2
var smp = Perk.new()
smp.name = "Shotgun: More Pellets"
smp.description = "Fire more pellets per shotgun blast"
smp.stats = _stat("Pellets", str(witch.fireball_pellet_count), str(witch.fireball_pellet_count + 2))
smp.spell = SpellLibrary.FIREBALL
smp.icon = _icon_fireball
smp.requires_mode = "fireball.cast:shotgun"
smp.effect = shotgun_more_pellets
available_perks.append(smp)
func minigun_spin_up() -> void:
witch.fireball_minigun_interval = maxf(0.03, witch.fireball_minigun_interval - 0.015)
if witch.fireball_minigun_interval > 0.03:
var msu = Perk.new()
msu.name = "Minigun: Spin-Up"
msu.description = "Fire fireballs faster in minigun mode"
msu.stats = _stat("Interval", "%.3fs" % (witch.fireball_minigun_interval + 0.015), "%.3fs" % witch.fireball_minigun_interval)
msu.spell = SpellLibrary.FIREBALL
msu.icon = _icon_fireball
msu.requires_mode = "fireball.cast:minigun"
msu.effect = minigun_spin_up
available_perks.append(msu)
func brew_explosion():
cauldron.brew_explosion = true
func enable_throwing_knife():
throwing_knife_enabled = true
var upg = Perk.new()
upg.name = "Knife Cooldown"
upg.description = "Throw knives more often"
upg.stats = _stat("Cooldown", "%.1fs" % throwing_knife_cooldown, "%.1fs" % maxf(1.0, throwing_knife_cooldown - 0.2))
upg.icon = _icon_knife
upg.effect = knife_cooldown_upgrade
available_perks.append(upg)
var ek = Perk.new()
ek.name = "Extra Knife"
ek.description = "Throw one more knife"
ek.stats = _stat("Knives", str(throwing_knife_count), str(throwing_knife_count + 1))
ek.icon = _icon_knife
ek.effect = extra_knife
available_perks.append(ek)
func extra_knife():
throwing_knife_count = min(throwing_knife_count + 1, 3)
if throwing_knife_count < 3:
var ek = Perk.new()
ek.name = "Extra Knife"
ek.description = "Throw one more knife"
ek.stats = _stat("Knives", str(throwing_knife_count), str(throwing_knife_count + 1))
ek.icon = _icon_knife
ek.effect = extra_knife
available_perks.append(ek)
func knife_cooldown_upgrade():
throwing_knife_cooldown = maxf(1.0, throwing_knife_cooldown - 0.2)
if throwing_knife_cooldown > 1.0:
var upg = Perk.new()
upg.name = "Knife Cooldown"
upg.description = "Throw knives more often"
upg.stats = _stat("Cooldown", "%.1fs" % throwing_knife_cooldown, "%.1fs" % maxf(1.0, throwing_knife_cooldown - 0.2))
upg.icon = _icon_knife
upg.effect = knife_cooldown_upgrade
available_perks.append(upg)
func _shoot_throwing_knife() -> void:
StatsManager.on_spell_cast("throwing_knife")
for i in range(throwing_knife_count):
var knife = throwing_knife.instantiate()
knife.global_position = witch.global_position
witch.get_parent().add_child(knife)
func unlock_spellbook() -> void:
spellbook_count = 1
_rebuild_spellbooks()
var eb = Perk.new()
eb.name = "Extra Book"
eb.description = "Add one more orbiting book"
eb.stats = _stat("Books", str(spellbook_count), str(spellbook_count + 1))
eb.icon = _icon_book
eb.effect = extra_book
available_perks.append(eb)
var fo = Perk.new()
fo.name = "Faster Orbit"
fo.description = "Books orbit faster"
fo.stats = _stat("Speed", "%.1f" % spellbook_speed, "%.1f" % (spellbook_speed + 0.5))
fo.icon = _icon_book
fo.effect = faster_orbit
available_perks.append(fo)
var bd = Perk.new()
bd.name = "Book Damage"
bd.description = "Books hit harder"
bd.stats = _stat("Damage", str(spellbook_damage), str(spellbook_damage + 4))
bd.icon = _icon_book
bd.effect = book_damage
available_perks.append(bd)
func extra_book() -> void:
spellbook_count = min(spellbook_count + 1, 5)
_rebuild_spellbooks()
if spellbook_count < 5:
var eb = Perk.new()
eb.name = "Extra Book"
eb.description = "Add one more orbiting book"
eb.stats = _stat("Books", str(spellbook_count), str(spellbook_count + 1))
eb.icon = _icon_book
eb.effect = extra_book
available_perks.append(eb)
func faster_orbit() -> void:
spellbook_speed += 0.5
var fo = Perk.new()
fo.name = "Faster Orbit"
fo.description = "Books orbit faster"
fo.stats = _stat("Speed", "%.1f" % spellbook_speed, "%.1f" % (spellbook_speed + 0.5))
fo.icon = _icon_book
fo.effect = faster_orbit
available_perks.append(fo)
func book_damage() -> void:
spellbook_damage = min(spellbook_damage + 4, SPELLBOOK_MAX_DAMAGE)
for book in _spellbooks:
book.damage = spellbook_damage
if spellbook_damage < SPELLBOOK_MAX_DAMAGE:
var bd = Perk.new()
bd.name = "Book Damage"
bd.description = "Books hit harder"
bd.stats = _stat("Damage", str(spellbook_damage), str(min(spellbook_damage + 4, SPELLBOOK_MAX_DAMAGE)))
bd.icon = _icon_book
bd.effect = book_damage
available_perks.append(bd)
func _rebuild_spellbooks() -> void:
for book in _spellbooks:
book.queue_free()
_spellbooks.clear()
for i in range(spellbook_count):
var book = spellbook_scene.instantiate()
book.damage = spellbook_damage
witch.get_parent().add_child(book)
_spellbooks.append(book)
func swift_feet() -> void:
player.speed += 10
var sf = Perk.new()
sf.name = "Swift Feet"
sf.description = "Move faster"
sf.stats = _stat("Speed", str(player.speed), str(player.speed + 10))
sf.spell = SpellLibrary.NONE
sf.icon = _icon_player
sf.effect = swift_feet
available_perks.append(sf)
func battle_hardened() -> void:
player.strength += 2
var bh = Perk.new()
bh.name = "Battle Hardened"
bh.description = "Hit harder"
bh.stats = _stat("Strength", str(player.strength), str(player.strength + 2))
bh.spell = SpellLibrary.NONE
bh.icon = _icon_player
bh.effect = battle_hardened
available_perks.append(bh)
func swift_strike() -> void:
var timer = player.get_node("AttackSpeed")
timer.wait_time = maxf(0.2, timer.wait_time - 0.1)
if timer.wait_time > 0.2:
var ss = Perk.new()
ss.name = "Swift Strike"
ss.description = "Attack more often"
ss.stats = _stat("Attack CD", "%.2fs" % timer.wait_time, "%.2fs" % maxf(0.2, timer.wait_time - 0.1))
ss.spell = SpellLibrary.NONE
ss.icon = _icon_player
ss.effect = swift_strike
available_perks.append(ss)