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)
|
|
|