Browse Source

[Hero 1] Allow wall deletion, placement w/out E

Also allow 100 walls, and removal of all walls upon death
master
Luna 7 years ago
parent
commit
370b4b93ac
5 changed files with 106 additions and 44 deletions
  1. +0
    -1
      scenes/heroes/1.tscn
  2. +5
    -0
      scripts/heroes/1-wall.gd
  3. +74
    -16
      scripts/heroes/1.gd
  4. +2
    -2
      scripts/player.gd

+ 0
- 1
scenes/heroes/1.tscn View File

@ -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 ) transform = Transform( 1, 0, 0, 0, -1.54624e-07, -0.949072, 0, 1, -1.62921e-07, 0, 0.725089, 0 )
mesh = ExtResource( 4 ) mesh = ExtResource( 4 )
material/0 = null
[node name="TPCamera" parent="." index="5"] [node name="TPCamera" parent="." index="5"]


scripts/heroes/0-wall.gd → scripts/heroes/1-wall.gd View File


+ 74
- 16
scripts/heroes/1.gd View File

@ -4,12 +4,17 @@ var walls = []
var placing_wall_node var placing_wall_node
var is_placing_wall = false var is_placing_wall = false
const max_walls = 7
const max_walls = 100
# --- Godot overrides ---
func _process(delta): func _process(delta):
if is_network_master(): 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 # Press button twice to cancel
if is_placing_wall: if is_placing_wall:
# We changed our mind, delete the placing wall # We changed our mind, delete the placing wall
@ -20,30 +25,75 @@ func _process(delta):
placing_wall_node = add_wall() placing_wall_node = add_wall()
is_placing_wall = true 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 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(): 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: for wall in walls:
wall.queue_free() wall.queue_free()
walls = []
slave func slave_place_wall(tf): slave func slave_place_wall(tf):
var wall = add_wall() var wall = add_wall()
finalize_wall(wall, tf) 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 # Creates wall, adds to world, and returns the node
func add_wall(): func add_wall():
var wall = preload("res://scenes/wall.tscn").instance() var wall = preload("res://scenes/wall.tscn").instance()
@ -67,3 +117,11 @@ func check_wall_count():
if walls.size() > max_walls: if walls.size() > max_walls:
walls[0].queue_free() walls[0].queue_free()
walls.pop_front() 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

+ 2
- 2
scripts/player.gd View File

@ -52,7 +52,7 @@ func _ready():
# Remove HUD # Remove HUD
remove_child(get_node(master_only)) remove_child(get_node(master_only))
func spawn():
sync func spawn():
if "record" in player_info: if "record" in player_info:
write_recording() # Write each spawn as a separate recording write_recording() # Write each spawn as a separate recording
var placement = Vector3() var placement = Vector3()
@ -225,7 +225,7 @@ func _process(delta):
switch_charge = switch_charge_cap switch_charge = switch_charge_cap
if get_translation().y < fall_height: if get_translation().y < fall_height:
spawn()
rpc("spawn")
if "record" in player_info: if "record" in player_info:
recording.time += delta recording.time += delta


Loading…
Cancel
Save