145 lines
4.6 KiB
GDScript
145 lines
4.6 KiB
GDScript
extends Node2D
|
|
class_name Scene
|
|
|
|
const gs = preload("res://GameScript.gd")
|
|
#@onready var gamescript: gs = %GameScript
|
|
@onready var ScriptBuilder = $GameScript
|
|
|
|
|
|
@onready var map = NavigationServer2D.map_create()
|
|
@onready var region = NavigationServer2D.region_create()
|
|
@export var camera:Camera2D
|
|
@onready var pathfind = $pathfind
|
|
var ego
|
|
|
|
signal transitioned(Scene)
|
|
|
|
@export var background_scale = 1.0
|
|
|
|
|
|
var start_scale_point : ScalePoint
|
|
var end_scale_point : ScalePoint
|
|
@export var starting_point: Vector2
|
|
func _ready():
|
|
ScriptBuilder =get_node("/root/Node2D/GameScript")
|
|
NavigationServer2D.region_set_navigation_polygon(region, $pathfind.navigation_polygon)
|
|
NavigationServer2D.region_set_map(region, map)
|
|
NavigationServer2D.map_set_active(map, true)
|
|
var graham = load("res://Ego.tscn").instantiate()
|
|
|
|
if starting_point:
|
|
graham.position = starting_point
|
|
else:
|
|
if find_child("default-starting-point"):
|
|
graham.position = find_child("default-starting-point").position
|
|
|
|
add_child(graham)
|
|
ego = graham
|
|
#ego.find_node("AnimationPlayer").play("west")
|
|
#ego.find_node("AnimationPlayer").stop()
|
|
self.start_scale_point = $StartScalePoint
|
|
self.end_scale_point = $EndScalePoint
|
|
var tree = get_tree()
|
|
camera = $"../Camera2D"
|
|
|
|
|
|
|
|
# Called every frame. 'delhideta' is the elapsed time since the previous frame.
|
|
func _process(delta):
|
|
#print(ScriptBuilder.current_script)
|
|
if ScriptBuilder and ScriptBuilder.current_script:
|
|
ScriptBuilder.current_script.step(delta, get_node("/root/Node2D"))
|
|
|
|
#func ego_scale(ego:Node2D):
|
|
#
|
|
#var value_sum = 0.0
|
|
#var weight_sum = 0.0
|
|
#
|
|
#if $Graham and $Graham.position:
|
|
#for c in get_children():
|
|
#if c is ScalePoint:
|
|
#var weight = 1.0 / $Graham.position.distance_to(c.position)
|
|
#weight_sum += weight
|
|
#var value = c.target_scale * weight
|
|
#value_sum += value
|
|
#return value_sum / weight_sum
|
|
#else:
|
|
#return 1.0
|
|
func ego_scale(ego:Node2D):
|
|
if start_scale_point and end_scale_point:
|
|
|
|
return remap(ego.position.y, start_scale_point.position.y, end_scale_point.position.y, start_scale_point.target_scale, end_scale_point.target_scale)
|
|
return 1.0
|
|
|
|
# var scale_points=[]
|
|
# var total_distance = 0.0
|
|
# for c in get_children():
|
|
# if c is ScalePoint:
|
|
# scale_points.append(c)
|
|
# total_distance += ego.position.distance_to(c.position)
|
|
#
|
|
# var inverse_distance_influence = []
|
|
# for p in scale_points:
|
|
# inverse_distance_influence.append ([ego.position.distance_to(p.position) / total_distance, p.target_scale])
|
|
#
|
|
# inverse_distance_influence.sort()
|
|
# var target_scale = 0.0
|
|
# var remaining = 1.0
|
|
# var should_print = rand_range(0.0, 20.0) <= 0.1
|
|
# for p in inverse_distance_influence:
|
|
# var weight = (1.0 - p[0]) * remaining
|
|
# remaining -= weight
|
|
# target_scale += weight * p[1]
|
|
# if should_print:
|
|
# print("weight:", weight, " scale:", p[1])
|
|
# if should_print:
|
|
# print("")
|
|
## inverse_distance_influence.append(z)
|
|
#
|
|
#
|
|
# return target_scale
|
|
#
|
|
|
|
|
|
|
|
#var start = ego.position.distance_to(start_scale_point.position)
|
|
#var end = ego.position.distance_to(end_scale_point.position)
|
|
|
|
#var magnitude = sqrt((start*start) + (end*end))
|
|
#var start_influence = 1.0 - start/magnitude
|
|
#var end_influence = 1.0 - end/magnitude
|
|
#var start_influence = range_lerp(start * start, 0.0, smallest_influence * smallest_influence, 1.0, 0.0)
|
|
#var end_influence = range_lerp(end * end, 0.0, smallest_influence * smallest_influence, 1.0, 0.0)
|
|
#print ( "start:", start_influence, " end:", end_influence)
|
|
|
|
|
|
func _on_script_complete():
|
|
ScriptBuilder.current_script = null
|
|
|
|
func start_main_script(s):
|
|
if ScriptBuilder.current_script and ScriptBuilder.current_script.interrupt():
|
|
ScriptBuilder.current_script = s
|
|
if not ScriptBuilder.current_script:
|
|
ScriptBuilder.current_script = s
|
|
|
|
func _unhandled_input(event):
|
|
if event is InputEventMouseButton and Input.is_action_just_released("interact"):
|
|
# If a script is running and can't be interrupted, delegate to it
|
|
if ScriptBuilder.current_script and not ScriptBuilder.current_script.can_interrupt:
|
|
if ScriptBuilder.current_script.handle_input(event):
|
|
return
|
|
|
|
var root = get_node("/root/Node2D")
|
|
# If look cursor is active and we got here, no SetPiece handled the input
|
|
# so this is a room-wide look
|
|
if ActionState.current_action == ActionState.Action.LOOK:
|
|
_on_room_looked()
|
|
return
|
|
if ActionState.current_action == ActionState.Action.WALK:
|
|
var path = NavigationServer2D.map_get_path(map, ego.position, pathfind.to_local(get_global_mouse_position()), true)
|
|
start_main_script(ScriptBuilder.init(ScriptBuilder.walk_path(ego, path)).can_interrupt().build(self, "_on_script_complete"))
|
|
|
|
func _on_room_looked() -> void:
|
|
# Default room look description - override in room scripts
|
|
pass
|