Show More
@@ -1,8 +1,9 b'' | |||
|
1 | 1 | |
|
2 | 2 | * Windows GUI |
|
3 | * Save-load game | |
|
3 | 4 | * Resizable frames |
|
4 | 5 | * Build Istreblenie |
|
5 | 6 | ** modifying it to suit compiler specifics |
|
6 | 7 | ** Implementing apis and intrinsics as needed |
|
7 | 8 | |
|
8 | 9 | * Use real characters in cl-uglify-js No newline at end of file |
@@ -1,7 +1,12 b'' | |||
|
1 | 1 | |
|
2 | 2 | <div id="qsp"> |
|
3 | <div id="qsp-main" class="qsp-frame"> </div> | |
|
4 |
<div id="qsp- |
|
|
5 |
<div id="qsp- |
|
|
6 |
< |
|
|
3 | <div class="qsp-col qsp-col1"> | |
|
4 | <div id="qsp-main" class="qsp-frame"> </div> | |
|
5 | <div id="qsp-acts" class="qsp-frame"> </div> | |
|
6 | <input id="qsp-input" class="qsp-frame"> | |
|
7 | </div> | |
|
8 | <div class="qsp-col qsp-col2"> | |
|
9 | <div id="qsp-stat" class="qsp-frame"> </div> | |
|
10 | <div id="qsp-objs" class="qsp-frame"> </div> | |
|
11 | </div> | |
|
7 | 12 | </div> |
@@ -1,54 +1,59 b'' | |||
|
1 | 1 | |
|
2 | 2 | .qsp-frame { |
|
3 | 3 | border: 1px solid black; |
|
4 | 4 | overflow: auto; |
|
5 | position: absolute; | |
|
6 | 5 | padding: 5px; |
|
7 | 6 | box-sizing: border-box; |
|
8 | 7 | } |
|
9 | 8 | |
|
10 | 9 | #qsp { |
|
11 |
position: |
|
|
10 | position: absolute; | |
|
11 | display: flex; | |
|
12 | flex-flow: row; | |
|
12 | 13 | top: 0; |
|
13 | 14 | left: 0; |
|
14 | 15 | width: 100%; |
|
15 | 16 | height: 100%; |
|
16 | 17 | } |
|
17 | 18 | |
|
19 | .qsp-col { | |
|
20 | display: flex; | |
|
21 | flex-flow: column; | |
|
22 | } | |
|
23 | ||
|
24 | .qsp-col1 { | |
|
25 | flex: 7 7 70px; | |
|
26 | } | |
|
27 | ||
|
28 | .qsp-col2 { | |
|
29 | flex: 3 3 30px; | |
|
30 | } | |
|
31 | ||
|
18 | 32 | #qsp-main { |
|
19 | height: 60%; | |
|
20 | width: 70%; | |
|
21 | top: 0; | |
|
22 | left: 0; | |
|
33 | flex: 6 6 60px; | |
|
23 | 34 | } |
|
24 | 35 | |
|
25 | 36 | #qsp-acts { |
|
26 | height: 40%; | |
|
27 | width: 70%; | |
|
28 | bottom: 0; | |
|
29 | left: 0; | |
|
37 | flex: 4 4 40px; | |
|
38 | } | |
|
39 | ||
|
40 | #qsp-input { | |
|
30 | 41 | } |
|
31 | 42 | |
|
32 | 43 | #qsp-stat { |
|
33 | height: 50%; | |
|
34 | width: 30%; | |
|
35 | top: 0; | |
|
36 | right: 0; | |
|
44 | flex: 5 5 50px; | |
|
37 | 45 | } |
|
38 | 46 | |
|
39 | 47 | #qsp-objs { |
|
40 | height: 50%; | |
|
41 | width: 30%; | |
|
42 | bottom: 0; | |
|
43 | right: 0; | |
|
48 | flex: 5 5 50px; | |
|
44 | 49 | } |
|
45 | 50 | |
|
46 | 51 | .qsp-act { |
|
47 | 52 | display: block; |
|
48 | 53 | padding: 2px; |
|
49 | 54 | font-size: large; |
|
50 | 55 | } |
|
51 | 56 | |
|
52 | 57 | .qsp-act:hover { |
|
53 | 58 | outline: #9E9E9E outset 3px |
|
54 | 59 | } |
@@ -1,147 +1,150 b'' | |||
|
1 | 1 | |
|
2 | 2 | (in-package sugar-qsp) |
|
3 | 3 | |
|
4 | 4 | ;;; API deals with DOM manipulation and some bookkeeping for the |
|
5 | 5 | ;;; intrinsics, namely variables |
|
6 | 6 | ;;; API is an implementation detail and has no QSP documentation. It |
|
7 | 7 | ;;; doesn't call intrinsics |
|
8 | 8 | |
|
9 | 9 | (setf (root api) (ps:create)) |
|
10 | 10 | |
|
11 | 11 | ;;; Utils |
|
12 | 12 | |
|
13 | 13 | (defm (root api make-act-html) (title img) |
|
14 | 14 | (+ "<a class='qsp-act' href='#' onclick='SugarQSP.acts[\"" title "\"].act();'>" |
|
15 | 15 | title |
|
16 | 16 | "</a>")) |
|
17 | 17 | |
|
18 | ;;; Startup | |
|
19 | ||
|
20 | (defm (root api init-dom) () | |
|
21 | ) | |
|
18 | ;; To be used in saving game | |
|
19 | (defm (root api stash-state) () | |
|
20 | (setf (root state-stash) | |
|
21 | (ps:create vars (root vars) | |
|
22 | objs (root objs) | |
|
23 | next-location (root current-location))) | |
|
24 | (values)) | |
|
22 | 25 | |
|
23 | 26 | ;;; Misc |
|
24 | 27 | |
|
25 | 28 | (defm (root api clear-id) (id) |
|
26 | 29 | (setf (ps:chain document (get-element-by-id id) inner-text) "")) |
|
27 | 30 | |
|
28 | 31 | (defm (root api get-id) (id) |
|
29 | 32 | (if (var "USEHTML" 0) |
|
30 | 33 | (ps:chain (document.get-element-by-id id) inner-h-t-m-l) |
|
31 | 34 | (ps:chain (document.get-element-by-id id) inner-text))) |
|
32 | 35 | |
|
33 | 36 | (defm (root api set-id) (id contents) |
|
34 | 37 | (if (var "USEHTML" 0) |
|
35 | 38 | (setf (ps:chain (document.get-element-by-id id) inner-h-t-m-l) contents) |
|
36 | 39 | (setf (ps:chain (document.get-element-by-id id) inner-text) contents))) |
|
37 | 40 | |
|
38 | 41 | (defm (root api append-id) (id contents) |
|
39 | 42 | (if (var "USEHTML" 0) |
|
40 | 43 | (incf (ps:chain (document.get-element-by-id id) inner-h-t-m-l) contents) |
|
41 | 44 | (incf (ps:chain (document.get-element-by-id id) inner-text) contents))) |
|
42 | 45 | |
|
43 | 46 | ;;; Function calls |
|
44 | 47 | |
|
45 | 48 | (defm (root api init-args) (args) |
|
46 | 49 | (dotimes (i (length args)) |
|
47 | 50 | (if (numberp (elt args i)) |
|
48 | 51 | (set (var args i) (elt args i)) |
|
49 | 52 | (set (var $args i) (elt args i))))) |
|
50 | 53 | |
|
51 | 54 | (defm (root api get-result) () |
|
52 | 55 | (if (not (equal "" (var $result 0))) |
|
53 | 56 | (var $result 0) |
|
54 | 57 | (var result 0))) |
|
55 | 58 | |
|
56 | 59 | ;;; Text windows |
|
57 | 60 | |
|
58 | 61 | (defm (root api key-to-id) (key) |
|
59 | 62 | (case key |
|
60 | 63 | (:main "qsp-main") |
|
61 | 64 | (:stat "qsp-stat") |
|
62 | 65 | (t (report-error "Internal error!")))) |
|
63 | 66 | |
|
64 | 67 | (defm (root api add-text) (key text) |
|
65 | 68 | (api-call append-id (api-call key-to-id key) text)) |
|
66 | 69 | |
|
67 | 70 | (defm (root api get-text) (key) |
|
68 | 71 | (api-call get-id (api-call key-to-id key))) |
|
69 | 72 | |
|
70 | 73 | (defm (root api clear-text) (key) |
|
71 | 74 | (api-call clear-id (api-call key-to-id key))) |
|
72 | 75 | |
|
73 | 76 | (defm (root api newline) (key) |
|
74 | 77 | (let ((div (document.get-element-by-id |
|
75 | 78 | (api-call key-to-id key)))) |
|
76 | 79 | (ps:chain div (append-child (document.create-element "br"))))) |
|
77 | 80 | |
|
78 | 81 | ;;; Actions |
|
79 | 82 | |
|
80 | 83 | (defm (root api add-act) (title img act) |
|
81 | 84 | (setf (ps:getprop (root acts) title) |
|
82 | 85 | (ps:create :img img :act act))) |
|
83 | 86 | |
|
84 | 87 | (defm (root api del-act) (title) |
|
85 | 88 | (delete (ps:getprop (root acts) title)) |
|
86 | 89 | (api-call update-acts)) |
|
87 | 90 | |
|
88 | 91 | (defm (root api clear-act) () |
|
89 | 92 | (setf (root acts) (ps:create)) |
|
90 | 93 | (api-call clear-id "qsp-acts")) |
|
91 | 94 | |
|
92 | 95 | (defm (root api update-acts) () |
|
93 | 96 | (api-call clear-id "qsp-acts") |
|
94 | 97 | (ps:for-in (title (root acts)) |
|
95 | 98 | (let ((obj (ps:getprop (root acts) title))) |
|
96 | 99 | (api-call append-id "qsp-acts" |
|
97 | 100 | (api-call make-act-html title (ps:getprop obj :img)))))) |
|
98 | 101 | |
|
99 | 102 | ;;; Variables |
|
100 | 103 | |
|
101 | 104 | (defm (root api var-slot) (name) |
|
102 | 105 | (if (= (ps:@ name 0) #\$) |
|
103 | 106 | :str |
|
104 | 107 | :num)) |
|
105 | 108 | |
|
106 | 109 | (defm (root api var-real-name) (name) |
|
107 | 110 | (if (= (ps:@ name 0) #\$) |
|
108 | 111 | (ps:chain name (substr 1)) |
|
109 | 112 | name)) |
|
110 | 113 | |
|
111 | 114 | (defm (root api ensure-var) (name index) |
|
112 | 115 | (unless (in name (root vars)) |
|
113 | 116 | (setf (ps:getprop (root vars) name) |
|
114 | 117 | (ps:create))) |
|
115 | 118 | (unless (in index (ps:getprop (root vars) name)) |
|
116 | 119 | (setf (ps:getprop (root vars) name index) |
|
117 | 120 | (ps:create :num 0 :str ""))) |
|
118 | 121 | (values)) |
|
119 | 122 | |
|
120 | 123 | (defm (root api get-var) (name index) |
|
121 | 124 | (let ((var-name (api-call var-real-name name))) |
|
122 | 125 | (api-call ensure-var var-name index) |
|
123 | 126 | (ps:getprop (root vars) var-name index |
|
124 | 127 | (api-call var-slot name)))) |
|
125 | 128 | |
|
126 | 129 | (defm (root api set-var) (name index value) |
|
127 | 130 | (let ((var-name (api-call var-real-name name))) |
|
128 | 131 | (api-call ensure-var var-name index) |
|
129 | 132 | (setf (ps:getprop (root vars) var-name index |
|
130 | 133 | (api-call var-slot name)) |
|
131 | 134 | value) |
|
132 | 135 | (values))) |
|
133 | 136 | |
|
134 | 137 | (defm (root api kill-var) (name index) |
|
135 | 138 | (if (eq index :whole) |
|
136 | 139 | (ps:delete (ps:getprop (root vars) name)) |
|
137 | 140 | (ps:delete (ps:getprop (root vars) name index))) |
|
138 | 141 | (values)) |
|
139 | 142 | |
|
140 | 143 | ;;; Objects |
|
141 | 144 | |
|
142 | 145 | (defm (root api update-objs) () |
|
143 | 146 | (let ((elt (document.get-element-by-id "qsp-objs"))) |
|
144 | 147 | (setf elt.inner-h-t-m-l "<ul>") |
|
145 | 148 | (loop :for obj :in (root objs) |
|
146 | 149 | :do (incf elt.inner-h-t-m-l (+ "<li>" obj))) |
|
147 | 150 | (incf elt.inner-h-t-m-l "</ul>"))) |
@@ -1,298 +1,299 b'' | |||
|
1 | 1 | |
|
2 | 2 | (in-package sugar-qsp) |
|
3 | 3 | |
|
4 | 4 | ;;;; Functions and procedures defined by the QSP language. |
|
5 | 5 | ;;;; They can call api and deal with locations and other data directly. |
|
6 | 6 | ;;;; Except vars. Use VAR and SET or GET-VAR and SET-VAR api calls. |
|
7 | 7 | |
|
8 | 8 | (setf (root lib) (ps:create)) |
|
9 | 9 | |
|
10 | 10 | ;;; 1loc |
|
11 | 11 | |
|
12 | 12 | (defm (root lib goto) (target &rest args) |
|
13 | 13 | (api-call clear-text :main) |
|
14 | 14 | (apply (root lib xgoto) target args)) |
|
15 | 15 | |
|
16 | 16 | (defm (root lib xgoto) (target &rest args) |
|
17 | 17 | (api-call clear-act) |
|
18 | 18 | (api-call init-args args) |
|
19 | 19 | (setf (root current-location) target) |
|
20 | (api-call stash-state) | |
|
20 | 21 | (funcall (ps:getprop (root locations) (ps:chain target (to-upper-case))))) |
|
21 | 22 | |
|
22 | 23 | ;;; 2var |
|
23 | 24 | |
|
24 | 25 | (defm (root lib killvar) (varname &optional (index :whole)) |
|
25 | 26 | (api-call kill-var varname index)) |
|
26 | 27 | |
|
27 | 28 | (defm (root lib killall) () |
|
28 | 29 | (api-call kill-all)) |
|
29 | 30 | |
|
30 | 31 | ;;; 3expr |
|
31 | 32 | |
|
32 | 33 | (defm (root lib obj) (name) |
|
33 | 34 | (funcall (root objs includes) name)) |
|
34 | 35 | |
|
35 | 36 | (defm (root lib loc) () |
|
36 | 37 | (funcall (root locations includes) name)) |
|
37 | 38 | |
|
38 | 39 | (defm (root lib no) (arg) |
|
39 | 40 | (- -1 arg)) |
|
40 | 41 | |
|
41 | 42 | ;;; 4code |
|
42 | 43 | |
|
43 | 44 | (defm (root lib qspver) () |
|
44 | 45 | "0.0.1") |
|
45 | 46 | |
|
46 | 47 | (defm (root lib curloc) () |
|
47 | 48 | (root current-location)) |
|
48 | 49 | |
|
49 | 50 | (defm (root lib rand) (a b) |
|
50 | 51 | (let ((min (min a b)) |
|
51 | 52 | (max (max a b))) |
|
52 | 53 | (+ min (ps:chain *math (random (- max min)))))) |
|
53 | 54 | |
|
54 | 55 | (defm (root lib rnd) () |
|
55 | 56 | (funcall (root lib rand) 1 1000)) |
|
56 | 57 | |
|
57 | 58 | (defm (root lib qspmax) (&rest args) |
|
58 | 59 | (apply (ps:@ *math max) args)) |
|
59 | 60 | |
|
60 | 61 | (defm (root lib qspmin) (&rest args) |
|
61 | 62 | (apply (ps:@ *math min) args)) |
|
62 | 63 | |
|
63 | 64 | ;;; 5arrays |
|
64 | 65 | |
|
65 | 66 | (defm (root lib copyarr) (to from start count) |
|
66 | 67 | (ps:for ((i start)) |
|
67 | 68 | ((< i (min (api-call array-size from) |
|
68 | 69 | (+ start count)))) |
|
69 | 70 | ((incf i)) |
|
70 | 71 | (api-call set-var to (+ start i) |
|
71 | 72 | (api-call get-var from (+ start i))))) |
|
72 | 73 | |
|
73 | 74 | (defm (root lib arrsize) (name) |
|
74 | 75 | (api-call array-size name)) |
|
75 | 76 | |
|
76 | 77 | (defm (root lib arrpos) (name value &optional (start 0)) |
|
77 | 78 | (ps:for ((i start)) ((< i (api-call array-size name))) ((incf i)) |
|
78 | 79 | (when (eq (api-call get-var name i) value) |
|
79 | 80 | (return i))) |
|
80 | 81 | -1) |
|
81 | 82 | |
|
82 | 83 | (defm (root lib arrcomp) (name pattern &optional (start 0)) |
|
83 | 84 | (ps:for ((i start)) ((< i (api-call array-size name))) ((incf i)) |
|
84 | 85 | (when (funcall (ps:getprop (api-call get-var name i) 'match) pattern) |
|
85 | 86 | (return i))) |
|
86 | 87 | -1) |
|
87 | 88 | |
|
88 | 89 | ;;; 6str |
|
89 | 90 | |
|
90 | 91 | (defm (root lib len) (s) |
|
91 | 92 | (length s)) |
|
92 | 93 | |
|
93 | 94 | (defm (root lib mid) (s from &optional count) |
|
94 | 95 | (s.substring from count)) |
|
95 | 96 | |
|
96 | 97 | (defm (root lib ucase) (s) |
|
97 | 98 | (s.to-upper-case)) |
|
98 | 99 | |
|
99 | 100 | (defm (root lib lcase) (s) |
|
100 | 101 | (s.to-lower-case)) |
|
101 | 102 | |
|
102 | 103 | (defm (root lib trim) (s) |
|
103 | 104 | (s.trim)) |
|
104 | 105 | |
|
105 | 106 | (defm (root lib replace) (s from to) |
|
106 | 107 | (s.replace from to)) |
|
107 | 108 | |
|
108 | 109 | (defm (root lib instr) (s subs &optional (start 1)) |
|
109 | 110 | (+ start (ps:chain s (substring (- start 1)) (search subs)))) |
|
110 | 111 | |
|
111 | 112 | (defm (root lib isnum) (s) |
|
112 | 113 | (if (is-na-n s) |
|
113 | 114 | 0 |
|
114 | 115 | -1)) |
|
115 | 116 | |
|
116 | 117 | (defm (root lib val) (s) |
|
117 | 118 | (parse-int s 10)) |
|
118 | 119 | |
|
119 | 120 | (defm (root lib qspstr) (n) |
|
120 | 121 | (+ "" n)) |
|
121 | 122 | |
|
122 | 123 | (defm (root lib strcomp) (s pattern) |
|
123 | 124 | (if (s.match pattern) |
|
124 | 125 | -1 |
|
125 | 126 | 0)) |
|
126 | 127 | |
|
127 | 128 | (defm (root lib strfind) (s pattern group) |
|
128 | 129 | (let* ((re (ps:new (*reg-exp pattern))) |
|
129 | 130 | (match (re.exec s))) |
|
130 | 131 | (match.group group))) |
|
131 | 132 | |
|
132 | 133 | (defm (root lib strpos) (s pattern &optional (group 0)) |
|
133 | 134 | (let* ((re (ps:new (*reg-exp pattern))) |
|
134 | 135 | (match (re.exec s)) |
|
135 | 136 | (found (match.group group))) |
|
136 | 137 | (if found |
|
137 | 138 | (s.search found) |
|
138 | 139 | 0))) |
|
139 | 140 | |
|
140 | 141 | ;;; 7if |
|
141 | 142 | |
|
142 | 143 | (defm (root lib iif) (cond-expr then-expr else-expr) |
|
143 | 144 | (if (= -1 cond-expr) then-expr else-expr)) |
|
144 | 145 | |
|
145 | 146 | ;;; 8sub |
|
146 | 147 | |
|
147 | 148 | (defm (root lib gosub) (target &rest args) |
|
148 |
(conserving-vars (args |
|
|
149 | (conserving-vars (args result) | |
|
149 | 150 | (api-call init-args args) |
|
150 | 151 | (funcall (ps:getprop (root locations) target)) |
|
151 | 152 | (values))) |
|
152 | 153 | |
|
153 | 154 | (defm (root lib func) (target &rest args) |
|
154 |
(conserving-vars (args |
|
|
155 | (conserving-vars (args result) | |
|
155 | 156 | (api-call init-args args) |
|
156 | 157 | (funcall (ps:getprop (root locations) target)) |
|
157 | 158 | (api-call get-result))) |
|
158 | 159 | |
|
159 | 160 | ;;; 9loops |
|
160 | 161 | |
|
161 | 162 | ;;; 10dynamic |
|
162 | 163 | |
|
163 | 164 | (defm (root lib dyneval) (block &rest args) |
|
164 |
(conserving-vars (args |
|
|
165 | (conserving-vars (args result) | |
|
165 | 166 | (api-call init-args args) |
|
166 | 167 | (funcall block) |
|
167 | 168 | (api-call get-result))) |
|
168 | 169 | |
|
169 | 170 | (defm (root lib dynamic) (&rest args) |
|
170 |
(conserving-vars (args |
|
|
171 | (conserving-vars (args result) | |
|
171 | 172 | (api-call init-args args) |
|
172 | 173 | (funcall block) |
|
173 | 174 | (values))) |
|
174 | 175 | |
|
175 | 176 | ;;; 11main |
|
176 | 177 | |
|
177 | 178 | (defm (root lib main-p) (s) |
|
178 | 179 | (api-call add-text :main s)) |
|
179 | 180 | |
|
180 | 181 | (defm (root lib main-pl) (s) |
|
181 | 182 | (api-call add-text :main s) |
|
182 | 183 | (api-call newline :main)) |
|
183 | 184 | |
|
184 | 185 | (defm (root lib main-nl) (s) |
|
185 | 186 | (api-call newline :main) |
|
186 | 187 | (api-call add-text :main s)) |
|
187 | 188 | |
|
188 | 189 | (defm (root lib maintxt) (s) |
|
189 | 190 | (api-call get-text :main)) |
|
190 | 191 | |
|
191 | 192 | (defm (root lib desc) (s) |
|
192 | (api-call report-error "DESC is not supported")) | |
|
193 | "") | |
|
193 | 194 | |
|
194 | 195 | (defm (root lib main-clear) () |
|
195 | 196 | (api-call clear-text :main)) |
|
196 | 197 | |
|
197 | 198 | ;;; 12stat |
|
198 | 199 | |
|
199 | 200 | (defm (root lib showstat) ()) |
|
200 | 201 | |
|
201 | 202 | (defm (root lib stat-p) ()) |
|
202 | 203 | |
|
203 | 204 | (defm (root lib stat-pl) ()) |
|
204 | 205 | |
|
205 | 206 | (defm (root lib stat-nl) ()) |
|
206 | 207 | |
|
207 | 208 | (defm (root lib stattxt) ()) |
|
208 | 209 | |
|
209 | 210 | (defm (root lib clear) ()) |
|
210 | 211 | |
|
211 | 212 | (defm (root lib cls) ()) |
|
212 | 213 | |
|
213 | 214 | ;;; 13diag |
|
214 | 215 | |
|
215 | 216 | (defm (root lib msg) ()) |
|
216 | 217 | |
|
217 | 218 | ;;; 14act |
|
218 | 219 | |
|
219 | 220 | (defm (root lib showacts) ()) |
|
220 | 221 | |
|
221 | 222 | (defm (root lib delact) (name) |
|
222 | 223 | (api-call del-act name)) |
|
223 | 224 | |
|
224 | 225 | (defm (root lib curacts) ()) |
|
225 | 226 | |
|
226 | 227 | (defm (root lib cla) ()) |
|
227 | 228 | |
|
228 | 229 | ;;; 15objs |
|
229 | 230 | |
|
230 | 231 | (defm (root lib showobjs) ()) |
|
231 | 232 | |
|
232 | 233 | (defm (root lib addobj) (name) |
|
233 | 234 | (ps:chain (root objs) (push name)) |
|
234 | 235 | (api-call update-objs)) |
|
235 | 236 | |
|
236 | 237 | (defm (root lib delobj) (name) |
|
237 | 238 | (let ((index (ps:chain (root objs) (index-of name)))) |
|
238 | 239 | (when (> index -1) |
|
239 | 240 | (ps:chain (root objs) (splice index 1)))) |
|
240 | 241 | (api-call update-objs)) |
|
241 | 242 | |
|
242 | 243 | (defm (root lib killobj) ()) |
|
243 | 244 | |
|
244 | 245 | (defm (root lib countobj) ()) |
|
245 | 246 | |
|
246 | 247 | (defm (root lib getobj) ()) |
|
247 | 248 | |
|
248 | 249 | ;;; 16menu |
|
249 | 250 | |
|
250 | 251 | (defm (root lib menu) ()) |
|
251 | 252 | |
|
252 | 253 | ;;; 17sound |
|
253 | 254 | |
|
254 | 255 | (defm (root lib play) ()) |
|
255 | 256 | |
|
256 | 257 | (defm (root lib isplay) ()) |
|
257 | 258 | |
|
258 | 259 | (defm (root lib close) ()) |
|
259 | 260 | |
|
260 | 261 | (defm (root lib closeall) ()) |
|
261 | 262 | |
|
262 | 263 | ;;; 18img |
|
263 | 264 | |
|
264 | 265 | (defm (root lib refint) ()) |
|
265 | 266 | |
|
266 | 267 | (defm (root lib view) ()) |
|
267 | 268 | |
|
268 | 269 | ;;; 19input |
|
269 | 270 | |
|
270 | 271 | (defm (root lib showinput) ()) |
|
271 | 272 | |
|
272 | 273 | (defm (root lib usertxt) ()) |
|
273 | 274 | |
|
274 | 275 | (defm (root lib cmdclear) ()) |
|
275 | 276 | |
|
276 | 277 | (defm (root lib input) ()) |
|
277 | 278 | |
|
278 | 279 | ;;; 20time |
|
279 | 280 | |
|
280 | 281 | (defm (root lib wait) ()) |
|
281 | 282 | |
|
282 | 283 | (defm (root lib msecscount) ()) |
|
283 | 284 | |
|
284 | 285 | (defm (root lib settimer) ()) |
|
285 | 286 | |
|
286 | 287 | ;;; misc |
|
287 | 288 | |
|
288 | 289 | (defm (root lib rgb) ()) |
|
289 | 290 | |
|
290 | 291 | (defm (root lib openqst) ()) |
|
291 | 292 | |
|
292 | 293 | (defm (root lib addqst) ()) |
|
293 | 294 | |
|
294 | 295 | (defm (root lib killqst) ()) |
|
295 | 296 | |
|
296 | 297 | (defm (root lib opengame) ()) |
|
297 | 298 | |
|
298 | 299 | (defm (root lib savegame) ()) |
@@ -1,15 +1,15 b'' | |||
|
1 | 1 | |
|
2 | 2 | (in-package sugar-qsp) |
|
3 | 3 | |
|
4 | 4 | (setf (root) |
|
5 | 5 | (ps:create vars (ps:create) |
|
6 | 6 | objs (list) |
|
7 | state-stash (ps:create) | |
|
7 | 8 | acts (ps:create) |
|
8 | 9 | locations (ps:create))) |
|
9 | 10 | |
|
10 | 11 | (setf window.onload |
|
11 | 12 | (lambda () |
|
12 | (api-call init-dom) | |
|
13 | 13 | (funcall (ps:getprop (root locations) |
|
14 | 14 | (ps:chain *object (keys (root locations)) 0))) |
|
15 | 15 | (values))) |
@@ -1,193 +1,192 b'' | |||
|
1 | 1 | |
|
2 | 2 | (in-package sugar-qsp) |
|
3 | 3 | |
|
4 | 4 | ;;;; Parenscript macros which make the parser's intermediate |
|
5 | 5 | ;;;; representation directly compilable by Parenscript |
|
6 | 6 | ;;;; Some utility macros for other .ps sources too. |
|
7 | 7 | |
|
8 | 8 | ;;; Utils |
|
9 | 9 | |
|
10 | 10 | (ps:defpsmacro defm (path args &body body) |
|
11 | 11 | `(setf ,path (lambda ,args ,@body))) |
|
12 | 12 | |
|
13 | 13 | (ps:defpsmacro root (&rest path) |
|
14 | 14 | `(ps:@ *sugar-q-s-p ,@path)) |
|
15 | 15 | |
|
16 | 16 | (ps:defpsmacro in (key obj) |
|
17 | 17 | `(ps:chain ,obj (has-own-property ,key))) |
|
18 | 18 | |
|
19 | 19 | (ps:defpsmacro conserving-vars (vars &body body) |
|
20 | "Calls body with safely stored away VARS, and restores their values after that returning what BODY returns." | |
|
20 | "Calls body with safely stored away VARS (whole arrays, both namespaces), and restores their values after that returning what BODY returns." | |
|
21 | 21 | `(let ((__conserved (list ,@(loop :for var :in vars |
|
22 |
:collect `(var ,var |
|
|
22 | :collect `(root vars ,var))))) | |
|
23 | 23 | ,@(loop :for var :in vars |
|
24 | :collect `(set (var ,var 0) ,(if (char= #\$ (elt (string var) 0)) | |
|
25 | "" 0))) | |
|
24 | :collect `(setf (root vars ,var) (ps:create :num 0 :str ""))) | |
|
26 | 25 | (unwind-protect |
|
27 | 26 | (progn ,@body) |
|
28 | 27 | (progn |
|
29 | 28 | ,@(loop :for var :in vars |
|
30 |
|
|
|
31 |
:collect `(set (var ,var |
|
|
29 | :for i from 0 | |
|
30 | :collect `(setf (root vars ,var) (ps:@ __conserved ,i))))))) | |
|
32 | 31 | |
|
33 | 32 | ;;; Common |
|
34 | 33 | |
|
35 | 34 | (defmacro defpsintrinsic (name) |
|
36 | 35 | `(ps:defpsmacro ,name (&rest args) |
|
37 | 36 | `(funcall (root lib ,',name) |
|
38 | 37 | ,@args))) |
|
39 | 38 | |
|
40 | 39 | (defmacro defpsintrinsics (() &rest names) |
|
41 | 40 | `(progn ,@(loop :for name :in names |
|
42 | 41 | :collect `(defpsintrinsic ,name)))) |
|
43 | 42 | |
|
44 | 43 | (defpsintrinsics () |
|
45 | 44 | killvar obj loc no qspver curloc rand rnd qspmax qspmin killall copyarr arrsize arrpos arrcomp len mid ucase lcase trim replace instr isnum val qspstr strcomp strfind strpos iif gosub func dynamic dyneval main-p main-pl main-nl maintxt main-clear showstat stat-p stat-pl stat-nl stattxt stat-clear cls msg showacts delact curacts cla showobjs addobj delobj killobj countobj getobj menu play isplay close closeall refint view rgb showinput usertxt cmdclear input openqst addqst killqst opengame savegame wait msecscount settimer) |
|
46 | 45 | |
|
47 | 46 | (ps:defpsmacro api-call (func &rest args) |
|
48 | 47 | `(funcall (root api ,func) ,@args)) |
|
49 | 48 | |
|
50 | 49 | (ps:defpsmacro label-block (&body body) |
|
51 | 50 | `(block nil |
|
52 | 51 | ,@(when (some #'keywordp body) |
|
53 | 52 | '((defvar __labels))) |
|
54 | 53 | (tagbody |
|
55 | 54 | ,@body) |
|
56 | 55 | (values))) |
|
57 | 56 | |
|
58 | 57 | (ps:defpsmacro str (&rest forms) |
|
59 | 58 | (cond ((zerop (length forms)) |
|
60 | 59 | "") |
|
61 | 60 | ((and (= 1 (length forms)) |
|
62 | 61 | (stringp (first forms))) |
|
63 | 62 | (first forms)) |
|
64 | 63 | (t |
|
65 | 64 | `(& ,@forms)))) |
|
66 | 65 | |
|
67 | 66 | ;;; 1loc |
|
68 | 67 | |
|
69 | 68 | (ps:defpsmacro location ((name) &body body) |
|
70 | 69 | `(setf (root locations ,name) |
|
71 | 70 | (lambda () |
|
72 | 71 | (label-block |
|
73 | 72 | ,@body |
|
74 | 73 | (api-call update-acts))))) |
|
75 | 74 | |
|
76 | 75 | (ps:defpsmacro goto (target &rest args) |
|
77 | 76 | `(progn |
|
78 | 77 | (funcall (root lib goto) ,target ,@args) |
|
79 | 78 | (exit))) |
|
80 | 79 | |
|
81 | 80 | (ps:defpsmacro xgoto (target &rest args) |
|
82 | 81 | `(progn |
|
83 | 82 | (funcall (root lib xgoto) ,target ,@args) |
|
84 | 83 | (exit))) |
|
85 | 84 | |
|
86 | 85 | (ps:defpsmacro desc (target) |
|
87 | 86 | (declare (ignore target)) |
|
88 | 87 | (report-error "DESC is not supported")) |
|
89 | 88 | |
|
90 | 89 | ;;; 2var |
|
91 | 90 | |
|
92 | 91 | (ps:defpsmacro var (name index) |
|
93 | 92 | `(api-call get-var ,(string name) ,index)) |
|
94 | 93 | |
|
95 | 94 | (ps:defpsmacro set ((var vname vindex) value) |
|
96 | 95 | (assert (eq var 'var)) |
|
97 | 96 | `(api-call set-var ,(string vname) ,vindex ,value)) |
|
98 | 97 | |
|
99 | 98 | ;;; 3expr |
|
100 | 99 | |
|
101 | 100 | (ps:defpsmacro <> (op1 op2) |
|
102 | 101 | `(not (equal ,op1 ,op2))) |
|
103 | 102 | |
|
104 | 103 | (ps:defpsmacro ! (op1 op2) |
|
105 | 104 | `(not (equal ,op1 ,op2))) |
|
106 | 105 | |
|
107 | 106 | ;;; 4code |
|
108 | 107 | |
|
109 | 108 | (ps:defpsmacro exec (&body body) |
|
110 | 109 | (format nil "javascript: ~{~A~^~%~}" (mapcar #'ps:ps* body))) |
|
111 | 110 | |
|
112 | 111 | ;;; 5arrays |
|
113 | 112 | |
|
114 | 113 | ;;; 6str |
|
115 | 114 | |
|
116 | 115 | (ps:defpsmacro & (&rest args) |
|
117 | 116 | `(ps:chain "" (concat ,@args))) |
|
118 | 117 | |
|
119 | 118 | ;;; 7if |
|
120 | 119 | |
|
121 | 120 | (ps:defpsmacro qspcond (&rest clauses) |
|
122 | 121 | `(cond ,@(loop :for clause :in clauses |
|
123 | 122 | :collect (list (first clause) |
|
124 | 123 | `(tagbody ,@(rest clause)))))) |
|
125 | 124 | |
|
126 | 125 | ;;; 8sub |
|
127 | 126 | |
|
128 | 127 | ;;; 9loops |
|
129 | 128 | ;;; Yep, that's a huge kludge since Javascript doesn't support arbitrary labels |
|
130 | 129 | |
|
131 | 130 | (ps:defpsmacro jump (target) |
|
132 | 131 | `(return-from ,(intern (string-upcase (second target))) |
|
133 | 132 | (funcall (ps:getprop __labels ,target)))) |
|
134 | 133 | |
|
135 | 134 | (ps:defpsmacro tagbody (&body body) |
|
136 | 135 | (let ((funcs (list nil :__nil))) |
|
137 | 136 | (dolist (form body) |
|
138 | 137 | (cond ((keywordp form) |
|
139 | 138 | (setf (first funcs) (reverse (first funcs))) |
|
140 | 139 | (push form funcs) |
|
141 | 140 | (push nil funcs)) |
|
142 | 141 | (t |
|
143 | 142 | (push form (first funcs))))) |
|
144 | 143 | (setf (first funcs) (reverse (first funcs))) |
|
145 | 144 | (setf funcs (reverse funcs)) |
|
146 | 145 | (if (= 2 (length funcs)) |
|
147 | 146 | `(progn |
|
148 | 147 | ,@body) |
|
149 | 148 | `(progn |
|
150 | 149 | (setf ,@(loop :for f :on funcs :by #'cddr |
|
151 | 150 | :append (list `(ps:@ __labels ,(first f)) |
|
152 | 151 | `(block ,(intern (string-upcase (string (first f)))) |
|
153 | 152 | ,@(second f) |
|
154 | 153 | ,@(when (third f) |
|
155 | 154 | `((funcall |
|
156 | 155 | (ps:getprop __labels ,(third f))))))))) |
|
157 | 156 | (jump (str "__nil")))))) |
|
158 | 157 | |
|
159 | 158 | (ps:defpsmacro exit () |
|
160 | 159 | `(return-from nil (values))) |
|
161 | 160 | |
|
162 | 161 | ;;; 10dynamic |
|
163 | 162 | |
|
164 | 163 | (ps:defpsmacro qspblock (&body body) |
|
165 | 164 | `(lambda () |
|
166 | 165 | (label-block |
|
167 | 166 | ,@body))) |
|
168 | 167 | |
|
169 | 168 | ;;; 11main |
|
170 | 169 | |
|
171 | 170 | (ps:defpsmacro act (name img &body body) |
|
172 | 171 | `(api-call add-act ,name ,img |
|
173 | 172 | (lambda () |
|
174 | 173 | (label-block |
|
175 | 174 | ,@body)))) |
|
176 | 175 | |
|
177 | 176 | ;;; 12aux |
|
178 | 177 | |
|
179 | 178 | ;;; 13diag |
|
180 | 179 | |
|
181 | 180 | ;;; 14act |
|
182 | 181 | |
|
183 | 182 | ;;; 15objs |
|
184 | 183 | |
|
185 | 184 | ;;; 16menu |
|
186 | 185 | |
|
187 | 186 | ;;; 17sound |
|
188 | 187 | |
|
189 | 188 | ;;; 18img |
|
190 | 189 | |
|
191 | 190 | ;;; 19input |
|
192 | 191 | |
|
193 | 192 | ;;; 20time |
General Comments 0
You need to be logged in to leave comments.
Login now