---
layout: ../Site.layout.js
---
# Common Lisp Hurkle Interface Manager

<img src="../emacshurkle.png">

I got a few from notes from gamedev-of-the-ages [mdhughes](https://mdhughes.tech) about my common lisp class fulfilling Bob Albrecht's Hurkle. So so far I made a common lisp ASDF system, with a package following [my own ASDF introduction](/programming/completely-reasonable-common-lisp-asdf-system-with-eev-demo), with my [common lisp object system class whose methods span Hurkle](../itching-for-hurkles). This article add the McCLIM GUI packages ('actual game') to the aforesaid.

([git link](https://codeberg.org/tfw/hurkle))

As `mdh` says, the interface was basically just a debug interface:

```
CL-USER> (asdf:load-system :hurkle/class)
T
CL-USER> (use-package :hurkle/class)
T
CL-USER> (make-instance 'game-grid :rows 6)
#<GAME-GRID {1003C52283}>
CL-USER> (defparameter *g* *)
*G*
CL-USER> (look-board *g*)
  0  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?
  1  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?
  2  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?
  3  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?
  4  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?
  5  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?
  +  0  1  2  3  4  5  6  7  8  9
NIL  
...
  
CL-USER> (investigate *g* 3 0)
  0  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?
  1  ?  ?  ? SE  ?  ?  ?  ?  ?  ?
  2  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?
  3  E  E  ?  E  ?  ?  E  ?  ?  ?
  4  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?
  5  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?
  +  0  1  2  3  4  5  6  7  8  9
NIL
CL-USER> (investigate *g* 3 7)
  0  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?
  1  ?  ?  ? SE  ?  ?  ?  ?  ?  ?
  2  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?
  3  E  E  ?  E  ?  ?  E SE  ?  ?
  4  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?
  5  ?  ?  ?  ?  ?  ?  ?  ?  ?  ?
  +  0  1  2  3  4  5  6  7  8  9you ran out of time!
NIL
```
Real talk: I got east and west mixed up in my head while playing above. This is the primary difficulty I have experienced Hurkling.

The next step today is to declaratively generate a common lisp interface manager GUI using [jackdaniel](https://turtleware.eu)'s [McCLIM](https://codeberg.org/McCLIM/McCLIM/) implementation of the spec. Aside, CLIM is the modern successor to the lisp machine dynamic-windows engineering and experiments.

## Add the package-inferred file=package mixing the hurkle class and CLIM into it

```
 (eepitch-sbcl)
(with-open-file (*standard-output*
		 #p"~/common-lisp/hurkle/frame.lisp"
		 :direction :output
		 :if-exists :supersede
		 :if-does-not-exist :create)
  (format t "
#|
\ (eepitch-sbcl)
\ (eepitch-kill)
\ (eepitch-sbcl)
|#
(uiop:define-package :hurkle/frame
    (:mix :hurkle/class :clim :clim-lisp :cl)
  (:export #:hurkle-frame
	   #:define-hurkle-frame-command
	   #:display-hurkles))

(in-package :hurkle/frame)
"))
```

# McCommon Lisp Interface Manager Hurkle Frame

```
;;; #P"~/common-lisp/hurkle/frame.lisp" ; continued


(define-application-frame hurkle-frame
    (game-grid standard-application-frame)
  ()
  (:pane :application
   :display-function 'display-hurkles
   :incremental-redisplay t))

(defmethod display-hurkles
    ((obj hurkle-frame)
     pane)
  (with-slots
	(grid)
      obj
    (formatting-table
	()
      (loop :initially (terpri)
	:with count := 0
	:for row :in grid :do
	  (formatting-row
	    ()
	    (loop
	      :initially
		 (formatting-cell () (princ count))
		 (incf count)
	      :for col :in row :do
		(updating-output
		    (pane)
		  (formatting-cell
		      (pane)
		    (present col)))))
	    :finally
	       (formatting-row ()
		 (loop
		   :initially
		      (formatting-cell () (princ "."))
		   :for x
		     :below (length (car grid))
		   :do (formatting-cell () (princ x))))))))
```

Trying it:

```
(asdf:load-system :hurkle/frame)
(use-package :hurkle/frame)
(find-application-frame 'hurkle-frame)
```

(Before I added numbers:)

<img src="../first-blush.png">

Looks like we're in business (trivially so).

Note I had to add the export `#:grid` to our `:hurkle/class` (pull your git or w/e).

## Hurkle common lisp interface manager commands

We add a new package in our game directory for commands because it must happen logically-after we defined `hurkle-frame` so we can use `define-hurkle-frame-command`

```
(with-open-file (*standard-output*
		 #P"~/common-lisp/hurkle/commands.lisp"
		 :direction :output
		 :if-exists :supersede
		 :if-does-not-exist :create)
  (format t "
#|
\ (eepitch-sbcl)
\ (eepitch-kill)
\ (eepitch-sbcl)
|#
(uiop:define-package :hurkle/commands
    (:mix :hurkle/frame
          :hurkle/class
          :clim :clim-lisp :cl)
  (:export #:com-investigate))

(in-package :hurkle/commands)
"))
```

and its source:

### Investigate

```
(define-hurkle-frame-command
    (com-investigate :menu t)
    ()
  (let ((frame *application-frame*))
    (let ((position
	    (accepting-values
		(t :own-window t)
	      (reverse 
	       (list
		(accept 'integer :prompt "Col=x")
		(accept 'integer :prompt "Row=y"))))))
      (apply 'investigate frame (append position '(:stream nil))))))
```



### Quick note about those clim forms

(besides, the default text entry being too big for my case)

- Enter -> (Next form)
- alt enter -> Submit form

Hmm, maybe try slime or a raw repl rather than `eepitch-sbcl`. Still,

# Useage

(Observing that I am too tired right now)

```
 (eepitch-sbcl)
(asdf:load-system :mcclim)
(in-package :clim-user)
(asdf:load-system :hurkle/commands)
(use-package :hurkle/class)
(use-package :hurkle/frame)
(use-package :hurkle/commands)
(find-application-frame 'hurkle-frame)
```

<img src="../gui.png">

# Conclusion

I got kinda morally exhausted during the changes from *frame works* to *rows and columns are numbered* (not because of you/Hurkles, just the weight of the world on my shoulders). Calling it here.

I went back and added a `stream` keyword to `hurkle/class.lisp` so that McCLIM doesn't guess I am trying to get it to display this text `investigate` is producing.

Further notes, if you please!

I think the final installment of this triumverate will be the-frame-as-a-published-game on itch actually, then the `parenscript` `kittenification` will be another thing. I dunno, what do you think? The McCLIM is a straightforward and orthogonal extension to the CLOS class, right?

# Fin.

See you in [the Mastodon thread](https://gamerplus.org/@screwlisp/114611664134145784). No pressure but I already [told Sacha of emacsconf that we will unleash emacs smallweb kittens](https://gamerplus.org/@screwlisp/114606155202539991).

I am actively trying to help share lisp knowledge and useage! Please share this in any and every manner that occurs to you, and prod me to provide improvements at your leisure.