diff --git a/TODO b/TODO
--- a/TODO
+++ b/TODO
@@ -1,5 +1,6 @@
* Windows GUI
+* Save-load game
* Resizable frames
* Build Istreblenie
** modifying it to suit compiler specifics
diff --git a/extras/body.html b/extras/body.html
--- a/extras/body.html
+++ b/extras/body.html
@@ -1,7 +1,12 @@
diff --git a/extras/default.css b/extras/default.css
--- a/extras/default.css
+++ b/extras/default.css
@@ -2,45 +2,50 @@
.qsp-frame {
border: 1px solid black;
overflow: auto;
- position: absolute;
padding: 5px;
box-sizing: border-box;
}
#qsp {
- position: fixed;
+ position: absolute;
+ display: flex;
+ flex-flow: row;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
+.qsp-col {
+ display: flex;
+ flex-flow: column;
+}
+
+.qsp-col1 {
+ flex: 7 7 70px;
+}
+
+.qsp-col2 {
+ flex: 3 3 30px;
+}
+
#qsp-main {
- height: 60%;
- width: 70%;
- top: 0;
- left: 0;
+ flex: 6 6 60px;
}
#qsp-acts {
- height: 40%;
- width: 70%;
- bottom: 0;
- left: 0;
+ flex: 4 4 40px;
+}
+
+#qsp-input {
}
#qsp-stat {
- height: 50%;
- width: 30%;
- top: 0;
- right: 0;
+ flex: 5 5 50px;
}
#qsp-objs {
- height: 50%;
- width: 30%;
- bottom: 0;
- right: 0;
+ flex: 5 5 50px;
}
.qsp-act {
diff --git a/src/api.ps b/src/api.ps
--- a/src/api.ps
+++ b/src/api.ps
@@ -15,10 +15,13 @@
title
""))
-;;; Startup
-
-(defm (root api init-dom) ()
- )
+;; To be used in saving game
+(defm (root api stash-state) ()
+ (setf (root state-stash)
+ (ps:create vars (root vars)
+ objs (root objs)
+ next-location (root current-location)))
+ (values))
;;; Misc
diff --git a/src/intrinsics.ps b/src/intrinsics.ps
--- a/src/intrinsics.ps
+++ b/src/intrinsics.ps
@@ -17,6 +17,7 @@
(api-call clear-act)
(api-call init-args args)
(setf (root current-location) target)
+ (api-call stash-state)
(funcall (ps:getprop (root locations) (ps:chain target (to-upper-case)))))
;;; 2var
@@ -145,13 +146,13 @@
;;; 8sub
(defm (root lib gosub) (target &rest args)
- (conserving-vars (args $args result $result)
+ (conserving-vars (args result)
(api-call init-args args)
(funcall (ps:getprop (root locations) target))
(values)))
(defm (root lib func) (target &rest args)
- (conserving-vars (args $args result $result)
+ (conserving-vars (args result)
(api-call init-args args)
(funcall (ps:getprop (root locations) target))
(api-call get-result)))
@@ -161,13 +162,13 @@
;;; 10dynamic
(defm (root lib dyneval) (block &rest args)
- (conserving-vars (args $args result $result)
+ (conserving-vars (args result)
(api-call init-args args)
(funcall block)
(api-call get-result)))
(defm (root lib dynamic) (&rest args)
- (conserving-vars (args $args result $result)
+ (conserving-vars (args result)
(api-call init-args args)
(funcall block)
(values)))
@@ -189,7 +190,7 @@
(api-call get-text :main))
(defm (root lib desc) (s)
- (api-call report-error "DESC is not supported"))
+ "")
(defm (root lib main-clear) ()
(api-call clear-text :main))
diff --git a/src/main.ps b/src/main.ps
--- a/src/main.ps
+++ b/src/main.ps
@@ -4,12 +4,12 @@
(setf (root)
(ps:create vars (ps:create)
objs (list)
+ state-stash (ps:create)
acts (ps:create)
locations (ps:create)))
(setf window.onload
(lambda ()
- (api-call init-dom)
(funcall (ps:getprop (root locations)
(ps:chain *object (keys (root locations)) 0)))
(values)))
diff --git a/src/ps-macros.lisp b/src/ps-macros.lisp
--- a/src/ps-macros.lisp
+++ b/src/ps-macros.lisp
@@ -17,18 +17,17 @@
`(ps:chain ,obj (has-own-property ,key)))
(ps:defpsmacro conserving-vars (vars &body body)
- "Calls body with safely stored away VARS, and restores their values after that returning what BODY returns."
+ "Calls body with safely stored away VARS (whole arrays, both namespaces), and restores their values after that returning what BODY returns."
`(let ((__conserved (list ,@(loop :for var :in vars
- :collect `(var ,var 0)))))
+ :collect `(root vars ,var)))))
,@(loop :for var :in vars
- :collect `(set (var ,var 0) ,(if (char= #\$ (elt (string var) 0))
- "" 0)))
+ :collect `(setf (root vars ,var) (ps:create :num 0 :str "")))
(unwind-protect
(progn ,@body)
(progn
,@(loop :for var :in vars
- :for i from 0
- :collect `(set (var ,var 0) (ps:@ __conserved ,i)))))))
+ :for i from 0
+ :collect `(setf (root vars ,var) (ps:@ __conserved ,i)))))))
;;; Common