root/game.gd

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