Show More
@@ -10,10 +10,14 b'' | |||
|
10 | 10 | <div id="qsp-objs" class="qsp-frame"> </div> |
|
11 | 11 | </div> |
|
12 | 12 | <div class="qsp-col qsp-col3"> |
|
13 | <a href="javascript:SugarQSP.lib.savegame()"><img id="qsp-btn-save"></a> | |
|
14 | <a href="javascript:SugarQSP.lib.opengame()"><img id="qsp-btn-load"></a> | |
|
13 | <a id="qsp-btn-save"><img></a> | |
|
14 | <a id="qsp-btn-open"><img></a> | |
|
15 | 15 | </div> |
|
16 | 16 | </div> |
|
17 | 17 | |
|
18 | 18 | <div id="qsp-dropdown"> |
|
19 | 19 | </div> |
|
20 | ||
|
21 | <div id="qsp-image-container"> | |
|
22 | <img id="qsp-image"> | |
|
23 | </div> |
@@ -94,10 +94,21 b'' | |||
|
94 | 94 | height: 50px; |
|
95 | 95 | } |
|
96 | 96 | |
|
97 | #qsp-btn-save { | |
|
97 | #qsp-btn-save img { | |
|
98 | 98 | background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAABmJLR0QA/wD/AP+gvaeTAAACSklEQVRoge3ZPWgUQRjG8V/iRRFU/GoEQdSohSgWWqQSooVgK9iJFiKCnYV2BkFQsBRBQQwWVsHKIoWxEOzEwmhhogbRMhhFicTvYm+JCUlmZzabRLN/OPaWeZ+ZeW7feXf2lpqampqamnRaImKP4hA2VjCP27hbpoNGwbib2IPreB+IPYY7M7SvxWYM4QNO4QqWyQxVRgdeYnnB+K5A+wUcbB7z+O14hxPx08toLRDTgfv4mjrIJFrwwMS0HsABXMTxlE6LpNYqfE7pPJIBdOKhLM1uxIiLrpG5YtC4GSLMVGGkLdD+GpfxAuvxaVL7oCzN+jCG7iKDVmHkKS5hSSBuJ3bg6hRt+Zrpa553z8bEuoQrUVXk1exwKLBI1ZpPBnAL+0KBqanVim1Ykaifji+yNfIrVphipB1n8BgjCfqZ2IrTuIZXMcIUIydxFj8TtEW4JysW52JEKWtkVHUm4EdzjChSrkgLlmJXghb6m8ep9MN4K25XjvTF3sCaElrT6McS+0w2Mirb+JWhrH4CC/0+UpjUK7Ia5/86f4IeHMHeEvPJ+4km1chHE43k9KROpCyLPrViym8/vjW/b5Jt3acjL7/RzEX5bRg3sjKg+2fK7/PmZ9aZzdTqxwYzp06IBZFaDeHUCbFgUquy1Anx35TfRWXkd+WzCBOcQxEjQ7JH0PmiHW9CQUWM9Mr+Y+osO6ME8nF7Q4FFn8T2y14VDMt2vsFfqCRbZBvTdbLXFI9CgphHyjbsVu4+EcMInuH7HI1XU1NTU7OI+QMFe2N82rtssgAAAABJRU5ErkJggg=='); |
|
99 | 99 | } |
|
100 | 100 | |
|
101 |
#qsp-btn- |
|
|
101 | #qsp-btn-open img { | |
|
102 | 102 | background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAABmJLR0QA/wD/AP+gvaeTAAACCklEQVRoge3Yz6sNYRzH8deVexNxSaEoroWFUuomOceSPVnIwsbSxs6Psrgphf9AsrZR7kJWsroUlrZKKZRSl4USGouZk9Npzp1n5pm5x4/nXdNzpvP9Pp/v95nv82OGRCKRSCQS/w8zuIn3yGpe37CEQ6sedQk38BA7G/jO4BQ+YEebQZUxVfH/OxzGVSxX2D4o2mO4jmt4jpNFe6d5mPFkRbvQ0H9h6OqUtR33/xXr0celGn4/sYjXoQ5dJ3ILB7AOW2r4bcIj7GsrkEFpXWyrwwbaf15nXWqv6SqK1abuHDmPjV0EMobhBWIZt8cZVu0j2ZDNHF7gblRozdiO49g1zqDOEzmKJ7gcGVQTzmLDSgZ1Eunh2dD9aewpsXtctH3cwzn5ALysoVWlXZvhleMV5ovfU8J363mciAliRLsRg0Q244vfT3A/zgT2cQHbImIY1S4ldPk9Ii+NH8V9H08DfbfiY6BtiHYpoYmMBr4bbwN9YzfVoEELnew9+blpwBv5u0oI9wPtQrUbkWFaXqOzsZ01IFg7pLQOyp/A58igmhCsHZJInYndNsHa/0wiVWTy9/a5NjprQGvag0Qmwd462iGltdQ8lihqlVVIIn/9/CAvrajDWgTRB8VhMt1/aSljVr4RToc6hJTWioe1jujJD4rfQx2qRvuTyX1JuTIh3UQikUgkEhPnF+1xZ9hHnLjAAAAAAElFTkSuQmCC'); |
|
103 | 103 | } |
|
104 | ||
|
105 | #qsp-image-container { | |
|
106 | position: absolute; | |
|
107 | top: 0; | |
|
108 | left: 0; | |
|
109 | height: 100%; | |
|
110 | width: 100%; | |
|
111 | display: none; | |
|
112 | justify-content: center; | |
|
113 | align-items: center; | |
|
114 | } |
@@ -21,6 +21,22 b'' | |||
|
21 | 21 | title |
|
22 | 22 | "</a>")) |
|
23 | 23 | |
|
24 | (defm (root api init-dom) () | |
|
25 | ;; Save/load buttons | |
|
26 | (let ((btn (document.get-element-by-id "qsp-btn-save"))) | |
|
27 | (setf (ps:@ btn onclick) this.savegame) | |
|
28 | (setf (ps:@ btn href) "#")) | |
|
29 | (let ((btn (document.get-element-by-id "qsp-btn-open"))) | |
|
30 | (setf (ps:@ btn onclick) this.opengame) | |
|
31 | (setf (ps:@ btn href) "#")) | |
|
32 | ;; Close image on click | |
|
33 | (setf (ps:@ (document.get-element-by-id "qsp-image-container") onclick) | |
|
34 | (this.show-image nil)) | |
|
35 | ;; Close the dropdown on any click | |
|
36 | (setf window.onclick | |
|
37 | (lambda (event) | |
|
38 | (setf (ps:@ (api-call get-frame :dropdown) style display) "none")))) | |
|
39 | ||
|
24 | 40 | ;; To be used in saving game |
|
25 | 41 | (defm (root api stash-state) (args) |
|
26 | 42 | (setf (root state-stash) |
@@ -285,3 +301,48 b'' | |||
|
285 | 301 | :do (when (ps:@ v ended) |
|
286 | 302 | (ps:delete (ps:@ (root playing) k))))) |
|
287 | 303 | |
|
304 | (defm (root api show-image) (path) | |
|
305 | (let ((img (document.get-element-by-id "qsp-image"))) | |
|
306 | (cond (path | |
|
307 | (setf img.src path) | |
|
308 | (setf img.style.display "flex")) | |
|
309 | (t | |
|
310 | (setf img.src "") | |
|
311 | (setf img.style.display "hidden"))))) | |
|
312 | ||
|
313 | ;;; Saves | |
|
314 | ||
|
315 | (defm (root api opengame) () | |
|
316 | (let ((element (document.create-element :input))) | |
|
317 | (element.set-attribute :type :file) | |
|
318 | (element.set-attribute :id :qsp-opengame) | |
|
319 | (element.set-attribute :tabindex -1) | |
|
320 | (element.set-attribute "aria-hidden" t) | |
|
321 | (setf element.style.display :block) | |
|
322 | (setf element.style.visibility :hidden) | |
|
323 | (setf element.style.position :fixed) | |
|
324 | (setf element.onchange | |
|
325 | (lambda (event) | |
|
326 | (let* ((file (elt event.target.files 0)) | |
|
327 | (reader (ps:new (*file-reader)))) | |
|
328 | (setf reader.onload | |
|
329 | (lambda (ev) | |
|
330 | (block nil | |
|
331 | (let ((target ev.current-target)) | |
|
332 | (unless target.result | |
|
333 | (return)) | |
|
334 | (api-call base64-to-state target.result) | |
|
335 | (api-call unstash-state))))) | |
|
336 | (reader.read-as-text file)))) | |
|
337 | (document.body.append-child element) | |
|
338 | (element.click) | |
|
339 | (document.body.remove-child element))) | |
|
340 | ||
|
341 | (defm (root api savegame) () | |
|
342 | (let ((element (document.create-element :a))) | |
|
343 | (element.set-attribute :href (+ "data:text/plain;charset=utf-8," (api-call state-to-base64))) | |
|
344 | (element.set-attribute :download "savegame.sav") | |
|
345 | (setf element.style.display :none) | |
|
346 | (document.body.append-child element) | |
|
347 | (element.click) | |
|
348 | (document.body.remove-child element))) |
@@ -137,6 +137,9 b'' | |||
|
137 | 137 | |
|
138 | 138 | ;;; 18img |
|
139 | 139 | |
|
140 | (ps:defpsmacro view (&optional path) | |
|
141 | `(api-call show-image ,path)) | |
|
142 | ||
|
140 | 143 | ;;; 19input |
|
141 | 144 | |
|
142 | 145 | ;;; 20time |
@@ -148,3 +151,15 b'' | |||
|
148 | 151 | (api-call new-local ,(string (second var))) |
|
149 | 152 | ,@(when expr |
|
150 | 153 | `((set ,var ,expr))))) |
|
154 | ||
|
155 | ;;; 22for | |
|
156 | ||
|
157 | ;;; misc | |
|
158 | ||
|
159 | (ps:defpsmacro opengame (&optional filename) | |
|
160 | (declare (ignore filename)) | |
|
161 | `(api-call opengame)) | |
|
162 | ||
|
163 | (ps:defpsmacro savegame (&optional filename) | |
|
164 | (declare (ignore filename)) | |
|
165 | `(api-call savegame)) |
@@ -250,9 +250,9 b'' | |||
|
250 | 250 | |
|
251 | 251 | ;;; 18img |
|
252 | 252 | |
|
253 |
(defm (root lib refint) () |
|
|
254 | ||
|
255 | (defm (root lib view) ()) | |
|
253 | (defm (root lib refint) () | |
|
254 | ;; "Force interface update" Uh... what exactly do we do here? | |
|
255 | ) | |
|
256 | 256 | |
|
257 | 257 | ;;; 19input |
|
258 | 258 | |
@@ -278,6 +278,8 b'' | |||
|
278 | 278 | |
|
279 | 279 | ;;; 21local |
|
280 | 280 | |
|
281 | ;;; 22for | |
|
282 | ||
|
281 | 283 | ;;; misc |
|
282 | 284 | |
|
283 | 285 | (defm (root lib rgb) ()) |
@@ -288,37 +290,3 b'' | |||
|
288 | 290 | |
|
289 | 291 | (defm (root lib killqst) ()) |
|
290 | 292 | |
|
291 | (defm (root lib opengame) (&optional filename) | |
|
292 | (let ((element (document.create-element :input))) | |
|
293 | (element.set-attribute :type :file) | |
|
294 | (element.set-attribute :id :qsp-opengame) | |
|
295 | (element.set-attribute :tabindex -1) | |
|
296 | (element.set-attribute "aria-hidden" t) | |
|
297 | (setf element.style.display :block) | |
|
298 | (setf element.style.visibility :hidden) | |
|
299 | (setf element.style.position :fixed) | |
|
300 | (setf element.onchange | |
|
301 | (lambda (event) | |
|
302 | (let* ((file (elt event.target.files 0)) | |
|
303 | (reader (ps:new (*file-reader)))) | |
|
304 | (setf reader.onload | |
|
305 | (lambda (ev) | |
|
306 | (block nil | |
|
307 | (let ((target ev.current-target)) | |
|
308 | (unless target.result | |
|
309 | (return)) | |
|
310 | (api-call base64-to-state target.result) | |
|
311 | (api-call unstash-state))))) | |
|
312 | (reader.read-as-text file)))) | |
|
313 | (document.body.append-child element) | |
|
314 | (element.click) | |
|
315 | (document.body.remove-child element))) | |
|
316 | ||
|
317 | (defm (root lib savegame) (&optional filename) | |
|
318 | (let ((element (document.create-element :a))) | |
|
319 | (element.set-attribute :href (+ "data:text/plain;charset=utf-8," (api-call state-to-base64))) | |
|
320 | (element.set-attribute :download "savegame.sav") | |
|
321 | (setf element.style.display :none) | |
|
322 | (document.body.append-child element) | |
|
323 | (element.click) | |
|
324 | (document.body.remove-child element))) |
@@ -24,12 +24,9 b'' | |||
|
24 | 24 | ;; Launch the game from the first location |
|
25 | 25 | (setf window.onload |
|
26 | 26 | (lambda () |
|
27 | (api-call init-dom) | |
|
27 | 28 | (funcall (ps:getprop (root locs) |
|
28 | 29 | (ps:chain *object (keys (root locs)) 0)) |
|
29 | 30 | (list)) |
|
30 | 31 | (values))) |
|
31 | 32 | |
|
32 | ;; Close the dropdown on any click | |
|
33 | (setf window.onclick | |
|
34 | (lambda (event) | |
|
35 | (setf (ps:@ (api-call get-frame :dropdown) style display) "none"))) |
General Comments 0
You need to be logged in to leave comments.
Login now