extends "res://scripts/placeable.gd"
|
|
|
|
var portal_charge = 15
|
|
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 init(maker):
|
|
|
|
var maker_portals = maker.placement.placed
|
|
index = maker_portals.size() # No -1, because we haven't actually been added to the array yet
|
|
# 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 player_collided(with, player):
|
|
if with == self:
|
|
portal(player)
|
|
|
|
func find_other():
|
|
var maker_portals = maker_node.placement.placed
|
|
var count = maker_portals.size()
|
|
# If index is odd, we're the second (1, 3...), if even, first (0, 4...)
|
|
var second = index % 2 != 0
|
|
var delta = -1 if second else 1
|
|
if index + delta < count:
|
|
other = maker_portals[index + delta] # Second-to-last: we're already included
|
|
return other
|
|
else:
|
|
return null
|
|
|
|
func portal(player):
|
|
if player.player_info.is_right_team == maker_node.player_info.is_right_team:
|
|
if find_other():
|
|
var spawn_distance = 2
|
|
# 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.switch_charge += portal_charge
|
|
|