git as always. Probably use slime from emacs. Er, I had some videos at some point if it helps. https://toobnix.org/w/p/4bRcULzg6bBAyELkRqU6EQ
screwtape
Creator of
Recent community posts
https://codeberg.org/tfw/nud !
mkdir -p ~/common-lisp/ cd ~/common-lisp/ git clone https :// codeberg.org/tfw/nud.git sbcl (require :nud) (in-package :nud/user)
It occurs to me there's no link to the git.
mkdir -p ~/common-lisp/ cd ~/common-lisp/ git clone https://codeberg.org/tfw/nud.git cd; sbcl > (require :nud) > (in-package :nud/user) ;as above.
Well, it's not perfect and for some reason my :export both didn't work but happy 2025 everyone. Chatter at me on the 'stodon plz. Remember the live show is every Wednesday 0UTC (Tuesday night in Americas various). We're mostly doing interviews when we can now. Check the pinned Mastodon toots for recent interviews or the peertube https://communitymedia.video/c/screwtape_channel/videos:
So so far it seems the Mastodon thread https://mastodon.sdf.org/@screwtape/113518658526470901 to get on the honorary jam roll has a little momentum.
(Well, we went from
to
so far, and hopefully you too will get involved soon.
Once our township forms, I think I will ask repeatedly-eval-qt to highlight actions that are happening on the graph, and then we basically have a top-down universe simulator in video, but where people in that universe can gain function via lisp/moo much more literally than in the offline world.
To be clear: Egbert's first contribution is now here in the git:
https://codeberg.org/tfw/lispmoo2/src/branch/main/games/egberts.limo
and Egbert's second contribution, connecting to Screwtape's MOUNTAIN-TRAIL is here:
https://codeberg.org/tfw/lispmoo2/src/branch/main/games/egberts-2.limo
So while I've been using the :lispmoo2/user package to absorb code, it is eminently possible to use other packages. We should verbs for making and manipulating lisp packages.
LISPMOO2/USER> (uiop:define-package :ofo) #<package "ofo"=""> LISPMOO2/USER> (intern "abr" :ofo) OFO::|abr| NIL LISPMOO2/USER> { @create $thing :named OFO::|abr| } x YOU @creates $THING :named abr. ($THING) LISPMOO2/USER> { @push ofo::|abr| :to (ocean :contents) } x (OFO::|abr| TROUT) LISPMOO2/USER> { look-around } x You are in OCEAN. Objects here are: abr TROUT Players here are: YOU Exits here are:
Now when you say "build" and "game"
alright I accept that I submitted this game to a game jam so we better do it
It's common lisp.
- 1. apt install sbcl or w/e
- download and verify (sha256 or w/e) https://www.quicklisp.org/beta/ 's https://beta.quicklisp.org/quicklisp.lisp
- It says beta but it's not thaat beta
- sbcl --load quicklisp.lisp and follow the prompt
- git clone (or download/extract) int ~/quicklisp/local-projects/ :
- Good work so far
- $ sbcl
- > (ql:quickload :lispmoo2/main)
- > (in-package :lispmoo2/main)
- I forgot, need to do > (define-game) ; here
- You could (setq *player* 'my-name-instead) ; first if you wanted to
- > { north
- > x
- > { west
- > x
- > { @take gold-ring
- x
- { east
- x
- { @give gold-ring :to distressed-princess
- x
And that's pretty much it. The thing is, the moo substrate for the game works really well so you can ignore the above "game" and do something better
- { @create $room :named my-way-better-room
- x
- (push *player* (get 'my-way-better-room :inhabitants))
- @create $thing :named incredible-sword
and just make your own better game / or improve my game ;p
Okay, I will pay at least a little attention to everyone else's games on the show tomorrow ( 000UTC Wednesday https://anonradio.net ) but indulge me indulging me for just one second here. Is this crazy or not.
https://lispy-gopher-show.itch.io/lispmoo2/devlog/828749/my-very-own-computing-r...
Okie dokes, I submitted it. devlog retrospective will be forthcoming, but here is where I ended up though with quite a few downsides:
Admittedly, it is quite a short and linear game with deficient narration. Sorry for spoilers.
> { north > x You navigate north to FOREST. (:OWNER SCREWTAPE :PARENTS ($ROOM $OBJECT) :CONTENTS NIL :INHABITANTS (DISTRESSED-PRINCESS SCREWTAPE) :EXITS ((SOUTH . START-LOCN) (WEST . CLEARING))) > { west > x You wander west to CLEARING. (:OWNER SCREWTAPE :PARENTS ($ROOM $OBJECT) :CONTENTS (GOLD-RING) :INHABITANTS (SCREWTAPE) :EXITS ((EAST . FOREST))) > { @take gold-ring > x "You take " GOLD-RING GOLD-RING > { east > x You exit east to FOREST. (:OWNER SCREWTAPE :PARENTS ($ROOM $OBJECT) :CONTENTS NIL :INHABITANTS (DISTRESSED-PRINCESS SCREWTAPE) :EXITS ((SOUTH . START-LOCN) (WEST . CLEARING))) > { @give gold-ring :to distressed-princess > x "You give " GOLD-RING to DISTRESSED-PRINCESS
However! I am classifying playing the game as doing anything possible in lispmoo2, which includes @creating whatever and @verbing what you want as well. For example, I did this:
{ @verb $thing :is (com-@give (if (and (member dobj (get player :inventory)) (member iobj (get here :inhabitants))) (progn (setf (get player :inventory) (remove dobj (get player :inventory))) (push dobj (get iobj :inventory)) (print \"You give \") (princ dobj) (princ \" to \") (princ iobj)) (progn (print \"You can't or don't want to give \") (princ dobj))))
To allow myself to @give the gold-ring to the distressed-princess. (whom was @create $player :named distressed-princess -ed).
The one million pages of warning every time you execute { x } , generally for typos, all from moonclimb are ignored as they don't proximally cause any real problems. There are a few miles of devlog to be had but it was some kind of completion, even if I didn't get to being gamey again.
Looking forward to playing your game! (Person, whom will ideally want to hang out on Wednesday's show, I'm looking at you mdh)
3 for 3 (I'll let you go back to sleep now.
I fixed the ugliness of my low level interactions using a reader macro in https://lispy-gopher-show.itch.io/lispmoo2/devlog/826908/a-moonew-language-for-i....
To illustrate, above you read me write
(verb-plist :verb 'com-@create :dobj '$room :prep :named :iobj 'start-locn)
which I have now implemented as
{ @create $room :named start-locn
Where { enters this reader. It also accepts additional explicit keys, but evals their arguments.
Alright I did somehow muddle my way through the first step, though I skipped connect
While there isn't any high level interface to my engine, In hypothetical high-level I did this:
- @create $room named start-locn
- @create $room named forest
- LISP> (push 'screwtape (get 'start-locn :inhabitants))
- @verb $room is (com-north (progn #<find 'north in exits and move PLAYER there>)
- north
LISPMOO2/MAIN> (funcall *krnl*) You head north to FOREST. (SCREWTAPE) LISPMOO2/MAIN> (symbol-plist 'forest) (:OWNER SCREWTAPE :PARENTS ($ROOM $OBJECT) :CONTENTS NIL :INHABITANTS (SCREWTAPE) :EXITS NIL) LISPMOO2/MAIN>
https://lispy-gopher-show.itch.io/lispmoo2/devlog/826836/defining-north-between-...
Attempting to get anything at all turned in I wrote
https://lispy-gopher-show.itch.io/lispmoo2/devlog/826784/figuring-out-how-my-moo...
just now. I'll try and get the then-implementing-this-plan scratched out in the next 24 hours. I think even just this will be surprisingly interesting (to me personally!). I'm also excited to poke around all the diligent jamming lisp users have gotten to here in my quiesence!
The Lispy Gopher Climate (https://archives.anonradio.net/#screwtape https://mastodon.sdf.org/@screwtape/113393326797991173) after this jam ends, I will mention and poke around in (or if the barrier to entry is very lispy, play) your game and mention what I can.
https://lispy-gopher-show.itch.io/lispmoo/devlog/821630/lisp-kind-of-society-urg...
Right after this jam started, I heard I was causing my friends some trouble by letting other people know how cool it is to MOO. So starting now, I am going to do my best to write a new playable multiplayable MOO server in common lisp.
This will also accentuate the spritely institute's development, which I consider to be similar.
I'll reply here with my itch phlogs as I go if someone wants to chatter about them.
I'm on the Mastodon if you would like to mutually toot over there. https://mastodon.sdf.org/@screwtape
I'll also be talking about this and this jam on the show on the next two Wednesdays at 000UTC and Friday 1400UTC. https://anonradio.net:8443/anonradio https://archives.anonradio.net/#screwtape.
I had previously written some low level MOO engine infrastructure in lisp (my moonclimb) which I will use for infrastructure.
Another great reference for getting started with lisp, using the popular steel bank common lisp is Andrew's https://awkravchuk.itch.io/cl-fast-ecs/devlog/622054/gamedev-in-lisp-part-1-ecs-...
oh yeah I got it backwards. that name referred to the defined component name, I would have to put a symbol-name property inside the component if I wanted it. Now I got it working I can actually use it and see ;p. And I would call make-object once for every object, the object having components having component properties.
Ah, when I referred to using a plist, I meant in sketching component properties I put these properties in the plist as an implementation detail. So I think
(defmacro symbols2ecs (symbols) `(ecs:make-object ',(loop for symbol in symbols for key = (intern (symbol-name symbol) :keyword) for plist = (symbol-plist symbol) collect (cons key plist))))
Ends up with your spec for me ;p sorry for thinking out loud. I see it's been tested on ECL, I'll figure out why mine wasn't working.
For example if I have an arbitrary number of room entities and doors to other rooms can be created or removed over time, how should I achieve this?
I guess I could fix the exits to be only of type (member :north :east :south :west :up :down) since that's mostly adhered to anyway and then since your ecs is fast,
for players solely keep the player-room connection in a property of the player entity and just search what players are in a room at a point in time. Which I guess works for a relatively large small number of players. I guess you did this somewhere I should have looked at already in your games..!
[] if I understand, ecs:make-object expects per object an alist where the cars are keywords and cdrs are plists keyed by keywords.
So instead of using symbol-name, I would have a :name property in a plist to construct the input to ecs:make-object. And I guess I would need a :package property if I wanted to refer to the password; actually, is there symbol support or sequence support (I understand sequences of indeterminate length aren't nice for fast searches).
I'll actually try the example when I'm at home.
Thanks <3
I'm now trying to figure out how I can do (symbol-plist foo)s to your entities + component properties in https://awkravchuk.itch.io/cl-fast-ecs ie so I can use your beam search / A*
The source is secretly stored as an exportable web page https://codeberg.org/tfw/moonclimb/src/branch/main/scratch.org
Also, my repo for starting a lisp image in emacs: https://codeberg.org/tfw/slimeclimorg/src/branch/main/slime-ecl.org
Last postscript, toot to me on the mastodon: https://mastodon.sdf.org/@screwtape