way too many changes to list, oops. big rewrite.

This commit is contained in:
2025-05-27 03:38:03 +10:00
parent 16951a9beb
commit 4a21701a35
663 changed files with 7389 additions and 3283 deletions
Assets
Audio
Cards
Classes
Mods/Base
PCs
Projectiles
Resources
Scenes
8_direction_sprite.tscn
CardPrinter
Menus
Projectiles
ShopStand
Shredder
TowerBase
Towers
UI
Weapons
corpse.tscndamage_particle.tscnenemy_spawner.tscngauntlet.tscnhealth_bar.tscnitem_card.tscnitem_container.tscnpath_visual_thing.tscnvisual_path.tscn
Scripts
Affectors
EnemyAI
Projectiles
Resources
StatusEffects
Towers
Weapons
a_star_graph_3d.gda_star_graph_3d.gd.uidalert_popup.gd.uidaudio_options.gd.uidcard_hand.gd.uidchatbox.gd.uidcinema_cam.gd.uidconfirmation_popup.gd.uidcorpse.gdcorpse.gd.uiddamage_particle.gd.uiddata.gddata.gd.uidedit_tool.gd.uideffect.gdeffect.gd.uideight_direction_sprite.gd.uidenemy_card.gdenemy_card.gd.uidenemy_goal.gd.uidenemy_spawner.gdenemy_spawner.gd.uidfloat_and_spin.gd.uidgame.gdgame.gd.uidgame_mode.gdgame_mode.gd.uidgameplay_options.gd.uidgraphics_options.gd.uidhealth.gdhealth.gd.uidhealth_bar.gd.uidhitbox.gdhitbox.gd.uidinteract_button.gdinteract_button.gd.uidinventory.gd.uiditem_card.gd.uiditem_container.gd.uidkey_icon_map.gd.uidkeybind_options.gd.uidkillbox.gd.uidlevel.gdlevel.gd.uidlifebar_segment.gd.uidlives_bar.gd.uidloadout_editor.gdlobby.gdlobby.gd.uidminimap_cam.gd.uidmultiplayer_lobby.gdmultiplayer_lobby.gd.uidon_top_camera.gd.uidoptions_menu.gd.uidpath_visual_thing.gd.uidpickup_notification.gd.uidround_stats.gd.uidscoreboard.gd.uidscoreboard_entry.gd.uidserver_form.gdserver_form.gd.uidsingleplayer_lobby.gdsingleplayer_lobby.gd.uidsprite_bobber.gd.uidstatus_effector.gd.uidtarget_dummy.gd.uidtarget_finder.gdtarget_finder.gd.uidtext_input_popup.gd.uidtower_base.gd.uidvisualized_path.gdvisualized_path.gd.uidwave.gdwave.gd.uidwave_manager.gdwave_manager.gd.uid
Towers
Ascension
Assault
Blowdart
BombLauncher
Fireball
Flamethrower
Gatling
GlueLauncher
Icicle
Overclock
Reactor
Refrigerator
RocketLauncher
Sniper
tower.gdtower.gd.uid
UI
Weapons
Ascension
Assault
Blowdart
BombLauncher
Fireball
Flamethrower
Gatling
GlueLauncher
Icicle
Overclock
Reactor
Refrigerator
RocketLauncher
Sniper
Worlds
achievement_popup.gdachievement_popup.gd.uidachievement_popup.tscnbridge.blendbridge.glbbridge.glb.importcard_item.gdcard_item.gd.uidenemy_card_ui.gdenemy_card_ui.gd.uidenemy_card_ui.tscnenergy_bar.gdenergy_bar.gd.uidenergy_bar.tscnexport_presets.cfgjoytest.gdjoytest.tscnladder.gdladder.gd.uidladder.tscnmat1.tresmat13.tresmat2.tresmod_menu.gdmod_menu.gd.uidmouse_hover_material.tresnew_standard_material_3d.tresnew_style_box_flat.tresnew_theme.tresplan.glbplan.glb.importplan.tscnplan_mat.tresplan_plan_tex.pngplan_plan_tex.png.importproject.godotshot1.wavvisualized_path.tscnworld_test.tscn

