I agree on many points, in particular the packaging. I came to the same conclusion: it needs to be easy to run your game. AppImage is linux only which might reduce player count (though many lispers are probaly on linux). Another point for browser games: cross-compatibility. I did work on packaging as AppImage since the last jam and was hoping to test it out this time bit did not submit anything this edition due to travels but looking forward the playing the submissions and hearing wether you got more feedback with the AppImage version
harebrained
Creator of
Recent community posts
hoping to have @Andrew (cl-fast-ecs library), @oofoe and @Jummit comment here as well. You can read about their approach to ECS in their devlogs https://awkravchuk.itch.io/cl-fast-ecs/devlog/622054/gamedev-in-lisp-part-1-ecs-and-metalinguistic-abstraction. https://oofoe.itch.io/rfk2k/devlog/624237/handling-entities and https://jummit.itch.io/tic80-access-battlers/devlog/622949/pre-jam-preparations
Many submissions this time around made use of some form of ECS. I think it would be great to discuss implementation strategies and libraries.
I will start: Components have a symbol as key and any other type as value, implemented as a scheme record. An entity is a list of components. All entities (e.g. list of components) are stored in a vector. They are represented by an integer (their index into the vector), however this is never exposed to the user. Instead a query macro is provided with which to access entities with particular component types (cannot query on component values). This is backed by a hashtable mapping the components to a bitset of entity ids (to answer the question which entity implement what component). A system then applies a query and acts on the components of the entities return by the query.
I took great care that there is no mutation to allow a functional programming style. Thus at each step of the game loop a system is applied to the game world and returns a new game world.
Brief example of defining a world with a single entity with 3 components and a system to render to the screen
(define world (create-world (list (component 'myentity) (component 'postition (cons 1 1)) (component 'sprite "path/to/sprite"))))
(define (render world)
(let-values (((_ pos sprite) (get-components world (query 'position 'sprite) 'position 'sprite))) (for-each (lambda(p s) (draw-sprite (at (car p) (cdr p) s))) pos sprite)))
Code for the library: https://github.com/sam-d/klecs
EDIT: code formatting
Thanks for trying the game. In fact I was too busy with technical details to give too much thoughts about the game dynamics and playability. I had idea to go for pattern matches which would have made the order of nucleotides/letter in the sequence more relevant. Also wanted the player to have to buy the letters. But Game Jam means time crunch. Perhaps I will revisit this in the future.
Graphics are just done with ANSI codes, no curses necessary. This post (not mine) gives an overview: https://xn--rpa.cc/irl/term.html
Could not get the game to run. Black screen in Firefox, and in Chrome the keyboard input is not registered. Reading your devlog with great interest, as I have recently implemented an ECS library myself (and used it for this Jam) and your idea of a triple store is interesting. Also props to you for developing the ECS part at the same time as the game. Just wished I could play and rate.
Great work. I also try to write a small devlog on my progress for each day of the jam: https://harebrained.itch.io/defend
Thank you for playing! Great that you could find a winning strategy. It goes to show just how complex nature is. As to loosing ATP from the start: luck of the draw: sometimes the initial DNA does not have any open-reading frames. I was actually expecting players to need several tries to understand the dynamics. Having a startup screen with instructions is a great idea though.
Do I need to wait until I fully completed my game before submitting or can I submit now, so interested parties can follow the devlog and what will be judged is the state of the game after deadline? This is unclear to me, I would appreciate if somebody could explain. My project page is here: https://harebrained.itch.io/metabolize