|
|
- extends "res://scripts/player.gd"
-
- var walls = []
- var placing_wall_node
- var is_placing_wall = false
-
- const max_walls = 100
-
- # --- Godot overrides ---
-
- func _process(delta):
- if is_network_master():
-
- # 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
- placing_wall_node.queue_free()
- is_placing_wall = false
- else:
- # Make a floating placement wall
- placing_wall_node = add_wall()
- is_placing_wall = true
-
- if Input.is_action_just_pressed("hero_1_remove_wall"):
- var look_ray = get_node("TPCamera/Camera/Ray")
- 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()
- var friendly = player_info.is_right_team == master_player.player_info.is_right_team
- var color = friend_color if friendly else enemy_color
- wall.init(self, color)
- get_node("/root/Level").add_child(wall)
- return wall
-
- func finalize_wall(wall, tf=null):
- if tf:
- wall.set_transform(tf)
- wall.place()
- # Remember this wall, and return to non-placing state
- # We need to do this even as slave, because we keep track of the count
- walls.append(wall)
- check_wall_count()
-
- func check_wall_count():
- # If we've made max_walls, remove the first we made
- 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
-
|