From 370b4b93ac29b14a30cdaad42034ff141ca08f35 Mon Sep 17 00:00:00 2001 From: Luna Date: Sat, 17 Feb 2018 14:46:45 -0500 Subject: [PATCH] [Hero 1] Allow wall deletion, placement w/out E Also allow 100 walls, and removal of all walls upon death --- scenes/heroes/1.tscn | 1 - scripts/heroes/0-wall.gd | 25 -------------- scripts/heroes/1-wall.gd | 30 ++++++++++++++++ scripts/heroes/1.gd | 90 +++++++++++++++++++++++++++++++++++++++--------- scripts/player.gd | 4 +-- 5 files changed, 106 insertions(+), 44 deletions(-) delete mode 100644 scripts/heroes/0-wall.gd create mode 100644 scripts/heroes/1-wall.gd diff --git a/scenes/heroes/1.tscn b/scenes/heroes/1.tscn index d3ce302..64d2a1e 100644 --- a/scenes/heroes/1.tscn +++ b/scenes/heroes/1.tscn @@ -27,7 +27,6 @@ mesh = ExtResource( 3 ) transform = Transform( 1, 0, 0, 0, -1.54624e-07, -0.949072, 0, 1, -1.62921e-07, 0, 0.725089, 0 ) mesh = ExtResource( 4 ) -material/0 = null [node name="TPCamera" parent="." index="5"] diff --git a/scripts/heroes/0-wall.gd b/scripts/heroes/0-wall.gd deleted file mode 100644 index 6c1aad7..0000000 --- a/scripts/heroes/0-wall.gd +++ /dev/null @@ -1,25 +0,0 @@ -extends StaticBody - -var maker_node -var touch_charge = 1 - -func init(maker, color): - maker_node = maker - var mat = SpatialMaterial.new() - color.a = 0.5 - mat.flags_transparent = true - mat.albedo_color = color - get_node("MeshInstance").set_surface_material(0, mat) - -func place(): - # Originally, the wall is disabled to avoid weird physics - get_node("CollisionShape").disabled = false - get_node("MeshInstance").get_surface_material(0).flags_transparent = false - -func _process(delta): - pass - # var cols = get_colliding_bodies() - # for col in cols: - # if col != maker_node: # Don't count ourself. This encourages teamwork and discourages wall-touching-for-charge abuse - # maker_node.switch_charge += touch_charge * delta - diff --git a/scripts/heroes/1-wall.gd b/scripts/heroes/1-wall.gd new file mode 100644 index 0000000..9a4c45f --- /dev/null +++ b/scripts/heroes/1-wall.gd @@ -0,0 +1,30 @@ +extends StaticBody + +var maker_node +var touch_charge = 1 + +func init(maker, color): + maker_node = maker + var mat = SpatialMaterial.new() + color.a = 0.5 + mat.flags_transparent = true + mat.albedo_color = color + get_node("MeshInstance").set_surface_material(0, mat) + +func place(): + # Originally, the wall is disabled to avoid weird physics + get_node("CollisionShape").disabled = false + get_node("MeshInstance").get_surface_material(0).flags_transparent = false + +func make_last(): + var mat = get_node("MeshInstance").get_surface_material(0) + mat.flags_transparent = true + mat.albedo_color.a = 0.9 + +func _process(delta): + pass + # var cols = get_colliding_bodies() + # for col in cols: + # if col != maker_node: # Don't count ourself. This encourages teamwork and discourages wall-touching-for-charge abuse + # maker_node.switch_charge += touch_charge * delta + diff --git a/scripts/heroes/1.gd b/scripts/heroes/1.gd index d17b671..bf5eee4 100644 --- a/scripts/heroes/1.gd +++ b/scripts/heroes/1.gd @@ -4,12 +4,17 @@ var walls = [] var placing_wall_node var is_placing_wall = false -const max_walls = 7 +const max_walls = 100 + +# --- Godot overrides --- func _process(delta): if is_network_master(): - if Input.is_action_just_pressed("hero_1_place_wall"): + # We allow you to just click to place, without needing to press E + var place_wall = Input.is_action_just_pressed("hero_1_confirm_wall") + + if Input.is_action_just_pressed("hero_1_place_wall") or (place_wall and not is_placing_wall): # Press button twice to cancel if is_placing_wall: # We changed our mind, delete the placing wall @@ -20,30 +25,75 @@ func _process(delta): placing_wall_node = add_wall() is_placing_wall = true - if is_placing_wall: - # Find the point we're looking at, and put the wall there - var aim = get_node("Yaw/Pitch").get_global_transform().basis + if Input.is_action_just_pressed("hero_1_remove_wall"): var look_ray = get_node("TPCamera/Camera/Ray") - var pos = look_ray.get_collision_point() - placing_wall_node.set_translation(pos) - var towards = look_ray.get_collision_normal() + pos - var up = -aim[2] # Wall should be horizontal to my view - placing_wall_node.look_at(towards, up) - - if Input.is_action_just_pressed("hero_1_confirm_wall"): - finalize_wall(placing_wall_node) - rpc("slave_place_wall", placing_wall_node.get_transform()) - placing_wall_node = null - is_placing_wall = false + var removing = look_ray.get_collider() + var wall = walls.find(removing) + if wall != -1: + rpc("remove_wall", wall) + + if is_placing_wall or place_wall: + position_wall(placing_wall_node) + + if place_wall: + finalize_wall(placing_wall_node) + rpc("slave_place_wall", placing_wall_node.get_transform()) + placing_wall_node = null + is_placing_wall = false func _exit_tree(): + clear_walls() + +# --- Player overrides --- + +func spawn(): + .spawn() + clear_walls() + +# --- Own --- + +# Find the point we're looking at, and put the wall there +func position_wall(wall): + var aim = get_node("Yaw/Pitch").get_global_transform().basis + var look_ray = get_node("TPCamera/Camera/Ray") + var pos = look_ray.get_collision_point() + wall.set_translation(pos) + var normal = look_ray.get_collision_normal() + var towards = normal + pos + var up = aim[2] # Wall should be horizontal to my view + # This helps nearly horizontal walls be easier to make flat + # We have two methods I'm deciding between + var use_method_two = true + if not use_method_two: + # Method one: only allow horizontal or vertical, based on whether the surface faces you + var wall_wall_margin = 0.75 + if normal.dot(Vector3(0,1,0)) < wall_wall_margin: + var margin = 0.8 + if up.dot(normal) > margin: # The wall is facing us + # We want flat + up = Vector3(0,1,0) + else: + # We want straight + up.y = 0 + else: + # Method two: Make y more aggressive than other dimensions + up.y = 3 * tanh(up.y) + up = up.normalized() + wall.look_at(towards, up) + +func clear_walls(): for wall in walls: wall.queue_free() + walls = [] slave func slave_place_wall(tf): var wall = add_wall() finalize_wall(wall, tf) +sync func remove_wall(index): + walls[index].queue_free() + walls.remove(index) + # Creates wall, adds to world, and returns the node func add_wall(): var wall = preload("res://scenes/wall.tscn").instance() @@ -67,3 +117,11 @@ func check_wall_count(): if walls.size() > max_walls: walls[0].queue_free() walls.pop_front() + # When placing, make the about-to-disappear wall translucent + if walls.size() >= max_walls: + walls[0].make_last() + +func sigmoid(x): + var margin = 0.2 + return 0 if abs(x) < margin else x + diff --git a/scripts/player.gd b/scripts/player.gd index aea94d7..19eb30f 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -52,7 +52,7 @@ func _ready(): # Remove HUD remove_child(get_node(master_only)) -func spawn(): +sync func spawn(): if "record" in player_info: write_recording() # Write each spawn as a separate recording var placement = Vector3() @@ -225,7 +225,7 @@ func _process(delta): switch_charge = switch_charge_cap if get_translation().y < fall_height: - spawn() + rpc("spawn") if "record" in player_info: recording.time += delta