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