A team game with an emphasis on movement (with no shooting), inspired by Overwatch and Zineth
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

127 lines
3.4 KiB

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