OXYGENHUB
◆ main openmsx / share / scripts / _savestate.tcl
3.6 KiB · Tcl · last changed chore(): initial commit 1 month ago source blame history raw
1
# convenience wrappers around the low level savestate commands
2
3
namespace eval savestate {
4
5
proc savestate_common {} {
6
	uplevel {
7
		if {$name eq ""} {set name "quicksave"}
8
		set directory [file normalize $::env(OPENMSX_USER_DATA)/../savestates]
9
		set fullname [file join $directory ${name}.oms]
10
		set png [file join $directory ${name}.png]
11
	}
12
}
13
14
proc savestate {{name ""}} {
15
	savestate_common
16
	file mkdir $directory
17
	if {[catch {::openmsx::internal_screenshot -raw -doublesize $png}]} {
18
		# Creating the new screenshot failed, (try to) remove old screenshot to avoid confusion
19
		catch {file delete -- $png}
20
	}
21
	set currentID [machine]
22
	store_machine $currentID $fullname
23
	return $fullname
24
}
25
26
proc loadstate {{name ""}} {
27
	savestate_common
28
	set newID [restore_machine $fullname]
29
	set currentID [machine]
30
	if {$currentID ne ""} {delete_machine $currentID}
31
	activate_machine $newID
32
	return $name
33
}
34
35
# helper proc to get the raw savestate info
36
proc list_savestates_raw {} {
37
	set directory [file normalize $::env(OPENMSX_USER_DATA)/../savestates]
38
	set results [list]
39
	foreach f [glob -tails -directory $directory -nocomplain *.oms] {
40
		if       {[string range $f end-3 end] eq ".oms"} {
41
			set name [string range $f 0 end-4]
42
		} else {
43
			set name $f
44
		}
45
		set fullname [file join $directory $f]
46
		set filetime [file mtime $fullname]
47
		lappend results [list $name $filetime]
48
	}
49
	return $results
50
}
51
52
proc list_savestates {args} {
53
	set sort_key 0
54
	set sort_option "-ascii"
55
	set sort_order "-increasing"
56
57
	#parse options
58
	while (1) {
59
		switch -- [lindex $args 0] {
60
		"" break
61
		"-t" {
62
			set sort_key 1
63
			set sort_option "-integer"
64
			set args [lrange $args 1 end]
65
			set sort_order "-decreasing"
66
		}
67
		"default" {
68
			error "Invalid option: [lindex $args 0]"
69
		}
70
		}
71
	}
72
73
	set sorted_sublists [lsort ${sort_option} ${sort_order} -index $sort_key [list_savestates_raw]]
74
75
	set sorted_result [list]
76
	foreach sublist $sorted_sublists {lappend sorted_result [lindex $sublist 0]}
77
	return $sorted_result
78
}
79
80
proc delete_savestate {{name ""}} {
81
	savestate_common
82
	catch {file delete -- $fullname}
83
	catch {file delete -- $png}
84
	return ""
85
}
86
87
proc savestate_tab {args} {
88
	list_savestates
89
}
90
91
proc savestate_list_tab {args} {
92
	list "-t"
93
}
94
95
# savestate
96
set_help_text savestate \
97
{savestate [<name>]
98
99
Create a snapshot of the current emulated MSX machine.
100
101
Optionally you can specify a name for the savestate. If you omit this the default name 'quicksave' will be taken.
102
103
See also 'loadstate', 'list_savestates', 'delete_savestate'.
104
}
105
set_tabcompletion_proc savestate [namespace code savestate_tab]
106
107
# loadstate
108
set_help_text loadstate \
109
{loadstate [<name>]
110
111
Restore a previously created savestate.
112
113
You can specify the name of the savestate that should be loaded. If you omit this name, the default savestate will be loaded.
114
115
See also 'savestate', 'list_savestates', 'delete_savestate'.
116
}
117
set_tabcompletion_proc loadstate [namespace code savestate_tab]
118
119
# list_savestates
120
set_help_text list_savestates \
121
{list_savestates [options]
122
123
Return the names of all previously created savestates.
124
125
Options:
126
  -t      sort savestates by time
127
128
See also 'savestate', 'loadstate', 'delete_savestate'.
129
}
130
set_tabcompletion_proc list_savestates [namespace code savestate_list_tab]
131
132
# delete_savestate
133
set_help_text delete_savestate \
134
{delete_savestate [<name>]
135
136
Delete a previously created savestate.
137
138
See also 'savestate', 'loadstate', 'list_savestates'.
139
}
140
set_tabcompletion_proc delete_savestate [namespace code savestate_tab]
141
142
namespace export savestate
143
namespace export loadstate
144
namespace export delete_savestate
145
namespace export list_savestates
146
147
} ;# namespace savestate
148
149
namespace import savestate::*