sokoban
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
extends Node2D

var currentintlevel := 1
var screenshots = 0
var game_over = false setget set_over
var game_won = false setget set_won
var over = false
var just_started = true

onready var level := $Level
onready var console = MainInstances.console

const path = "user://"


func _ready():
	if Utils.starting:
		start()
		Utils.starting = false
	if Utils.loading:
		Utils.loading = false
		currentintlevel = Utils.loading_int
		Utils.loading_int = 0
		start()
	$WinScreen.player = $Level/LevelContainer/Player
	$WinScreen.hide(false)
	level.connect("level_completed", self, "_on_Level_level_completed")
	level.connect("level_reset", self, "_on_Level_level_reset")
	level.connect("game_over", self, "_on_Level_game_over")


func _on_Level_level_completed(complete = false):
	$Level/CanvasLayer/HUD/StopWatch.set_process(false)
	if complete:
		$WinScreen._show(str(level.current_level))
		save(currentintlevel + 1)
		game_over = false
		game_won = true
	else:
		$Level/LevelContainer/LevelComplete.play("Animate")
	get_tree().call_group("target", "play_pulse")


func _on_Level_level_reset():
	$WinScreen.hide(true)
	$GameoverScreen.hide(true)
	game_over = false
	game_won = false


func save(new_level):  # what level are we on/going to
	if (new_level) > int(SaveLoad.files.level.data.highest_level):
		SaveLoad.files.level.data.highest_level = str(new_level - 1)
		console.Log("New Highscore!")
	SaveLoad.save("level")


func _on_Level_game_over():
	game_over = true
	game_won = false
	$GameoverScreen._show(str(level.current_level))


onready var cam = $Level/LevelContainer/Player.cam

var max_zoom = 3
var min_zoom = .25


func _input(event: InputEvent):
	if event.is_action("scrollup"):
		var new_zoom = cam.zoom.x
		new_zoom += .01
		new_zoom = clamp(new_zoom, min_zoom, max_zoom)
		cam.zoom = Vector2(new_zoom, new_zoom)

	elif event.is_action("scrolldown"):
		var new_zoom = cam.zoom.x
		new_zoom -= .03
		new_zoom = clamp(new_zoom, min_zoom, max_zoom)
		cam.zoom = Vector2(new_zoom, new_zoom)

	elif event.is_action_released("next"):
		currentintlevel += 1
		currentintlevel = clamp(currentintlevel, 1, 60)

		start()

	if event.is_action_released("ui_accept"):
		if $WinScreen.shown:
			currentintlevel += 1
			$WinScreen.hide(true)
			game_won = false
			level.load_level(str(currentintlevel))

		elif $GameoverScreen.shown:
			$GameoverScreen.hide(true)
			game_won = false
			game_over = false
			level.load_level(str(currentintlevel), false)

	elif event.is_action_released("prtscrn"):
		screenshots += 1
		screenshots = clamp(screenshots, 0, 20)
		var save_path = path + "sokobanscreenshot_%s.png" % str(screenshots)
		var image = get_viewport().get_texture().get_data()
		image.flip_y()
		if console.Log(
			(
				"saved to: "
				+ OS.get_user_data_dir()
				+ "/"
				+ "sokobanscreenshot_%s.png" % str(screenshots)
			),
			1,
			2.5
		):
			image.save_png(save_path)


func start():
	Utils.load_loading_screen()
	yield(Utils, "loaded_loading_screen")
	$Level/CanvasLayer/HUD.show()
	level.show()
	level.load_level(str(currentintlevel))


func set_won(value):
	game_won = value
	over = game_over or game_won


func set_over(value):
	game_over = value
	over = game_over or game_won