Show More
@@ -9,6 +9,10 b'' | |||||
9 | <div id="qsp-stat" class="qsp-frame"> </div> |
|
9 | <div id="qsp-stat" class="qsp-frame"> </div> | |
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"> | |||
|
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> | |||
|
15 | </div> | |||
12 | </div> |
|
16 | </div> | |
13 |
|
17 | |||
14 | <div id="qsp-dropdown"> |
|
18 | <div id="qsp-dropdown"> |
@@ -29,6 +29,10 b'' | |||||
29 | flex: 3 3 30px; |
|
29 | flex: 3 3 30px; | |
30 | } |
|
30 | } | |
31 |
|
31 | |||
|
32 | .qsp-col3 { | |||
|
33 | flex: 0 0 40px; | |||
|
34 | } | |||
|
35 | ||||
32 | #qsp-main { |
|
36 | #qsp-main { | |
33 | flex: 6 6 60px; |
|
37 | flex: 6 6 60px; | |
34 | } |
|
38 | } | |
@@ -58,7 +62,7 b'' | |||||
58 | outline: #9E9E9E outset 3px |
|
62 | outline: #9E9E9E outset 3px | |
59 | } |
|
63 | } | |
60 |
|
64 | |||
61 |
/ |
|
65 | /* Dropdown */ | |
62 |
|
66 | |||
63 | #qsp-dropdown { |
|
67 | #qsp-dropdown { | |
64 | display: none; |
|
68 | display: none; | |
@@ -82,3 +86,18 b'' | |||||
82 | #qsp-dropdown a:hover { |
|
86 | #qsp-dropdown a:hover { | |
83 | background-color: #ddd; |
|
87 | background-color: #ddd; | |
84 | } |
|
88 | } | |
|
89 | ||||
|
90 | /* Buttons */ | |||
|
91 | ||||
|
92 | .qsp-col3 a, .qsp-col3 img { | |||
|
93 | width: 50px; | |||
|
94 | height: 50px; | |||
|
95 | } | |||
|
96 | ||||
|
97 | #qsp-btn-save { | |||
|
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 | } | |||
|
100 | ||||
|
101 | #qsp-btn-load { | |||
|
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 | } |
@@ -36,6 +36,8 b'' | |||||
36 | (defm (root api base64-to-state) (data) |
|
36 | (defm (root api base64-to-state) (data) | |
37 | (setf (root state-stash) (decode-u-r-i-component (atob data))) |
|
37 | (setf (root state-stash) (decode-u-r-i-component (atob data))) | |
38 | (let ((data (*j-s-o-n.parse (root state-stash)))) |
|
38 | (let ((data (*j-s-o-n.parse (root state-stash)))) | |
|
39 | (api-call clear-id :qsp-main) | |||
|
40 | (api-call clear-id :qsp-stat) | |||
39 | (api-call clear-act) |
|
41 | (api-call clear-act) | |
40 | (setf (root vars) (ps:@ data vars)) |
|
42 | (setf (root vars) (ps:@ data vars)) | |
41 | (setf (root objs) (ps:@ data objs)) |
|
43 | (setf (root objs) (ps:@ data objs)) | |
@@ -198,3 +200,11 b'' | |||||
198 | :do (incf i) |
|
200 | :do (incf i) | |
199 | :do (incf elt.inner-h-t-m-l (api-call make-menu-item-html i item.text item.icon item.loc))) |
|
201 | :do (incf elt.inner-h-t-m-l (api-call make-menu-item-html i item.text item.icon item.loc))) | |
200 | (setf elt.style.display "block"))) |
|
202 | (setf elt.style.display "block"))) | |
|
203 | ||||
|
204 | ;;; Content | |||
|
205 | ||||
|
206 | (defm (root api clean-audio) () | |||
|
207 | (loop :for k :in (*object.keys (root playing)) | |||
|
208 | :for v := (ps:getprop (root playing) k) | |||
|
209 | :do (when (ps:@ v ended) | |||
|
210 | (ps:delete (ps:@ (root playing) k))))) |
@@ -128,6 +128,9 b'' | |||||
128 |
|
128 | |||
129 | ;;; 17sound |
|
129 | ;;; 17sound | |
130 |
|
130 | |||
|
131 | (ps:defpsmacro isplay (filename) | |||
|
132 | `(funcall (root playing includes) ,filename)) | |||
|
133 | ||||
131 | ;;; 18img |
|
134 | ;;; 18img | |
132 |
|
135 | |||
133 | ;;; 19input |
|
136 | ;;; 19input |
@@ -197,13 +197,13 b'' | |||||
197 | (defm (root lib delobj) (name) |
|
197 | (defm (root lib delobj) (name) | |
198 | (let ((index (ps:chain (root objs) (index-of name)))) |
|
198 | (let ((index (ps:chain (root objs) (index-of name)))) | |
199 | (when (> index -1) |
|
199 | (when (> index -1) | |
200 | (funcall (root lib killobj) index))) |
|
200 | (funcall (root lib killobj) (1+ index)))) | |
201 | (values)) |
|
201 | (values)) | |
202 |
|
202 | |||
203 | (defm (root lib killobj) (&optional num) |
|
203 | (defm (root lib killobj) (&optional (num nil)) | |
204 | (if num |
|
204 | (if (eq nil num) | |
205 |
( |
|
205 | (setf (root objs) (list)) | |
206 |
( |
|
206 | (ps:chain (root objs) (splice (1- num) 1))) | |
207 | (api-call update-objs) |
|
207 | (api-call update-objs) | |
208 | (values)) |
|
208 | (values)) | |
209 |
|
209 | |||
@@ -232,13 +232,21 b'' | |||||
232 |
|
232 | |||
233 | ;;; 17sound |
|
233 | ;;; 17sound | |
234 |
|
234 | |||
235 | (defm (root lib play) ()) |
|
235 | (defm (root lib play) (filename &optional (volume 100)) | |
236 |
|
236 | (let ((audio (ps:new (*audio filename)))) | ||
237 | (defm (root lib isplay) ()) |
|
237 | (setf (ps:getprop (root playing) filename) audio) | |
|
238 | (setf (ps:@ audio volume) (* volume 0.01)) | |||
|
239 | (ps:chain audio (play)))) | |||
238 |
|
240 | |||
239 |
(defm (root lib close) ( |
|
241 | (defm (root lib close) (filename) | |
|
242 | (funcall (root playing filename) stop) | |||
|
243 | (ps:delete (root playing filename))) | |||
240 |
|
244 | |||
241 |
(defm (root lib closeall) () |
|
245 | (defm (root lib closeall) () | |
|
246 | (loop :for k :in (*object.keys (root playing)) | |||
|
247 | :for v := (ps:getprop (root playing) k) | |||
|
248 | :do (funcall v stop)) | |||
|
249 | (setf (root playing) (ps:create))) | |||
242 |
|
250 | |||
243 | ;;; 18img |
|
251 | ;;; 18img | |
244 |
|
252 |
@@ -2,11 +2,22 b'' | |||||
2 | (in-package sugar-qsp) |
|
2 | (in-package sugar-qsp) | |
3 |
|
3 | |||
4 | (setf (root) |
|
4 | (setf (root) | |
5 |
( |
|
5 | (ps:create | |
6 | objs (list) |
|
6 | ;;; Game session state | |
7 | state-stash (ps:create) |
|
7 | ;; Variables | |
8 |
|
|
8 | vars (ps:create) | |
9 | locs (ps:create))) |
|
9 | ;; Inventory (objects) | |
|
10 | objs (list) | |||
|
11 | ;;; Transient state | |||
|
12 | ;; Savegame data | |||
|
13 | state-stash (ps:create) | |||
|
14 | ;; List of audio files being played | |||
|
15 | playing (ps:create) | |||
|
16 | ;;; Game data | |||
|
17 | ;; ACTions | |||
|
18 | acts (ps:create) | |||
|
19 | ;; Locations | |||
|
20 | locs (ps:create))) | |||
10 |
|
21 | |||
11 | ;; Launch the game from the first location |
|
22 | ;; Launch the game from the first location | |
12 | (setf window.onload |
|
23 | (setf window.onload |
General Comments 0
You need to be logged in to leave comments.
Login now