added some sound triggers and holes in the map

This commit is contained in:
2023-12-17 02:02:16 +11:00
parent 046c4f5afb
commit e1a867d2a9
99 changed files with 1375 additions and 239 deletions

View File

@ -125,7 +125,8 @@ func disable_all_tower_frames():
func enable_non_path_tower_frames():
for frame in tower_frames:
frame.set_visible(true)
if !astar.is_point_disabled(tower_frames.find(frame)):
frame.set_visible(true)
disable_path_tower_frames()

View File

@ -3,10 +3,14 @@ class_name ExplosiveProjectile
@export var explosion_range := 3.0
var exploded := false
var sound_done := false
var particles_done := false
func _process(delta: float) -> void:
super._process(delta)
if time_alive >= lifetime:
if !exploded and time_alive >= lifetime:
explode()
@ -15,13 +19,18 @@ func _on_body_entered(_body: Node) -> void:
func explode():
if is_multiplayer_authority():
if is_multiplayer_authority() and !exploded:
freeze = true
exploded = true
$CollisionShape3D.call_deferred("set_disabled", true)
for enemy in get_tree().get_nodes_in_group("Enemies"):
if global_position.distance_to(enemy.global_position) <= explosion_range:
hit(enemy)
networked_hit.rpc(get_tree().root.get_path_to(enemy))
networked_kill.rpc()
queue_free()
$Sprite3D.set_visible(false)
$GPUParticles3D.emitting = true
$AudioStreamPlayer.play()
func hit(target):
@ -41,3 +50,22 @@ func hit(target):
func networked_hit(target_node_path):
var target = get_tree().root.get_node(target_node_path)
hit(target)
@rpc("reliable")
func networked_kill():
$Sprite3D.set_visible(false)
$GPUParticles3D.emitting = true
$AudioStreamPlayer.play()
func _on_audio_stream_player_finished() -> void:
sound_done = true
if sound_done and particles_done:
queue_free()
func _on_gpu_particles_3d_finished() -> void:
particles_done = true
if sound_done and particles_done:
queue_free()

View File

@ -0,0 +1,23 @@
extends Resource
class_name PlayerAudioSettings
const SAVE_PATH := "user://audio_settings.tres"
@export var master := 100.0
@export var music := 100.0
@export var sfx := 100.0
func apply_audio_settings():
AudioServer.set_bus_volume_db(AudioServer.get_bus_index("Master"), linear_to_db(master / 100.0))
AudioServer.set_bus_volume_db(AudioServer.get_bus_index("Music"), linear_to_db(music / 100.0))
AudioServer.set_bus_volume_db(AudioServer.get_bus_index("SFX"), linear_to_db(sfx / 100.0))
func save_profile_to_disk():
ResourceSaver.save(self, SAVE_PATH)
static func load_profile_from_disk() -> PlayerAudioSettings:
if ResourceLoader.exists(SAVE_PATH):
return ResourceLoader.load(SAVE_PATH)
return PlayerAudioSettings.new()

View File

@ -0,0 +1,26 @@
extends Resource
class_name SaveStats
const SAVE_PATH := "user://save_stats.tres"
@export var wins: int
@export var losses: int
@export var twenty_game_history: Array[bool]
func add_game_outcome(outcome: bool) -> void:
if outcome:
wins += 1
else:
losses += 1
twenty_game_history.push_back(outcome)
if twenty_game_history.size() > 20:
twenty_game_history.pop_front()
func save_profile_to_disk():
ResourceSaver.save(self, SAVE_PATH)
static func load_profile_from_disk() -> SaveStats:
if ResourceLoader.exists(SAVE_PATH):
return ResourceLoader.load(SAVE_PATH)
return SaveStats.new()

View File

@ -61,8 +61,9 @@ func hold_trigger():
func release_trigger():
if trigger_held:
recharge_timer.start()
trigger_held = false
recharge_timer.start()
func hold_second_trigger():

View File

@ -11,3 +11,7 @@ func set_popup(prompt_text, dismiss_text):
func _on_button_pressed() -> void:
completed.emit()
queue_free()
func _on_button_mouse_entered() -> void:
$AudioStreamPlayer.play()

53
Scripts/audio_options.gd Normal file
View File