@ -1,8 +1,6 @@
class_name Hero extends CharacterBody3D
signal ready_state_changed(state: bool)
signal spawned
signal died
@export var hero_class: HeroClass
@export var camera: Camera3D
@ -18,14 +16,15 @@ signal died
@export var hand_sprite: Sprite2D
@export var interaction_raycast: RayCast3D
@export var inventory: Inventory
@export var gauntlet_card_1: CardInHand
@export var gauntlet_card_2: CardInHand
@export var gauntlet_cards: Array[CardInHand]
@export var pause_menu_scene: PackedScene
@export var hud: HUD
@export var movement: PlayerMovement
@export var sprint_zoom_speed: float = 0.2
@export var player_name_tag: Label
@export var weapon_swap_timer: Timer
@export_subgroup("Audio")
@export var ears: AudioListener3D
@export var place_card_audio: AudioStreamPlayer
@export var swap_card_audio: AudioStreamPlayer
@ -36,12 +35,16 @@ signal died
@export var swap_off_audio: AudioStreamPlayer
@export var swap_on_audio: AudioStreamPlayer
var hovering_item: InteractButton = null
var weapons_spawn_count: int = 0 #Used to prevent node name collisions for multiplayer
var inventory_selected_index: int = 0
var equipped_card: Card
var offhand_card: Card
var weapon: Weapon
var offhand_weapon: Weapon
#var equipped_card: Card
#var offhand_card: Card
var equipped_weapon: int = 0
var weapons: Array[Weapon] = [null, null]
var cards: Array[Card] = [null, null]
#var weapon: Weapon
#var offhand_weapon: Weapon
var weapons_active: bool = false
var paused: bool = false
var editing_mode: bool = true
@ -77,8 +80,8 @@ func _ready() -> void:
camera.set_visible(false)
gun_camera.set_visible(false)
hud.set_visible(false)
if weapon != null:
weapon.set_raycast_origin(camera)
if weapons[equipped_weapon] != null:
weapons[equipped_weapon].set_raycast_origin(camera)
sprite.texture.atlas = hero_class.texture
check_left_hand_valid()
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
@ -106,8 +109,16 @@ func _process(delta: float) -> void:
if editing_mode:
if interaction_raycast.is_colliding() and interaction_raycast.get_collider() is InteractButton:
hud.set_hover_text(interaction_raycast.get_collider().hover_text)
if !hovering_item or hovering_item != interaction_raycast.get_collider():
if hovering_item:
hovering_item.disable_hover_effect()
hovering_item = interaction_raycast.get_collider()
hovering_item.enable_hover_effect()
else:
hud.unset_hover_text()
if hovering_item:
hovering_item.disable_hover_effect()
hovering_item = null
if edit_tool.is_looking_at_tower_base:
card_sprites[0].view_tower()
@ -122,11 +133,21 @@ func _process(delta: float) -> void:
currency -= button.press_cost
if interaction_raycast.get_collider() is ItemCard:
add_card(interaction_raycast.get_collider().pick_up())
if Input.is_action_just_pressed("Equip In Gauntlet"):
equip_weapon()
if Input.is_action_just_pressed("Secondary Fire"):
if equipped_card or offhand_card:
swap_weapons()
#if Input.is_action_just_pressed("Equip In Gauntlet"):
# equip_weapon()
#if Input.is_action_just_pressed("Secondary Fire"):
# if equipped_card or offhand_card:
# swap_weapons()
if Input.is_action_just_pressed("Equip Primary Weapon"):
if weapons[0]:
unequip_weapon(0)
else:
equip_weapon(0)
if Input.is_action_just_pressed("Equip Secondary Weapon"):
if weapons[1]:
unequip_weapon(1)
else:
equip_weapon(1)
if Input.is_action_just_pressed("Select Next Card") and inventory.contents.size() > 1:
increment_selected()
swap_card_audio.play()
@ -137,26 +158,25 @@ func _process(delta: float) -> void:
edit_tool.interact_key_held = true
if Input.is_action_just_released("Primary Fire"):
edit_tool.interact_key_held = false
if weapon != null:
weapon.release_trigger()
weapon.release_second_trigger()
if weapons[equipped_weapon] != null:
weapons[equipped_weapon].release_trigger()
weapons[equipped_weapon].release_second_trigger()
else:
if weapon and weapons_active:
if weapons[equipped_weapon] and weapons_active:
if Input.is_action_just_pressed("Primary Fire"):
weapon.hold_trigger()
weapons[equipped_weapon].hold_trigger()
if Input.is_action_just_released("Primary Fire"):
weapon.release_trigger()
weapons[equipped_weapon].release_trigger()
if Input.is_action_pressed("Secondary Fire"):
weapon.hold_second_trigger()
weapons[equipped_weapon].hold_second_trigger()
if Input.is_action_just_released("Secondary Fire"):
weapon.release_second_trigger()
weapons[equipped_weapon].release_second_trigger()
if Input.is_action_pressed("Primary Fire"):
movement.can_sprint = false
if Input.is_action_pressed("Secondary Fire"):
movement.can_sprint = false
if Input.is_action_just_pressed("Equip In Gauntlet"):
if weapon and offhand_weapon:
swap_weapons()
swap_weapons()
if movement.sprinting:
movement.zoom_factor -= sprint_zoom_speed * delta
@ -214,10 +234,10 @@ func ready_self() -> void:
func unready_self() -> void:
if ready_state:
ready_state = false
if !equipped_card:
hud.place_icon.set_visible(true)
if !offhand_card:
hud.swap_icon.set_visible(true)
#if !equipped_card:
# hud.place_icon.set_visible(true)
#if !offhand_card:
# hud.swap_icon.set_visible(true)
hud.grow_wave_start_label()
unready_audio.play()
networked_set_ready_state(ready_state)
@ -242,7 +262,7 @@ func pause() -> void:
func enter_editing_mode(value: int) -> void:
gauntlet_sprite.set_visible(true)
gauntlet_sprite.visible = true
weapons_active = false
hud.set_wave_count(value + 1)
hud.set_energy_visible(false)
@ -250,30 +270,33 @@ func enter_editing_mode(value: int) -> void:
hud.grow_wave_start_label()
editing_mode = true
edit_tool.enabled = true
left_hand.set_visible(true)
if weapon:
weapon.release_trigger()
weapon.set_visible(false)
left_hand.visible = true
if weapons[equipped_weapon]:
weapons[equipped_weapon].release_trigger()
weapons[equipped_weapon].visible = false
func exit_editing_mode(value: int) -> void:
gauntlet_sprite.set_visible(false)
gauntlet_sprite.visible = false
weapons_active = false
hud.set_wave_count(value)
if !weapon and offhand_weapon:
swap_weapons()
if weapon:
#if !weapon and offhand_weapon:
# swap_weapons()
if weapons[equipped_weapon]:
hud.set_energy_visible(true)
#weapon.set_visible(false)
weapon.current_energy = weapon.max_energy
weapon.energy_changed.emit(weapon.current_energy)
weapons[equipped_weapon].current_energy = weapons[equipped_weapon].max_energy
#this had to be commented out coz the new energy bar thinks "energy changed" is "energy used"
#weapons[equipped_weapon].energy_changed.emit(weapons[equipped_weapon].current_energy)
var offhand_weapon: Weapon = weapons[0] if equipped_weapon == 1 else weapons[1]
if offhand_weapon:
hud.set_offhand_energy_visible(true)
offhand_weapon.current_energy = offhand_weapon.max_energy
offhand_weapon.energy_changed.emit(offhand_weapon.current_energy)
#offhand_weapon.energy_changed.emit(offhand_weapon.current_energy)
edit_tool.enabled = false
edit_tool.delete_tower_preview()
left_hand.set_visible(false)
left_hand.visible = false
hud.unset_hover_text()
editing_mode = false
weapon_swap_timer.start()
@ -282,112 +305,129 @@ func check_left_hand_valid() -> void:
if !editing_mode:
return
if inventory.size == 0:
left_hand_sprite.set_visible(false)
left_hand_sprite.visible = false
#gauntlet.texture.region = Rect2(64, 0, 64, 64)
else:
left_hand_sprite.set_visible(true)
left_hand_sprite.visible = true
#gauntlet.texture.region = Rect2(0, 0, 64, 64)
var selected_card: Card = inventory.contents.keys()[inventory_selected_index]
for index: int in card_sprites.size():
if index < inventory.contents[selected_card]:
card_sprites[index].set_visible(true)
card_sprites[index].visible = true
card_sprites[index].set_card(selected_card)
#card_sprites[index].view_weapon()
else:
card_sprites[index].set_visible(false)
card_sprites[index].visible = false
func equip_weapon() -> void:
if weapon != null:
func equip_weapon(slot: int = 0) -> void:
if weapons[slot] != null:
unequip_weapon()
return
if inventory.size > 0:
place_card_audio.play()
equipped_card = inventory.remove_at(inventory_selected_index)
if !inventory.contents.has(equipped_card):
cards[slot] = inventory.remove_at(inventory_selected_index)
if !inventory.contents.has(cards[slot]):
decrement_selected()
weapon = equipped_card.weapon_scene.instantiate()
weapon.name = str(weapons_spawn_count)
networked_equip_weapon.rpc(Data.cards.find(equipped_card), 0, weapons_spawn_count)
weapons[slot] = cards[slot].weapon_scene.instantiate()
weapons[slot].name = str(weapons_spawn_count)
networked_equip_weapon.rpc(Data.cards.find(cards[slot]), 0, weapons_spawn_count)
weapons_spawn_count += 1
weapon.energy_changed.connect(hud.set_weapon_energy)
weapon.set_multiplayer_authority(multiplayer.get_unique_id())
gauntlet_card_1.set_card(equipped_card)
hud.place_icon.set_visible(false)
gauntlet_card_1.view_weapon()
gauntlet_card_1.set_visible(true)
weapon.set_hero(self)
weapon.set_visible(false)
right_hand.add_child(weapon)
#weapons[slot].energy_changed.connect(hud.set_weapon_energy.bind(weapons[slot].stats.energy_type))
weapons[slot].set_multiplayer_authority(multiplayer.get_unique_id())
gauntlet_cards[slot].set_card(cards[slot])
if slot == 0:
hud.place_icon.visible = false
else:
hud.swap_icon.visible = false
gauntlet_cards[slot].view_weapon()
gauntlet_cards[slot].visible = true
weapons[slot].set_hero(self)
weapons[slot].visible = false
right_hand.add_child(weapons[slot])
check_left_hand_valid()
if slot == 0:
weapons[slot].energy_spent.connect(hud.new_energy_bar.use_energy)
weapons[slot].energy_recharged.connect(hud.new_energy_bar.gain_energy)
hud.new_energy_bar.max_energy = weapons[slot].max_energy
if weapons[slot].stats.energy_type == Data.EnergyType.CONTINUOUS:
hud.new_energy_bar.enable_progress_bar()
if weapons[slot].stats.energy_type == Data.EnergyType.DISCRETE:
hud.new_energy_bar.create_discrete_icons(weapons[slot].max_energy)
else:
weapons[slot].energy_spent.connect(hud.new_energy_bar2.use_energy)
weapons[slot].energy_recharged.connect(hud.new_energy_bar2.gain_energy)
hud.new_energy_bar2.max_energy = weapons[slot].max_energy
if weapons[slot].stats.energy_type == Data.EnergyType.CONTINUOUS:
hud.new_energy_bar2.enable_progress_bar()
if weapons[slot].stats.energy_type == Data.EnergyType.DISCRETE:
hud.new_energy_bar2.create_discrete_icons(weapons[slot].max_energy)
func stow_weapon(slot: int = 0) -> void:
weapons[slot].release_trigger()
weapons[slot].release_second_trigger()
weapons[slot].visible = false
weapons[slot].energy_spent.disconnect(hud.new_energy_bar.use_energy)
weapons[slot].energy_recharged.disconnect(hud.new_energy_bar.gain_energy)
weapons[slot].energy_spent.connect(hud.new_energy_bar2.use_energy)
weapons[slot].energy_recharged.connect(hud.new_energy_bar2.gain_energy)
hud.set_offhand_energy(weapons[slot].current_energy)
hud.new_energy_bar2.max_energy = weapons[slot].max_energy
if weapons[slot].stats.energy_type == Data.EnergyType.CONTINUOUS:
hud.new_energy_bar2.enable_progress_bar()
if weapons[slot].stats.energy_type == Data.EnergyType.DISCRETE:
hud.new_energy_bar2.create_discrete_icons(weapons[slot].max_energy)
func show_weapon(slot: int = 0) -> void:
weapons[slot].release_trigger()
weapons[slot].release_second_trigger()
weapons[slot].energy_spent.disconnect(hud.new_energy_bar2.use_energy)
weapons[slot].energy_recharged.disconnect(hud.new_energy_bar2.gain_energy)
weapons[slot].energy_spent.connect(hud.new_energy_bar.use_energy)
weapons[slot].energy_recharged.connect(hud.new_energy_bar.gain_energy)
hud.set_weapon_energy(weapons[slot].current_energy, weapons[slot].stats.energy_type)
hud.new_energy_bar.max_energy = weapons[slot].max_energy
if weapons[slot].stats.energy_type == Data.EnergyType.CONTINUOUS:
hud.new_energy_bar.enable_progress_bar()
if weapons[slot].stats.energy_type == Data.EnergyType.DISCRETE:
hud.new_energy_bar.create_discrete_icons(weapons[slot].max_energy)
func swap_weapons() -> void:
if !editing_mode:
weapons_active = false
if weapon or offhand_weapon:
if editing_mode:
swap_card_audio.play()
else:
swap_off_audio.play()
if !weapons[0] and !weapons[1]:
return
weapons_active = false
swap_off_audio.play()
hud.audio_guard = true
var temp: Weapon = offhand_weapon
var temp_card: Card = offhand_card
if weapon:
offhand_weapon = weapon
offhand_card = equipped_card
offhand_weapon.set_visible(false)
offhand_weapon.energy_changed.disconnect(hud.set_weapon_energy)
offhand_weapon.energy_changed.connect(hud.set_offhand_energy)
offhand_weapon.energy_changed.emit(offhand_weapon.current_energy)
offhand_weapon.release_trigger()
offhand_weapon.release_second_trigger()
gauntlet_card_2.set_card(offhand_card)
gauntlet_card_2.view_weapon()
gauntlet_card_2.set_visible(true)
hud.swap_icon.set_visible(false)
else:
offhand_weapon = null
offhand_card = null
gauntlet_card_2.set_visible(false)
hud.swap_icon.set_visible(true)
if temp:
weapon = temp
equipped_card = temp_card
weapon.energy_changed.disconnect(hud.set_offhand_energy)
weapon.energy_changed.connect(hud.set_weapon_energy)
weapon.energy_changed.emit(weapon.current_energy)
weapon.release_trigger()
weapon.release_second_trigger()
gauntlet_card_1.set_card(equipped_card)
gauntlet_card_1.view_weapon()
gauntlet_card_1.set_visible(true)
hud.place_icon.set_visible(false)
else:
weapon = null
equipped_card = null
gauntlet_card_1.set_visible(false)
hud.place_icon.set_visible(true)
if !editing_mode:
weapon_swap_timer.start()
stow_weapon(equipped_weapon)
equipped_weapon = 0 if equipped_weapon == 1 else 1
show_weapon(equipped_weapon)
weapon_swap_timer.start()
func _on_timer_timeout() -> void:
weapons_active = true
if weapon:
if weapons[equipped_weapon]:
swap_on_audio.play()
weapon.set_visible(true)
weapons[equipped_weapon].visible = true
func unequip_weapon() -> void:
networked_unequip_weapon.rpc(0)
gauntlet_card_1.set_visible(false)
hud.place_icon.set_visible(true)
func unequip_weapon(slot: int = 0) -> void:
networked_unequip_weapon.rpc(slot)
gauntlet_cards[slot].visible = false
if slot == 0:
hud.place_icon.visible = true
hud.new_energy_bar.blank()
else:
hud.swap_icon.visible = true
hud.new_energy_bar2.blank()
#gauntlet_sprite.set_visible(true)
weapon.queue_free()
weapon = null
inventory.add(equipped_card)
equipped_card = null
weapons[slot].queue_free()
weapons[slot] = null
inventory.add(cards[slot])
cards[slot] = null
place_card_audio.play()
check_left_hand_valid()
@ -400,20 +440,7 @@ func networked_set_ready_state(state: bool) -> void:
@rpc("reliable")
func networked_swap_weapon() -> void:
var temp: Weapon = offhand_weapon
var temp_card: Card = offhand_card
if weapon:
offhand_weapon = weapon
offhand_card = equipped_card
else:
offhand_weapon = null
offhand_card = null
if temp:
weapon = temp
equipped_card = temp_card
else:
weapon = null
equipped_card = null
swap_weapons()
@rpc("reliable")
@ -424,23 +451,12 @@ func networked_equip_weapon(card_index: int, slot: int, id: int) -> void:
new_weapon.name = str(id)
new_weapon.set_hero(self)
right_hand.add_child(new_weapon)
match slot:
0:
equipped_card = new_card
weapon = new_weapon
1:
offhand_card = new_card
offhand_weapon = new_weapon
cards[slot] = new_card
weapons[slot] = new_weapon
@rpc("reliable")
func networked_unequip_weapon(slot: int) -> void:
match slot:
0:
weapon.queue_free()
weapon = null
equipped_card = null
1:
offhand_weapon.queue_free()
offhand_weapon = null
offhand_card = null
weapons[slot].queue_free()
weapons[slot] = null
cards[slot] = null