generalized card vs item, cleaned up some headbob stuff, added the ability to refund a wall block
This commit is contained in:
@ -20,8 +20,13 @@ var tower_frames = []
|
||||
var wall_id = 0
|
||||
|
||||
|
||||
func toggle_point(point_id):
|
||||
networked_toggle_point.rpc(point_id)
|
||||
func toggle_point(point_id, caller_id):
|
||||
networked_toggle_point.rpc(point_id, caller_id)
|
||||
|
||||
|
||||
func remove_wall(wall : TowerBase):
|
||||
networked_remove_wall.rpc(wall.point_id)
|
||||
toggle_point(wall.point_id, multiplayer.get_unique_id())
|
||||
|
||||
|
||||
func point_is_build_location(point_id):
|
||||
@ -42,15 +47,15 @@ func test_path_if_point_toggled(point_id) -> bool:
|
||||
|
||||
|
||||
@rpc("reliable", "any_peer", "call_local")
|
||||
func networked_toggle_point(point_id):
|
||||
func networked_toggle_point(point_id, caller_id):
|
||||
if astar.is_point_disabled(point_id):
|
||||
astar.set_point_disabled(point_id, false)
|
||||
else:
|
||||
astar.set_point_disabled(point_id, true)
|
||||
find_path()
|
||||
disable_path_tower_frames()
|
||||
if is_multiplayer_authority():
|
||||
networked_spawn_wall.rpc(astar.get_point_position(point_id), wall_id)
|
||||
if is_multiplayer_authority() and astar.is_point_disabled(point_id):
|
||||
networked_spawn_wall.rpc(astar.get_point_position(point_id), wall_id, caller_id)
|
||||
wall_id += 1
|
||||
|
||||
|
||||
@ -131,11 +136,13 @@ func disable_path_tower_frames():
|
||||
|
||||
|
||||
@rpc("reliable", "call_local")
|
||||
func networked_spawn_wall(pos : Vector3, name_id : int):
|
||||
func networked_spawn_wall(pos : Vector3, name_id : int, caller_id : int):
|
||||
var base = tower_base_scene.instantiate() as TowerBase
|
||||
base.position = pos
|
||||
base.name = "Wall" + str(name_id)
|
||||
base.owner_id = caller_id
|
||||
var point_id = astar.get_closest_point(pos, true)
|
||||
base.point_id = point_id
|
||||
tower_base_ids[point_id] = base
|
||||
tower_bases.append(base)
|
||||
tower_path.add_child(base)
|
||||
@ -157,6 +164,27 @@ func networked_spawn_wall(pos : Vector3, name_id : int):
|
||||
tower_base_ids[west_point].set_east_wall(true)
|
||||
|
||||
|
||||
@rpc("reliable", "call_local", "any_peer")
|
||||
func networked_remove_wall(wall_id: int):
|
||||
var wall = tower_base_ids[wall_id]
|
||||
Game.connected_players_nodes[wall.owner_id].currency += Data.wall_cost
|
||||
tower_bases.erase(wall)
|
||||
tower_base_ids.erase(wall_id)
|
||||
wall.queue_free()
|
||||
var north_point = get_north_point(wall_id)
|
||||
var south_point = get_south_point(wall_id)
|
||||
var east_point = get_east_point(wall_id)
|
||||
var west_point = get_west_point(wall_id)
|
||||
if north_point >= 0 and astar.is_point_disabled(north_point):
|
||||
tower_base_ids[north_point].set_south_wall(false)
|
||||
if south_point >= 0 and astar.is_point_disabled(south_point):
|
||||
tower_base_ids[south_point].set_north_wall(false)
|
||||
if east_point >= 0 and astar.is_point_disabled(east_point):
|
||||
tower_base_ids[east_point].set_west_wall(false)
|
||||
if west_point >= 0 and astar.is_point_disabled(west_point):
|
||||
tower_base_ids[west_point].set_east_wall(false)
|
||||
|
||||
|
||||
func build_random_maze(block_limit):
|
||||
var untested_point_ids = []
|
||||
for index in (grid_size.x * grid_size.y):
|
||||
@ -167,7 +195,7 @@ func build_random_maze(block_limit):
|
||||
var random_point = untested_point_ids.pick_random()
|
||||
untested_point_ids.erase(random_point)
|
||||
if test_path_if_point_toggled(random_point):
|
||||
networked_toggle_point.rpc(random_point)
|
||||
networked_toggle_point.rpc(random_point, multiplayer.get_unique_id())
|
||||
|
||||
|
||||
func place_random_towers(tower_limit):
|
||||
@ -177,7 +205,7 @@ func place_random_towers(tower_limit):
|
||||
for index in tower_limit:
|
||||
var random_base = untowered_bases.pick_random() as TowerBase
|
||||
untowered_bases.erase(random_base)
|
||||
random_base.add_card(Data.cards.pick_random())
|
||||
random_base.add_card(Data.cards.pick_random(), multiplayer.get_unique_id())
|
||||
|
||||
|
||||
func find_path() -> bool:
|
||||
|
@ -1,12 +1,10 @@
|
||||
extends Resource
|
||||
extends Item
|
||||
class_name Card
|
||||
|
||||
enum Faction {GENERIC = 0}
|
||||
|
||||
@export var title : String
|
||||
@export var rarity : Data.Rarity
|
||||
@export var faction : Faction
|
||||
@export var sprite : Texture
|
||||
@export var turret_scene : PackedScene
|
||||
@export var weapon_scene : PackedScene
|
||||
@export var weapon_stats : CardText
|
||||
|
5
Scripts/Resources/item.gd
Normal file
5
Scripts/Resources/item.gd
Normal file
@ -0,0 +1,5 @@
|
||||
extends Resource
|
||||
class_name Item
|
||||
|
||||
@export var display_name : String
|
||||
@export var icon : Texture
|
@ -8,6 +8,7 @@ class_name Tower
|
||||
@export var range_indicator : CSGSphere3D
|
||||
@export var audio_player : AudioStreamPlayer3D
|
||||
|
||||
var owner_id : int
|
||||
var damage_particle_scene = preload("res://Scenes/damage_particle.tscn")
|
||||
var base_name
|
||||
var targeted_enemy
|
||||
|
@ -9,7 +9,7 @@ var stats : Card
|
||||
|
||||
func set_card(value):
|
||||
stats = value
|
||||
title_text.text = stats.title
|
||||
title_text.text = stats.display_name
|
||||
target_label.text = str(Data.TargetType.keys()[stats.tower_stats.target_type])
|
||||
rarity_sprite.region_rect = Rect2(64 * stats.rarity, 0, 64, 64)
|
||||
|
||||
|
@ -15,6 +15,7 @@ var valid_point := false
|
||||
var is_looking_at_tower_base := false
|
||||
var tower_preview
|
||||
var last_tower_base
|
||||
var last_collider
|
||||
var last_card
|
||||
var ray_collider
|
||||
var ray_point
|
||||
@ -46,25 +47,50 @@ func _process(delta: float) -> void:
|
||||
set_progress_percent(0)
|
||||
interacted_once = true
|
||||
build_wall()
|
||||
if interact_key_held and !interacted_once and last_collider and ray.is_colliding():
|
||||
interact_held_time += delta
|
||||
set_progress_percent(interact_held_time / interact_hold_time)
|
||||
if interact_held_time >= interact_hold_time:
|
||||
set_progress_percent(0)
|
||||
interacted_once = true
|
||||
refund_wall(last_collider)
|
||||
if !interact_key_held:
|
||||
interact_held_time = 0.0
|
||||
interacted_once = false
|
||||
set_progress_percent(0)
|
||||
|
||||
point_id = -1
|
||||
if ray.is_colliding():
|
||||
if !interacted_once and ray.is_colliding():
|
||||
if !interact_key_held:
|
||||
wall_preview.set_visible(true)
|
||||
ray_collider = ray.get_collider()
|
||||
ray_point = ray.get_collision_point()
|
||||
|
||||
is_looking_at_tower_base = ray_collider is TowerBase
|
||||
if is_looking_at_tower_base and inventory.contents.size() > 0 and !ray_collider.has_card:
|
||||
if ray_collider != last_tower_base or inventory.selected_item != last_card:
|
||||
spawn_tower_preview()
|
||||
elif tower_preview:
|
||||
delete_tower_preview()
|
||||
if Game.level:
|
||||
if is_looking_at_tower_base:
|
||||
valid_point = false
|
||||
point_id = ray_collider.point_id
|
||||
if obstacle_last_point != point_id:
|
||||
obstacle_last_point = point_id
|
||||
if is_instance_valid(last_collider):
|
||||
Game.level.a_star_graph_3d.tower_base_ids[last_collider.point_id].set_material(null)
|
||||
last_collider = null
|
||||
if tower_preview:
|
||||
delete_tower_preview()
|
||||
wall_preview.set_visible(false)
|
||||
last_collider = ray_collider
|
||||
ray_collider.set_material(build_preview_material)
|
||||
build_preview_material.albedo_color = Color.RED
|
||||
build_preview_material.albedo_color.a = 1.0
|
||||
if inventory.contents.size() > 0 and !ray_collider.has_card:
|
||||
if ray_collider != last_tower_base or inventory.selected_item != last_card:
|
||||
spawn_tower_preview()
|
||||
elif Game.level:
|
||||
if is_instance_valid(last_collider):
|
||||
Game.level.a_star_graph_3d.tower_base_ids[last_collider.point_id].set_material(null)
|
||||
last_collider = null
|
||||
if tower_preview:
|
||||
delete_tower_preview()
|
||||
point_id = Game.level.a_star_graph_3d.astar.get_closest_point(ray_point)
|
||||
if !Game.level.a_star_graph_3d.point_is_build_location(point_id) or hero.currency < Data.wall_cost:
|
||||
wall_preview.set_visible(false)
|
||||
@ -75,8 +101,8 @@ func _process(delta: float) -> void:
|
||||
if obstacle_last_point != point_id:
|
||||
obstacle_last_point = point_id
|
||||
if Game.level.a_star_graph_3d.test_path_if_point_toggled(point_id):
|
||||
#build_preview_material.albedo_color = Color.GREEN
|
||||
#build_preview_material.albedo_color.a = 0.8
|
||||
build_preview_material.albedo_color = Color.GREEN
|
||||
build_preview_material.albedo_color.a = 0.8
|
||||
valid_point = true
|
||||
else:
|
||||
#build_preview_material.albedo_color = Color.RED
|
||||
@ -107,7 +133,7 @@ func spawn_tower_preview():
|
||||
func delete_tower_preview():
|
||||
last_tower_base = null
|
||||
last_card = null
|
||||
if tower_preview:
|
||||
if is_instance_valid(tower_preview):
|
||||
tower_preview.queue_free()
|
||||
tower_preview = null
|
||||
|
||||
@ -121,15 +147,22 @@ func interact():
|
||||
func build_wall():
|
||||
if point_id >= 0 and valid_point and hero.currency >= Data.wall_cost:
|
||||
hero.currency -= Data.wall_cost
|
||||
Game.level.a_star_graph_3d.toggle_point(point_id)
|
||||
Game.level.a_star_graph_3d.toggle_point(point_id, multiplayer.get_unique_id())
|
||||
wall_preview.set_visible(false)
|
||||
|
||||
|
||||
func refund_wall(wall: TowerBase):
|
||||
last_collider = null
|
||||
if wall.has_card:
|
||||
wall.remove_card()
|
||||
Game.level.a_star_graph_3d.remove_wall(wall)
|
||||
|
||||
|
||||
func put_card_in_tower_base(tower_base: TowerBase):
|
||||
if tower_base.has_card:
|
||||
inventory.add(tower_base.remove_card())
|
||||
tower_base.remove_card()
|
||||
else:
|
||||
tower_base.add_card(inventory.remove())
|
||||
tower_base.add_card(inventory.remove(), multiplayer.get_unique_id())
|
||||
|
||||
|
||||
func set_progress_percent(value: float):
|
||||
|
@ -5,37 +5,37 @@ signal item_added(item)
|
||||
signal item_removed(item)
|
||||
|
||||
@export var max_size := 0
|
||||
var contents : Array[Card] = []
|
||||
@export var contents : Array[Item] = []
|
||||
var selected_index := 0
|
||||
var selected_item : Card :
|
||||
var selected_item : Item :
|
||||
get:
|
||||
return contents[selected_index] if contents.size() > 0 else null
|
||||
set(_value):
|
||||
return
|
||||
|
||||
|
||||
func add(card : Card) -> bool:
|
||||
if card != null and contents.size() < max_size or max_size == 0:
|
||||
contents.append(card)
|
||||
item_added.emit(card)
|
||||
networked_add.rpc(Data.cards.find(card))
|
||||
func add(item : Item) -> bool:
|
||||
if item != null and contents.size() < max_size or max_size == 0:
|
||||
contents.append(item)
|
||||
item_added.emit(item)
|
||||
networked_add.rpc(Data.cards.find(item))
|
||||
return true
|
||||
return false
|
||||
|
||||
|
||||
func remove_at(index : int) -> Card:
|
||||
func remove_at(index : int) -> Item:
|
||||
if contents.size() <= 0:
|
||||
return null
|
||||
var card = contents[index]
|
||||
var item = contents[index]
|
||||
contents.remove_at(index)
|
||||
if selected_index >= contents.size() and selected_index > 0:
|
||||
selected_index -= 1
|
||||
item_removed.emit(card)
|
||||
item_removed.emit(item)
|
||||
networked_remove_at.rpc(index)
|
||||
return card
|
||||
return item
|
||||
|
||||
|
||||
func remove() -> Card:
|
||||
func remove() -> Item:
|
||||
return remove_at(selected_index)
|
||||
|
||||
|
||||
|
1
Scripts/item_container.gd
Normal file
1
Scripts/item_container.gd
Normal file
@ -0,0 +1 @@
|
||||
extends StaticBody3D
|
@ -38,19 +38,19 @@ func randomize_cards():
|
||||
cards[x].set_card(chosen_card)
|
||||
cards[x].view_tower()
|
||||
choice_buttons[x].press_cost = price_dict[chosen_card.rarity]
|
||||
choice_buttons[x].hover_text = "Spend $" + str(choice_buttons[x].press_cost) + " to acquire " + chosen_card.title + "?"
|
||||
choice_buttons[x].hover_text = "Spend $" + str(choice_buttons[x].press_cost) + " to acquire " + chosen_card.display_name + "?"
|
||||
for x in 2:
|
||||
var chosen_card = medium_cards.pick_random()
|
||||
cards[x+3].set_card(chosen_card)
|
||||
cards[x+3].view_tower()
|
||||
choice_buttons[x+3].press_cost = price_dict[chosen_card.rarity]
|
||||
choice_buttons[x+3].hover_text = "Spend $" + str(choice_buttons[x+3].press_cost) + " to acquire " + chosen_card.title + "?"
|
||||
choice_buttons[x+3].hover_text = "Spend $" + str(choice_buttons[x+3].press_cost) + " to acquire " + chosen_card.display_name + "?"
|
||||
for x in 1:
|
||||
var chosen_card = pricey_cards.pick_random()
|
||||
cards[x+5].set_card(chosen_card)
|
||||
cards[x+5].view_tower()
|
||||
choice_buttons[x+5].press_cost = price_dict[chosen_card.rarity]
|
||||
choice_buttons[x+5].hover_text = "Spend $" + str(choice_buttons[x+5].press_cost) + " to acquire " + chosen_card.title + "?"
|
||||
choice_buttons[x+5].hover_text = "Spend $" + str(choice_buttons[x+5].press_cost) + " to acquire " + chosen_card.display_name + "?"
|
||||
for x in choice_colliders:
|
||||
x.set_deferred("disabled", false)
|
||||
for x in choice_sprites:
|
||||
|
@ -14,6 +14,8 @@ class_name TowerBase
|
||||
@export var east_collider : CollisionShape3D
|
||||
@export var west_collider : CollisionShape3D
|
||||
|
||||
var owner_id : int
|
||||
var point_id : int
|
||||
var tower = null
|
||||
var has_card : bool :
|
||||
set(_value):
|
||||
@ -22,16 +24,16 @@ var has_card : bool :
|
||||
return inventory.contents.size() != 0
|
||||
|
||||
|
||||
func add_card(card: Card) -> bool:
|
||||
func add_card(card: Card, caller_id: int) -> bool:
|
||||
var result = inventory.add(card)
|
||||
if result:
|
||||
networked_spawn_tower.rpc()
|
||||
networked_spawn_tower.rpc(caller_id)
|
||||
return result
|
||||
|
||||
|
||||
func remove_card() -> Card:
|
||||
func remove_card():
|
||||
Game.connected_players_nodes[tower.owner_id].add_card(inventory.remove())
|
||||
networked_remove_tower.rpc()
|
||||
return inventory.remove()
|
||||
|
||||
|
||||
func set_material(value: StandardMaterial3D):
|
||||
@ -42,7 +44,7 @@ func toggle_collision():
|
||||
collider.disabled = !collider.disabled
|
||||
|
||||
|
||||
func set_north_wall(value : bool):
|
||||
func set_north_wall(value: bool):
|
||||
north_mesh.set_visible(value)
|
||||
north_collider.disabled = !value
|
||||
|
||||
@ -63,11 +65,12 @@ func set_west_wall(value : bool):
|
||||
|
||||
|
||||
@rpc("reliable", "call_local", "any_peer")
|
||||
func networked_spawn_tower():
|
||||
func networked_spawn_tower(caller_id : int):
|
||||
tower = inventory.selected_item.turret_scene.instantiate() as Tower
|
||||
tower.stats = inventory.selected_item.tower_stats
|
||||
tower.name = "tower"
|
||||
tower.base_name = name
|
||||
tower.owner_id = caller_id
|
||||
tower.position = Vector3(0, 1.2, 0)
|
||||
minimap_icon.modulate = Color.RED
|
||||
add_child(tower)
|
||||
|
Reference in New Issue
Block a user