@ -0,0 +1,53 @@
extends VBoxContainer
@export var master_input: SpinBox
@export var master_slider: HSlider
@export var music_input: SpinBox
@export var music_slider: HSlider
@export var sfx_input: SpinBox
@export var sfx_slider: HSlider
func _ready() -> void:
master_input.value = Data.audio.master
master_slider.value = Data.audio.master
music_input.value = Data.audio.music
music_slider.value = Data.audio.music
sfx_input.value = Data.audio.sfx
sfx_slider.value = Data.audio.sfx
func _on_master_spin_box_value_changed(value: float) -> void:
master_slider.value = value
Data.audio.master = value
AudioServer.set_bus_volume_db(AudioServer.get_bus_index("Master"), linear_to_db(value / 100.0))
func _on_master_h_slider_value_changed(value: float) -> void:
master_input.value = value
Data.audio.master = value
AudioServer.set_bus_volume_db(AudioServer.get_bus_index("Master"), linear_to_db(value / 100.0))
func _on_music_spin_box_value_changed(value: float) -> void:
music_slider.value = value
Data.audio.music = value
AudioServer.set_bus_volume_db(AudioServer.get_bus_index("Music"), linear_to_db(value / 100.0))
func _on_music_h_slider_value_changed(value: float) -> void:
music_input.value = value
Data.audio.music = value
AudioServer.set_bus_volume_db(AudioServer.get_bus_index("Music"), linear_to_db(value / 100.0))
func _on_sfx_spin_box_value_changed(value: float) -> void:
sfx_slider.value = value
Data.audio.sfx = value
AudioServer.set_bus_volume_db(AudioServer.get_bus_index("SFX"), linear_to_db(value / 100.0))
func _on_sfx_h_slider_value_changed(value: float) -> void:
sfx_input.value = value
Data.audio.sfx = value
AudioServer.set_bus_volume_db(AudioServer.get_bus_index("SFX"), linear_to_db(value / 100.0))

View File

@ -7,6 +7,7 @@ var stats : Card
@export var description : RichTextLabel
@export var target_label : Label
func set_card(value):
stats = value
title_text.text = stats.display_name

View File

@ -53,9 +53,11 @@ func retrieve_card(i):
add_child(item)
button_collider.disabled = false
button_box.position = Vector3(0,0,0)
$AudioStreamPlayer3D.play()
func _on_static_body_3d_button_interacted(_value) -> void:
button_collider.disabled = true
button_box.position = Vector3(0,0,-0.2)
$AudioStreamPlayer3D.play()
randomize_cards()

View File

@ -5,8 +5,8 @@ signal completed(outcome)
func set_popup(prompt_text, confirm_text, cancel_text):
$VBoxContainer/Label.text = prompt_text
$VBoxContainer/HBoxContainer/MarginContainer/Confirm.text = confirm_text
$VBoxContainer/HBoxContainer/MarginContainer2/Cancel.text = cancel_text
$VBoxContainer/HBoxContainer/Confirm.text = confirm_text
$VBoxContainer/HBoxContainer/Cancel.text = cancel_text
func _on_confirm_pressed() -> void:
@ -17,3 +17,7 @@ func _on_confirm_pressed() -> void:
func _on_cancel_pressed() -> void:
completed.emit(false)
queue_free()
func _on_button_mouse_entered() -> void:
$AudioStreamPlayer.play()

View File

