Show More
@@ -10,10 +10,14 b'' | |||||
10 | <div id="qsp-objs" class="qsp-frame"> </div> |
|
10 | <div id="qsp-objs" class="qsp-frame"> </div> | |
11 | </div> |
|
11 | </div> | |
12 | <div class="qsp-col qsp-col3"> |
|
12 | <div class="qsp-col qsp-col3"> | |
13 | <a href="javascript:SugarQSP.lib.savegame()"><img id="qsp-btn-save"></a> |
|
13 | <a id="qsp-btn-save"><img></a> | |
14 | <a href="javascript:SugarQSP.lib.opengame()"><img id="qsp-btn-load"></a> |
|
14 | <a id="qsp-btn-open"><img></a> | |
15 | </div> |
|
15 | </div> | |
16 | </div> |
|
16 | </div> | |
17 |
|
17 | |||
18 | <div id="qsp-dropdown"> |
|
18 | <div id="qsp-dropdown"> | |
19 | </div> |
|
19 | </div> | |
|
20 | ||||
|
21 | <div id="qsp-image-container"> | |||
|
22 | <img id="qsp-image"> | |||
|
23 | </div> |
@@ -94,10 +94,21 b'' | |||||
94 | height: 50px; |
|
94 | height: 50px; | |
95 | } |
|
95 | } | |
96 |
|
96 | |||
97 | #qsp-btn-save { |
|
97 | #qsp-btn-save img { | |
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=='); |
|
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 | 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'); |
|
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 | title |
|
21 | title | |
22 | "</a>")) |
|
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 | ;; To be used in saving game |
|
40 | ;; To be used in saving game | |
25 | (defm (root api stash-state) (args) |
|
41 | (defm (root api stash-state) (args) | |
26 | (setf (root state-stash) |
|
42 | (setf (root state-stash) | |
@@ -285,3 +301,48 b'' | |||||
285 | :do (when (ps:@ v ended) |
|
301 | :do (when (ps:@ v ended) | |
286 | (ps:delete (ps:@ (root playing) k))))) |
|
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 | ;;; 18img |
|
138 | ;;; 18img | |
139 |
|
139 | |||
|
140 | (ps:defpsmacro view (&optional path) | |||
|
141 | `(api-call show-image ,path)) | |||
|
142 | ||||
140 | ;;; 19input |
|
143 | ;;; 19input | |
141 |
|
144 | |||
142 | ;;; 20time |
|
145 | ;;; 20time | |
@@ -148,3 +151,15 b'' | |||||
148 | (api-call new-local ,(string (second var))) |
|
151 | (api-call new-local ,(string (second var))) | |
149 | ,@(when expr |
|
152 | ,@(when expr | |
150 | `((set ,var ,expr))))) |
|
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 | ;;; 18img |
|
251 | ;;; 18img | |
252 |
|
252 | |||
253 |
(defm (root lib refint) () |
|
253 | (defm (root lib refint) () | |
254 |
|
254 | ;; "Force interface update" Uh... what exactly do we do here? | ||
255 | (defm (root lib view) ()) |
|
255 | ) | |
256 |
|
256 | |||
257 | ;;; 19input |
|
257 | ;;; 19input | |
258 |
|
258 | |||
@@ -278,6 +278,8 b'' | |||||
278 |
|
278 | |||
279 | ;;; 21local |
|
279 | ;;; 21local | |
280 |
|
280 | |||
|
281 | ;;; 22for | |||
|
282 | ||||
281 | ;;; misc |
|
283 | ;;; misc | |
282 |
|
284 | |||
283 | (defm (root lib rgb) ()) |
|
285 | (defm (root lib rgb) ()) | |
@@ -288,37 +290,3 b'' | |||||
288 |
|
290 | |||
289 | (defm (root lib killqst) ()) |
|
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 | ;; Launch the game from the first location |
|
24 | ;; Launch the game from the first location | |
25 | (setf window.onload |
|
25 | (setf window.onload | |
26 | (lambda () |
|
26 | (lambda () | |
|
27 | (api-call init-dom) | |||
27 | (funcall (ps:getprop (root locs) |
|
28 | (funcall (ps:getprop (root locs) | |
28 | (ps:chain *object (keys (root locs)) 0)) |
|
29 | (ps:chain *object (keys (root locs)) 0)) | |
29 | (list)) |
|
30 | (list)) | |
30 | (values))) |
|
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