|
|
- extends Node
-
- var recording
- var time
- var set_spawn = true
-
- func _ready():
- if is_network_master():
- get_node("..").connect("spawn", self, "read_recording")
- read_recording()
- set_spawn = true
- time = 0
- set_physics_process(true)
-
- func _physics_process(delta):
- if is_network_master():
- if set_spawn:
- set_spawn()
- set_spawn = false
- play_keys()
- # It's actually better to do this 2nd
- # Since input is, on average, called 1/2way through a frame
- time += delta
-
- func set_spawn():
- get_node("..").set_translation(str2var(recording.spawn))
- print(recording.switch_charge)
- get_node("..").switch_charge = str2var(recording.switch_charge)
-
- func read_recording():
-
- # Gather all existing recordings
- var possible = []
- var begin = "%d-%d" % [get_node("..").player_info.level, get_node("..").player_info.hero]
- var path = "res://recordings/"
- var dir = Directory.new()
- dir.open(path)
- dir.list_dir_begin()
- while true:
- var fname = dir.get_next()
- if fname == "":
- # Indicates end of directory
- break
- if fname.begins_with(begin):
- possible.append(fname)
- dir.list_dir_end()
-
- # Now pick a random one
- var fname = possible[randi() % possible.size()]
-
- print("Reading recording: " + fname)
-
- # Read the file into recording.events for later use
- var frec = File.new()
- frec.open(path + fname, File.READ)
- recording = parse_json(frec.get_as_text())
- frec.close()
-
- set_spawn()
-
- func apply_dict(from, to):
- if typeof(from) != TYPE_DICTIONARY:
- return from
- else:
- for key in from:
- to[key] = apply_dict(from[key], to[key])
- return to
-
- func obj_to_event(d):
- var e
- if d.type == "motion": e = InputEventMouseMotion.new()
- if d.type == "key": e = InputEventKey.new()
- if d.type == "mb": e = InputEventMouseButton.new()
- d.erase("type") # Not in the event
- apply_dict(d, e)
- return e
-
- func play_keys():
- # events[0] is first event
- # events[0][0] is first event's TIME
- if recording.events.size() == 0:
- get_node("..").spawn() # This may cause spawn twice, I hope this isn't a problem
- # get_node("..").switch_charge = 0 # This needs to reset so the recording is accurate
- read_recording()
- while float(recording.events[0][0]) <= time:
- # events[0][1] is first event's EVENT
- var event_obj = recording.events.pop_front()[1]
- var event = obj_to_event(event_obj)
- Input.parse_input_event(event)
- #._input(event)
- #get_node("TPCamera")._input(event)
-
|