fixed the issue where enemies could walk over a gap if it wasnt on a pathfinding node
This commit is contained in:
@ -1,41 +0,0 @@
|
||||
@tool
|
||||
class_name DebugMesh extends MeshInstance3D
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
var mat: StandardMaterial3D = StandardMaterial3D.new()
|
||||
mesh = ImmediateMesh.new()
|
||||
mat.no_depth_test = true
|
||||
mat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED
|
||||
mat.vertex_color_use_as_albedo = true
|
||||
mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA
|
||||
set_material_override(mat)
|
||||
|
||||
|
||||
func clear() -> void:
|
||||
mesh.clear_surfaces()
|
||||
|
||||
|
||||
func draw_line(begin_pos: Vector3, end_pos: Vector3, color: Color = Color.RED) -> void:
|
||||
mesh.surface_begin(Mesh.PRIMITIVE_LINES)
|
||||
mesh.surface_set_color(color)
|
||||
mesh.surface_add_vertex(begin_pos)
|
||||
mesh.surface_add_vertex(end_pos)
|
||||
mesh.surface_end()
|
||||
|
||||
|
||||
func draw_sphere(center: Vector3, radius: float = 1.0, color: Color = Color.RED) -> void:
|
||||
var step: int = 30
|
||||
var sppi: float = 2 * PI / step
|
||||
var axes: Array = [
|
||||
[Vector3.UP, Vector3.RIGHT],
|
||||
[Vector3.RIGHT, Vector3.FORWARD],
|
||||
[Vector3.FORWARD, Vector3.UP]
|
||||
]
|
||||
for axis: Array in axes:
|
||||
mesh.surface_begin(Mesh.PRIMITIVE_LINE_STRIP)
|
||||
mesh.surface_set_color(color)
|
||||
for i: int in range(step + 1):
|
||||
mesh.surface_add_vertex(center + (axis[0] * radius)
|
||||
.rotated(axis[1], sppi * (i % step)))
|
||||
mesh.surface_end()
|
@ -1,63 +0,0 @@
|
||||
class_name CardPrinter extends StaticBody3D
|
||||
|
||||
@export var cards: Array[CardInHand]
|
||||
@export var item_card_scene: PackedScene
|
||||
@export var button_collider: CollisionShape3D
|
||||
@export var button_box: Node3D
|
||||
@export var choice_colliders: Array[CollisionShape3D]
|
||||
|
||||
var card_available: bool = false
|
||||
|
||||
|
||||
func randomize_cards() -> void:
|
||||
var weight_total: int = 0
|
||||
for rarity: String in Data.Rarity:
|
||||
weight_total += Data.rarity_weights[rarity]
|
||||
|
||||
var generated_rarity: int = randi_range(0, weight_total)
|
||||
var decided_rarity: int = 0
|
||||
|
||||
for rarity: String in Data.Rarity:
|
||||
weight_total -= Data.rarity_weights[rarity]
|
||||
if generated_rarity >= weight_total:
|
||||
decided_rarity = Data.Rarity[rarity]
|
||||
break
|
||||
|
||||
var card_array: Array = []
|
||||
for x: Card in Data.cards:
|
||||
if x.rarity == decided_rarity:
|
||||
card_array.append(x)
|
||||
var card: Card
|
||||
for x: CardInHand in cards:
|
||||
if card_array.size() > 0:
|
||||
card = card_array.pick_random()
|
||||
card_array.erase(card)
|
||||
x.set_card(card)
|
||||
#TODO: in reality this should just show the icon and then hovering over it lets you see either side at the players own discretion
|
||||
x.view_tower()
|
||||
$Node3D.set_visible(true)
|
||||
for x: CollisionShape3D in choice_colliders:
|
||||
x.disabled = false
|
||||
card_available = true
|
||||
|
||||
|
||||
func retrieve_card(i: int) -> void:
|
||||
$Node3D.set_visible(false)
|
||||
for x: CollisionShape3D in choice_colliders:
|
||||
x.disabled = true
|
||||
if card_available:
|
||||
var card: Card = cards[i].stats
|
||||
var item: ItemCard = item_card_scene.instantiate() as ItemCard
|
||||
item.card = card
|
||||
item.position = Vector3(1.683, 0, 0)
|
||||
add_child(item)
|
||||
button_collider.disabled = false
|
||||
button_box.position = Vector3(0,0,0)
|
||||
$AudioStreamPlayer3D.play()
|
||||
|
||||
|
||||
func _on_static_body_3d_button_interacted(_value: int) -> void:
|
||||
button_collider.disabled = true
|
||||
button_box.position = Vector3(0,0,-0.2)
|
||||
$AudioStreamPlayer3D.play()
|
||||
randomize_cards()
|
@ -3,6 +3,7 @@ extends Node
|
||||
signal wave_started(wave_number: int)
|
||||
signal wave_finished(wave_number: int)
|
||||
signal base_took_damage(remaining_health: int)
|
||||
signal rng_seeded()
|
||||
signal game_started
|
||||
signal game_restarted
|
||||
signal lost_game
|
||||
@ -30,6 +31,7 @@ var wave_limit: int = 20
|
||||
var starting_cash: int = 16
|
||||
var shop_chance: float = 0.0
|
||||
var stats: RoundStats = RoundStats.new()
|
||||
var rng: FastNoiseLite
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
@ -38,6 +40,19 @@ func _ready() -> void:
|
||||
get_tree().root.add_child.call_deferred(UILayer)
|
||||
|
||||
|
||||
@rpc("reliable", "call_local")
|
||||
func set_seed(value: int) -> void:
|
||||
rng = FastNoiseLite.new()
|
||||
rng.noise_type = FastNoiseLite.TYPE_VALUE
|
||||
rng.frequency = 1
|
||||
rng.seed = value
|
||||
rng_seeded.emit()
|
||||
|
||||
|
||||
func randi_in_range(sample: float, start: float, end: float) -> int:
|
||||
return floori(remap(rng.get_noise_1d(sample), -1.0, 1.0, start, end + 1))
|
||||
|
||||
|
||||
func parse_command(text: String, peer_id: int) -> void:
|
||||
if text.substr(1, 4) == "give":
|
||||
var gift_name: String = text.substr(6) as String
|
||||
@ -65,7 +80,7 @@ func parse_command(text: String, peer_id: int) -> void:
|
||||
else:
|
||||
chatbox.append_message("SERVER", Color.TOMATO, "Unable to edit gamemode")
|
||||
elif text.substr(1, 11) == "spawn_print":
|
||||
level.printer._on_static_body_3d_button_interacted(0)
|
||||
level.printer._on_static_body_3d_button_interacted(0, connected_players_nodes[peer_id].inventory)
|
||||
elif text.substr(1, 10) == "spawn_shop":
|
||||
level.shop.randomize_cards()
|
||||
elif text.substr(1, 7) == "prosper":
|
||||
@ -76,6 +91,8 @@ func parse_command(text: String, peer_id: int) -> void:
|
||||
networked_set_wave.rpc(int(text.substr(10)))
|
||||
else:
|
||||
chatbox.append_message("SERVER", Color.TOMATO, "Unable to set wave")
|
||||
elif text.substr(1, 4) == "seed":
|
||||
chatbox.append_message("SERVER", Color.TOMATO, str(rng.seed))
|
||||
# if text.substr(1, 17) == "show tower ranges":
|
||||
# pass
|
||||
# if text.substr(1, 20) = "show gauntlet ranges":
|
||||
@ -229,6 +246,10 @@ func remove_player(peer_id: int) -> void:
|
||||
|
||||
|
||||
func start_game() -> void:
|
||||
if is_multiplayer_authority():
|
||||
set_seed.rpc(randi())
|
||||
else:
|
||||
await rng_seeded
|
||||
game_active = true
|
||||
enemies = 0
|
||||
objective_health = 120
|
||||
|
@ -1,11 +1,11 @@
|
||||
class_name InteractButton extends StaticBody3D
|
||||
|
||||
signal button_interacted(value: int)
|
||||
signal button_interacted(value: int, callback: Hero)
|
||||
|
||||
@export var button_press_value: int = 0
|
||||
@export var press_cost: int = 0
|
||||
@export var hover_text: String = "Press [Interact]"
|
||||
|
||||
|
||||
func press() -> void:
|
||||
button_interacted.emit(button_press_value)
|
||||
func press(callback_player: Hero) -> void:
|
||||
button_interacted.emit(button_press_value, callback_player)
|
||||
|
@ -49,7 +49,7 @@ func networked_add(value: int) -> void:
|
||||
|
||||
@rpc("reliable", "any_peer")
|
||||
func networked_remove_at(value: int) -> void:
|
||||
var item: Item = contents.keys[value]
|
||||
var item: Item = contents.keys()[value]
|
||||
contents[item] -= 1
|
||||
if contents[item] == 0:
|
||||
contents.erase(item)
|
||||
|
@ -13,26 +13,43 @@ class_name Level extends GridMap
|
||||
|
||||
|
||||
func generate_obstacles() -> void:
|
||||
var obstacle_count: int = randi_range(0, 5)
|
||||
#print(str(multiplayer.get_unique_id()) + " spawning obstacles with seed: " + str(Game.rng.seed))
|
||||
var obstacle_count: int = Game.randi_in_range(1, 0, 5)
|
||||
obstacle_count = 3
|
||||
for index: int in obstacle_count:
|
||||
var x: int = randi_range(0, a_star_graph_3d.grid_size.x - 1)
|
||||
var y: int = randi_range(0, a_star_graph_3d.grid_size.y - 1)
|
||||
var point_id: int = int(x * a_star_graph_3d.grid_size.y + y)
|
||||
var chosen_obstacle: int = randi_range(0, obstacle_scenes.size() - 1)
|
||||
var x: int = Game.randi_in_range(10 * index, 1 - a_star_graph_3d.grid_size.x, a_star_graph_3d.grid_size.x - 1)
|
||||
var y: int = Game.randi_in_range(32 * index, 1 - a_star_graph_3d.grid_size.y, a_star_graph_3d.grid_size.y - 1)
|
||||
var chosen_obstacle: int = Game.randi_in_range(4 * index, 0, obstacle_scenes.size() - 1)
|
||||
var obstacle: GridMap = obstacle_scenes[chosen_obstacle].instantiate() as GridMap
|
||||
var orientations: Array[int] = [0, 90, 180, 270]
|
||||
var chosen_orientation: int = orientations.pick_random()
|
||||
obstacle.position = a_star_graph_3d.astar.get_point_position(point_id)
|
||||
var chosen_orientation: int = Game.randi_in_range(15 * index, 0, orientations.size() - 1)
|
||||
obstacle.position = Vector3(x, 0, y)
|
||||
obstacle.set_rotation_degrees(Vector3(0, chosen_orientation, 0))
|
||||
add_child(obstacle)
|
||||
for cell: Vector3i in obstacle.get_used_cells():
|
||||
var cell_pos: Vector3 = obstacle.to_global(obstacle.map_to_local(cell))
|
||||
var map_coord: Vector3i = 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: int = a_star_graph_3d.astar.get_closest_point(cell_pos, true)
|
||||
var closest_point_pos: Vector3 = 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)
|
||||
var cell_coord: Vector3 = obstacle.to_global(obstacle.map_to_local(cell))
|
||||
remove_world_tile(round(cell_coord.x), round(cell_coord.z))
|
||||
obstacle.queue_free()
|
||||
|
||||
|
||||
func cell_coord_to_astar_point(x: int, y: int) -> int:
|
||||
var center_point_x: int = floori(a_star_graph_3d.grid_size.x / 2.0) * a_star_graph_3d.grid_size.y
|
||||
var center_point_y: int = a_star_graph_3d.grid_size.y / 2.0
|
||||
return (center_point_x + ((x / 2.0) * a_star_graph_3d.grid_size.y)) + (center_point_y + (y / 2.0))
|
||||
|
||||
|
||||
func remove_world_tile(x: int, y: int) -> void:
|
||||
if get_cell_item(Vector3i(x, 0, y)) != 1 or abs(x) >= a_star_graph_3d.grid_size.x or abs(y) >= a_star_graph_3d.grid_size.y:
|
||||
return
|
||||
set_cell_item(Vector3i(x, 0, y), INVALID_CELL_ITEM)
|
||||
var point: int = cell_coord_to_astar_point(x, y)
|
||||
var north_point: int = cell_coord_to_astar_point(x - 1, y)
|
||||
var south_point: int = cell_coord_to_astar_point(x + 1, y)
|
||||
var east_point: int = cell_coord_to_astar_point(x, y + 1)
|
||||
var west_point: int = cell_coord_to_astar_point(x, y - 1)
|
||||
if x % 2 == 0 and y % 2 == 0: #If the tile is on a point on the pathfinding grid
|
||||
a_star_graph_3d.astar.set_point_disabled(point)
|
||||
if x % 2 == 1 and y % 2 == 0: #If the cell breaks a north-south link
|
||||
a_star_graph_3d.astar.disconnect_points(north_point, south_point)
|
||||
if x % 2 == 0 and y % 2 == 1: #If the cell breaks a east-west link
|
||||
a_star_graph_3d.astar.disconnect_points(east_point, west_point)
|
||||
|
@ -100,7 +100,8 @@ func start_game() -> void:
|
||||
loadout_editor.set_visible(false)
|
||||
|
||||
|
||||
func edit_player_profile(_argument: PlayerProfile) -> void:
|
||||
#TODO: what the fuck is this doing lol
|
||||
func edit_player_profile(_argument: int) -> void:
|
||||
var profile_dict: Dictionary = Data.player_profile.to_dict()
|
||||
networked_edit_player_profile.rpc(multiplayer.get_unique_id(), profile_dict)
|
||||
|
||||
|
@ -1,70 +0,0 @@
|
||||
class_name ShopStand extends Node3D
|
||||
|
||||
@export var cards: Array[CardInHand]
|
||||
@export var choice_colliders: Array[CollisionShape3D]
|
||||
@export var choice_buttons: Array[InteractButton]
|
||||
@export var choice_sprites: Array[Sprite3D]
|
||||
@export var item_card_scene: PackedScene
|
||||
|
||||
var price_dict: Dictionary = {
|
||||
Data.Rarity.UNCOMMON : 30,
|
||||
Data.Rarity.RARE : 50,
|
||||
Data.Rarity.EPIC : 75,
|
||||
Data.Rarity.LEGENDARY : 100,
|
||||
}
|
||||
|
||||
|
||||
func close() -> void:
|
||||
for x: CollisionShape3D in choice_colliders:
|
||||
x.disabled = true
|
||||
for x: Sprite3D in choice_sprites:
|
||||
x.set_visible(false)
|
||||
|
||||
|
||||
func randomize_cards() -> void:
|
||||
var cheap_cards: Array[Card] = []
|
||||
var medium_cards: Array[Card] = []
|
||||
var pricey_cards: Array[Card] = []
|
||||
for card: Card in Data.cards:
|
||||
if card.rarity == Data.Rarity.UNCOMMON or card.rarity == Data.Rarity.RARE:
|
||||
cheap_cards.append(card)
|
||||
if card.rarity == Data.Rarity.RARE or card.rarity == Data.Rarity.EPIC:
|
||||
medium_cards.append(card)
|
||||
if card.rarity == Data.Rarity.EPIC or card.rarity == Data.Rarity.LEGENDARY:
|
||||
pricey_cards.append(card)
|
||||
|
||||
for x: int in 3:
|
||||
var chosen_card: Card = cheap_cards.pick_random()
|
||||
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.display_name + "?"
|
||||
for x: int in 2:
|
||||
var chosen_card: 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.display_name + "?"
|
||||
for x: int in 1:
|
||||
var chosen_card: 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.display_name + "?"
|
||||
for x: CollisionShape3D in choice_colliders:
|
||||
x.set_deferred("disabled", false)
|
||||
for x: Sprite3D in choice_sprites:
|
||||
x.set_visible(true)
|
||||
|
||||
|
||||
func retrieve_card(i: int) -> void:
|
||||
#close()
|
||||
choice_colliders[i].disabled = true
|
||||
choice_sprites[i].set_visible(false)
|
||||
var card: Card = cards[i].stats
|
||||
var item: ItemCard = item_card_scene.instantiate() as ItemCard
|
||||
item.card = card
|
||||
item.position = Vector3(2.128, 0, 0)
|
||||
add_child(item)
|
||||
#button_collider.disabled = false
|
||||
#button_box.position = Vector3(0,0,0)
|
20
Scripts/sprite_bobber.gd
Normal file
20
Scripts/sprite_bobber.gd
Normal file
@ -0,0 +1,20 @@
|
||||
class_name SpriteBobber extends Node
|
||||
|
||||
@export var character: EnemyController
|
||||
@export var sprite: Node3D
|
||||
@export var height: float = 0.1
|
||||
|
||||
var default_height: float = 0.0
|
||||
var sample_point: float = 0.0
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
default_height = sprite.position.y
|
||||
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
sample_point += delta * (character.stats.movement_speed * 2.0)
|
||||
var y_offset: float = sin(sample_point * 2.0) / 2.0 + 0.5
|
||||
var x_offset: float = cos(sample_point)
|
||||
sprite.position.y = default_height + (y_offset * height)
|
||||
sprite.position.x = x_offset * 0.05
|
Reference in New Issue
Block a user