1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
extends Spatial
#const scenes = {"pavement_commute":preload("res://3d/pavement_commute/pavement_commute.tscn"),
# "room":preload("res://3d/room/room.tscn")}
var scene_name = null
var scene = null
onready var pfriend = $"3d/pfriend"
onready var schedule = $ui/schedule
onready var presents = $ui/presents
onready var needs = $"3d/pfriend/needs"
func _ready():
var save = load_save_file()
if save:
needs.last_update = save["needs"]["last_update"]
needs.simulate_away_time(OS.get_unix_time())
change_scene(save["scene"])
else:
change_scene("room")
schedule.connect("request_save", self, "write_save")
presents.connect("give_item", self, "give_item")
func load_save_file():
var file = File.new()
if OK != file.open("user://1.save", File.READ):
return false
var content = file.get_as_text()
var result = JSON.parse(content)
file.close()
if result.error:
printerr("failed to load save, invalid json\n" + result.error_string)
return false
return result.result
func make_save_json():
return {
"format_version": 1,
"needs":needs.serialize(),
"scene":scene_name,
"schedule":schedule.serialize()
}
func write_save():
var file = File.new()
file.open("user://1.save", File.WRITE)
file.store_string(JSON.print(make_save_json(), " ", false))
func give_item(name):
pfriend.receive_item(name)
func change_scene(name):
var new_scene_tscn = load("res://3d/" + name + "/" + name + ".tscn")
# var new_scene_tscn = scenes[name]
if not new_scene_tscn:
printerr("could not open scene " + name)
return false
var new_scene = new_scene_tscn.instance()
var camera_path : Path = new_scene.get_node("camera_path")
if not camera_path:
printerr("no camera_path in scene " + name)
return false
var camera : Camera = camera_path.get_node("follow/camera")
if not camera:
printerr("no camera in scene " + name)
return false
camera_path.get_parent().remove_child(camera_path)
pfriend.get_parent().remove_child(pfriend)
new_scene.add_child(pfriend)
new_scene.add_child(camera_path)
new_scene.visible = true
new_scene.pfriend = pfriend
camera.focus = pfriend
Global.set_current_camera(camera)
pfriend.scene = new_scene
pfriend.navigation = new_scene.get_node("navigation")
$"3d".add_child(new_scene)
if scene:
scene.queue_delete()
scene = new_scene
scene_name = name
var start_position : Spatial = new_scene.get_node("start_position")
if not start_position:
printerr("no start_position in scene " + name)
pfriend.transform.origin = Vector3(0,0,0)
else:
pfriend.transform.origin = start_position.transform.origin
pfriend.y_offset = pfriend.transform.origin.y
return true