@ -1,13 +1,15 @@
extends Node
var characters : Array[HeroClass]
var cards : Array[Card]
var enemies : Array[Enemy]
var keymaps : Array[PlayerKeymap]
var graphics : PlayerGraphicsSettings
var preferences : PlayerPreferences
var player_profile : PlayerProfile
var player_keymap : PlayerKeymap
var characters: Array[HeroClass]
var cards: Array[Card]
var enemies: Array[Enemy]
var keymaps: Array[PlayerKeymap]
var graphics: PlayerGraphicsSettings
var audio: PlayerAudioSettings
var preferences: PlayerPreferences
var player_profile: PlayerProfile
var player_keymap: PlayerKeymap
var save_stats: SaveStats
var wall_cost := 1
var printer_cost := 15
@ -25,10 +27,13 @@ var rarity_weights = {
func _ready() -> void:
graphics = PlayerGraphicsSettings.load_profile_from_disk()
graphics.apply_graphical_settings(get_viewport())
audio = PlayerAudioSettings.load_profile_from_disk()
audio.apply_audio_settings()
player_profile = PlayerProfile.load_profile_from_disk()
preferences = PlayerPreferences.load_profile_from_disk()
player_keymap = PlayerKeymap.load_profile_from_disk()
player_keymap.apply()
save_stats = SaveStats.load_profile_from_disk()
characters.append(preload("res://PCs/Red/red.tres"))
#characters.append(preload("res://PCs/Green/green.tres"))

View File

@ -127,7 +127,7 @@ func _process(delta: float) -> void:
func spawn_tower_preview():
delete_tower_preview()
last_tower_base = ray_collider
var card = inventory.selected_item
var card = inventory.contents.keys()[hero.inventory_selected_index]
last_card = card
tower_preview = card.turret_scene.instantiate() as Tower
tower_preview.stats = card.tower_stats
@ -168,7 +168,10 @@ func put_card_in_tower_base(tower_base: TowerBase):
if tower_base.has_card:
tower_base.remove_card()
else:
tower_base.add_card(inventory.remove(), multiplayer.get_unique_id())
var card = inventory.remove_at(hero.inventory_selected_index)
if !inventory.contents.has(card):
hero.decrement_selected()
tower_base.add_card(card, multiplayer.get_unique_id())
func set_progress_percent(value: float):

View File

@ -42,7 +42,7 @@ func parse_command(text : String, peer_id : int):
var gift_name = text.substr(6) as String
var gift = Data.cards[0]
for x in Data.cards:
if x.title == gift_name:
if x.display_name == gift_name:
gift = x
connected_players_nodes[peer_id].inventory.add(gift)
elif text.substr(1, 2) == "tr":
@ -232,6 +232,9 @@ func start_game():
objective_health = 120
wave = 0
level.a_star_graph_3d.make_grid()
level.generate_obstacles()
level.a_star_graph_3d.disable_all_tower_frames()
level.a_star_graph_3d.enable_non_path_tower_frames()
level.a_star_graph_3d.find_path()
set_upcoming_wave()
for peer_id in connected_players_nodes:
@ -257,6 +260,8 @@ func lose_game():
if game_active == false:
return
game_active = false
Data.save_stats.add_game_outcome(false)
Data.save_stats.save_profile_to_disk()
var menu = lose_game_scene.instantiate()
UILayer.add_child(menu)
lost_game.emit()
@ -269,6 +274,8 @@ func win_game():
if game_active == false:
return
game_active = false
Data.save_stats.add_game_outcome(true)
Data.save_stats.save_profile_to_disk()
var menu = won_game_scene.instantiate()
UILayer.add_child(menu)
won_game.emit()

View File

@ -5,18 +5,23 @@ signal item_added(item)
signal item_removed(item)
@export var max_size := 0
@export var contents : Array[Item] = []
var selected_index := 0
var selected_item : Item :
var contents = {}
var size : int :
get:
return contents[selected_index] if contents.size() > 0 else null
var x = 0
for key in contents:
x += contents[key]
return x
set(_value):
return
func add(item : Item) -> bool:
if item != null and contents.size() < max_size or max_size == 0:
contents.append(item)
if item != null and max_size == 0 or size < max_size:
if contents.has(item):
contents[item] += 1
else:
contents[item] = 1
item_added.emit(item)
networked_add.rpc(Data.cards.find(item))
return true
@ -24,50 +29,29 @@ func add(item : Item) -> bool:
func remove_at(index : int) -> Item:
if contents.size() <= 0:
return null
var item = contents[index]
contents.remove_at(index)
if selected_index >= contents.size() and selected_index > 0:
selected_index -= 1
var item = contents.keys()[index]
contents[item] -= 1
if contents[item] == 0:
contents.erase(item)
item_removed.emit(item)
networked_remove_at.rpc(index)
return item
func remove() -> Item:
return remove_at(selected_index)
func increment_selected():
if contents.size() > 0:
selected_index += 1
if selected_index >= contents.size():
selected_index = 0
networked_set_selected.rpc(selected_index)
func decrement_selected():
if contents.size() > 0:
selected_index -= 1
if selected_index < 0:
selected_index = contents.size() - 1
networked_set_selected.rpc(selected_index)
@rpc("reliable", "any_peer")
func networked_add(value):
contents.append(Data.cards[value])
item_added.emit(Data.cards[value])
var item = Data.cards[value]
if contents.has(item):
contents[item] += 1
else:
contents[item] = 0
item_added.emit(item)
@rpc("reliable", "any_peer")
func networked_remove_at(value):
var item = contents[value]
contents.remove_at(value)
var item = contents.keys[value]
contents[item] -= 1
if contents[item] == 0:
contents.erase(item)
item_removed.emit(item)
@rpc("reliable", "any_peer")
func networked_set_selected(value):
selected_index = value

View File

@ -1,14 +1,23 @@
extends StaticBody3D
class_name ItemCard
@export var card : Card
@export var card: Card
func pick_up() -> Card:
queue_free()
$CollisionShape3D.call_deferred("set_disabled", true)
$model/CSGSphere3D.set_visible(false)
$AudioStreamPlayer3D.play()
networked_pick_up.rpc()
return card
@rpc func networked_pick_up():
@rpc
func networked_pick_up():
$CollisionShape3D.call_deferred("set_disabled", true)
$model/CSGSphere3D.set_visible(false)
$AudioStreamPlayer3D.play()
func _on_audio_stream_player_3d_finished() -> void:
queue_free()

8
Scripts/killbox.gd Normal file
View File

@ -0,0 +1,8 @@
extends Area3D
class_name KillBox
@export var level: Level
func _on_body_entered(body: Node3D) -> void:
body.position = level.player_spawns[0].global_position

View File

@ -1,12 +1,39 @@
extends GridMap
class_name Level
@export var enemy_pool : Array[Enemy]
@export var player_spawns : Array[Node3D] = []
@export var enemy_spawns : Array[Node3D] = []
@export var enemy_goals : Array[Node3D] = []
@export var enemy_pool: Array[Enemy]
@export var player_spawns: Array[Node3D]
@export var enemy_spawns: Array[Node3D]
@export var enemy_goals: Array[Node3D]
@export var corpses: Node3D
@export var a_star_graph_3d : AStarGraph3D
@export var cinematic_cam : CinematicCamManager
@export var printer : CardPrinter
@export var shop : ShopStand
@export var a_star_graph_3d: AStarGraph3D
@export var cinematic_cam: CinematicCamManager
@export var printer: CardPrinter
@export var shop: ShopStand
@export var obstacle_scenes: Array[PackedScene]
func generate_obstacles():
var obstacle_count = randi_range(0, 5)
for index in obstacle_count:
var x = randi_range(0, a_star_graph_3d.grid_size.x - 1)
var y = randi_range(0, a_star_graph_3d.grid_size.y - 1)
var point_id = int(x * a_star_graph_3d.grid_size.y + y)
var chosen_obstacle = randi_range(0, obstacle_scenes.size() - 1)
var obstacle = obstacle_scenes[chosen_obstacle].instantiate() as GridMap
var orientations = [0, 90, 180, 270]
var chosen_orientation = orientations.pick_random()
obstacle.position = a_star_graph_3d.astar.get_point_position(point_id)
obstacle.set_rotation_degrees(Vector3(0, chosen_orientation, 0))
add_child(obstacle)
for cell in obstacle.get_used_cells():
var cell_pos = obstacle.to_global(obstacle.map_to_local(cell))
var map_coord = Vector3i(round(cell_pos.x), 0, round(cell_pos.z))
#print("cell_pos: " + str(cell_pos) + "cell.z" + str(cell_pos.z) + ", map_coord: " + str(map_coord))
var closest_point = a_star_graph_3d.astar.get_closest_point(cell_pos, true)
var closest_point_pos = a_star_graph_3d.astar.get_point_position(closest_point)
if closest_point_pos.distance_to(Vector3(cell_pos.x, closest_point_pos.y, cell_pos.z)) <= 0.5:
a_star_graph_3d.astar.set_point_disabled(closest_point)
if get_cell_item(map_coord) == 1:
set_cell_item(map_coord, INVALID_CELL_ITEM)
obstacle.queue_free()

View File

@ -1,6 +1,16 @@
extends Control
func _ready() -> void:
var wins = float(Data.save_stats.twenty_game_history.count(true))
var games = float(Data.save_stats.twenty_game_history.size())
var winrate = int((wins / games) * 100.0)
$Label2.text = "Your 20-game winrate is now: " + str(winrate) + "%!"
$Label3.text = "Total games: " + str(Data.save_stats.wins + Data.save_stats.losses)
$Label4.text = "Total wins: " + str(Data.save_stats.wins)
$Label5.text = "Total losses: " + str(Data.save_stats.losses)
func _on_quit_button_pressed() -> void:
Game.scene_switch_main_menu()
queue_free()
@ -9,3 +19,7 @@ func _on_quit_button_pressed() -> void:
func _on_restart_button_pressed() -> void:
Game.restart_game()
queue_free()
func _on_button_mouse_entered() -> void:
$AudioStreamPlayer.play()

View File

@ -22,9 +22,10 @@ func _ready() -> void:
spawn.signal_for_when_enemy_spawns.connect(increase_enemy_count)
spawn.spawn_wave(new_wave)
#these exist purely to make the enemies that spawn on the main menu happy
func enemy_died(_some_arg):
pass
func damage_goal():
func damage_goal(_some_arg1, _some_arg2):
pass
func increase_enemy_count():
pass
@ -65,3 +66,7 @@ func _on_options_button_pressed() -> void:
func _on_multiplayer_button_pressed() -> void:
Game.scene_switch_to_multiplayer_lobby()
func _on_button_mouse_entered() -> void:
$AudioStreamPlayer.play()

View File

@ -125,3 +125,7 @@ func add_player(new_player_profile_dict):
@rpc("any_peer", "reliable", "call_local")
func networked_ready_player(peer_id):
scoreboard.set_player_ready_state(peer_id, true)
func _on_button_mouse_entered() -> void:
$AudioStreamPlayer.play()

View File

@ -15,6 +15,8 @@ func _on_confirm_pressed() -> void:
graphics.save()
Data.graphics.apply_graphical_settings(get_viewport())
Data.graphics.save_profile_to_disk()
Data.audio.apply_audio_settings()
Data.audio.save_profile_to_disk()
Data.preferences.save_profile_to_disk()
Data.player_keymap.save_profile_to_disk()
queue_free()

View File

@ -44,3 +44,7 @@ func _on_quit_to_desktop_pressed() -> void:
func quit_game(confirmation):
if confirmation:
Game.quit_to_desktop()
func _on_button_mouse_entered() -> void:
$AudioStreamPlayer.play()

View File

@ -16,3 +16,11 @@ func get_server_ip() -> String:
return $VBoxContainer/HBoxContainer/ServerIP.text
func get_server_port() -> String:
return $VBoxContainer/HBoxContainer2/ServerPort.text
func _on_button_mouse_entered() -> void:
$AudioStreamPlayer.play()
func _on_button_pressed() -> void:
Game.scene_switch_main_menu()

View File

@ -44,3 +44,7 @@ func setup_the_ui():
loadout_editor.set_visible(true)
$ReadyButton.set_visible(true)
chatbox.set_visible(true)
func _on_button_mouse_entered() -> void:
$AudioStreamPlayer.play()

View File

@ -12,3 +12,7 @@ func set_popup(prompt_text, placeholder_text, confirm_text):
func _on_button_pressed() -> void:
completed.emit($VBoxContainer/LineEdit.text)
queue_free()
func _on_button_mouse_entered() -> void:
$AudioStreamPlayer.play()

View File

@ -25,7 +25,7 @@ var has_card : bool :
set(_value):
return
get:
return inventory.contents.size() != 0
return inventory.size != 0
func set_color(color: Color):
@ -44,7 +44,7 @@ func add_card(card: Card, caller_id: int) -> bool:
func remove_card():
Game.connected_players_nodes[tower.owner_id].add_card(inventory.remove())
Game.connected_players_nodes[tower.owner_id].add_card(inventory.remove_at(0))
networked_remove_tower.rpc()
@ -74,8 +74,8 @@ func set_west_wall(value : bool):
@rpc("reliable", "call_local", "any_peer")
func networked_spawn_tower(caller_id : int):
tower = inventory.selected_item.turret_scene.instantiate() as Tower
tower.stats = inventory.selected_item.tower_stats
tower = inventory.contents.keys()[0].turret_scene.instantiate() as Tower
tower.stats = inventory.contents.keys()[0].tower_stats
tower.name = "tower"
tower.base_name = name
tower.owner_id = caller_id

View File

@ -1,6 +1,16 @@
extends Control
func _ready() -> void:
var wins = float(Data.save_stats.twenty_game_history.count(true))
var games = float(Data.save_stats.twenty_game_history.size())
var winrate = int((wins / games) * 100.0)
$Label2.text = "Your 20-game winrate is now: " + str(winrate) + "%!"
$Label3.text = "Total games: " + str(Data.save_stats.wins + Data.save_stats.losses)
$Label4.text = "Total wins: " + str(Data.save_stats.wins)
$Label5.text = "Total losses: " + str(Data.save_stats.losses)
func _on_quit_button_pressed() -> void:
Game.scene_switch_main_menu()
queue_free()
@ -9,3 +19,7 @@ func _on_quit_button_pressed() -> void:
func _on_play_button_pressed() -> void:
Game.restart_game()
queue_free()
func _on_button_mouse_entered() -> void:
$AudioStreamPlayer.play()