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.
 
 
 

69 lines
1.7 KiB

extends "res://scripts/placeable.gd"
var portal_charge = -5
var other
var index
var enemy_colors = [
Color("#d14013"),
Color("#ecb521"),
]
var friend_colors = [
Color("#1209c4"),
Color("#2066e7"),
]
func _ready():
for player in get_node("/root/Level/Players").get_children():
player.connect("body_entered", self, "player_collided", [player])
func _exit_tree():
# We delete in pairs
if other:
maker_node.placement.placed.remove(index - 1)
other.queue_free()
func init(maker):
index = maker.placement.placed.size()
# If index is odd, we're the second (1, 3...), if even, first (0, 4...)
var second = index % 2 != 0
var is_friend = util.is_friendly(maker)
var color_set = friend_colors if is_friend else enemy_colors
var color = color_set[int(second)]
var mat = SpatialMaterial.new()
# color.a = 0.5
# mat.flags_transparent = true
mat.albedo_color = color
get_node("MeshInstance").set_surface_material(0, mat)
.init(maker)
func place():
.place()
var second = index % 2 != 0
if second:
# Our responsibility to complete the pairing
other = maker_node.placement.placed[index - 1]
other.other = self
func player_collided(with, player):
if with == self:
portal(player)
func portal(player):
if player.player_info.is_right_team == maker_node.player_info.is_right_team:
if other:
if maker_node.charge > -portal_charge:
var spawn_distance = 1.75
# Find a sane place to spawn
# -Z is in the direction of the portal
# X is enough away from the portal to avoid infinite loop
# With both axes, gravity could never bring us to hit the portal
var to = other.to_global(Vector3(spawn_distance,0,-spawn_distance))
player.set_translation(to)
maker_node.build_charge(portal_charge)