Hello, it is I, Olive, still alive. Since the last update, I’ve started HRT (or as I like to call them, my ~titty skittles~), restarted blasting my unsuspecting follicles with lasers (going back to a doctor was scary, but my house has started using microcovid.org which has hugely helped us quantify what we should be afraid of). Gender euphoria is a helluva drug, let me tell you. Highly recommend it. 10/10 ⭐ ⭐ 👌
I also just devoured Gideon the Ninth series and ~had~ to dress up as her for Halloween. If you want a sorta-juvenile space necromancer lesbian mystery story, hoo boy buddy you’re in for a treat. Highly recommend it. 10/10 💀🌺
Re: Crescent Loom, development has been slow because of a wrist injury (it’s doing a lot better since I started using a brace) and I’ve fallen victim to the “perfect being the enemy of the good” fallacy. I kept pushing back this update because there’s still bugs to fix (there’s always more bugs to fix) and more content to add (there’s always more content to add). The only thing that has brought me to finally write this is that I’ve gotten so doggone stumped on a particular bug (more on that later) that I’m using this a form of productive procrastination.
So here we are! This is a hefty update. The full changelog is here. Let’s hit the highlights.
For some reason there’s suddenly a need for neuroscience activities for students that you can do online? Weird.
Anyway, Crescent Loom is basically ready-made to be a digital neurobiology lab for remote classes. In collaboration with my undergraduate thesis professor, I’ve made another micro-version of the game that 1) hides the identity of the neurons and 2) gives you tools analogous to what you’d have in a lab, e.g. by blocking certain neurotransmitters or exploding neurons with a laser.
It also lets you record and save a cell’s activity to a .csv file to be analyzed in other software. (I picked up this AMAZING cassette sound effect library in the itch.io racial justice bundle earlier this year, and so this recorder is now the most auditorally-satisfying part of the whole game.)
In the spirit of filling out the neuron side of things, I put together a panel where you can see the rules that govern the ion channels.
I’m planning on making this more of an editor; being able to add and remove ion channels from neurons to see how they behave differently would go a long way to change this from neurobabble to something people can understand.
(I also added the ability to change the ion concentrations of the neuron, but other simulations have already done a great job at that so I don’t think it’ll ever be a focus)
Plugging Memory Leaks
One of the downsides of being mostly self-taught is that I fall into programming gotchas that someone on a larger team/with a mentor would have taught me to avoid, as seen in my post on draw-calls.
Today’s version of this is memory management — specifically, deleting things from stacks. Naively, I assumed you could do this:
But alas, nay, this does not behave as expected. Here’s the error, step-by-step:
To avoid this, you have to either traverse the stack backwards or make a copy of the original stack, like so:
Why these fix the problem is left as an exercise for the reader. 🙂
Since I did the naive thing in crescent loom, I’ve been plagued by ghosts from almost the start of the project; phantom physics objects left behind by old, dead creatures. They were invisible to the player, and could only be sensed if they bumped into something or blocked creature sightlines.
Since I never successfully called the Kill() method on all the branches of creatures I was getting rid of, they left behind their ghost-bones in the physics engine even after I had dropped them from the game proper.
I was REALLY HOPING that fixing this across my entire codebase would have helped with the killer lag that accumulates as you play the game for more than like five minutes. Alas, it seems to have maybe helped a little but not completely. More work to do here, but hunting down memory leaks is borrrrring, frustrating, and I’m totally unmotivated to do it. So hi, I’m writing this instead.
I did get some neat graphs out of it, though. Scratches my running-science-experiments-by-changing-one-variable-at-a-time itch. Y axis here is memory used as seen in the task manager.
Look at some pretty creatures
I added rainbow colors and lights!!!
Also, a dedicated individual has been making some really cool lil buddies an posting them in the reddit. I’ll leave you with this beauty:
Soooo — the world is cooking and police are shooting people in the streets. I spent the first week of June incapacitated with guilt and shame for not doing more; not fighting, not putting my body on the front lines of resisting violence. Shame that given ample and unignorable examples of police brutality, I continue to hide inside and benefit from systems of capitalism and white supremacy.
But I am so, so scared. Crowds cause me to panic and shut down. The quarantine hasn’t done my agoraphobic tendencies any favors. I haven’t built up activist muscles. I’m donating to bail funds and gofundmes, but this feels like cowardice; I’m merely buying indulgences from the comfort of my home. I am not doing enough to act in accordance with the values I hold, the voice in my head says.
The question becomes, then: how do I better structure my life in accordance with my values and with my abilities? The fight for equality is long, and will not end in our lifetimes. Burning myself out now won’t do as much good as finding ways to make the paths I’m already on bend to the side of justice.
I make games. People have turned even more niche things into impactful events. There’s gotta be ways both right now and going forward that I can make that help. (the voice says: “are you just looking for excuses to feel OK about doing what you want to do anyway?”)
Enter itch.io’s Racial Justice Bundle. Over ten days, it raised $8 million for the NAACP legal defense and community bail funds. I submitted Crescent Loom halfway through, and more people have played CL in the last two weeks than the last three years:
It’s only a small drop in the bucket ( .1% of people who got the bundle), but by golly I’ll make those people’s experience of supporting racial justice as good as I can. The build that was live when this surge of traffic hit had a lot of problems — no sound, frequent crashes, macOS was completely inoperable. Thanks to many helpful comments & reports that helped me troubleshoot, I was able to get a new build out on tuesday night that seems to have fixed most of the issues. Changelog is here.
A Brief Aside; Olive’s Law
Of of the most consistent lessons I’ve learned since starting game dev is:
The single hardest universal problem in game design is teaching players how to play.
You can write that down. Olive’s law. It’s a problem that touches EVERY SINGLE SYSTEM in EVERY game, by virtue of the fact that the first step of a user encountering any system is, by necessity, learning how it works and how to use it. It does not matter how elegant or clever or balanced your game is if people are unable to access it, both mentally and physically.
(It’s not just video games, either; the difficulty of player onboarding is the biggest single existential threat to Magic the Gathering, a behemoth of a money-making machine with tens of millions of players.)
Somewhat famously, the best solutions for this problem are usually invisible to the user. The Mario games are the classic case-study; for more details, take a look at the Game Makers Toolkit and Extra Credits breakdowns.
Other games rely on cultural knowledge or “games literacy”. When presented with a first-person game, many people’s first instinct is to try pressing WASD to move. This is powerful because it takes care of a core mechanic of the game with little-to-no-effort, but can be dangerous to rely on because there is no way a novice would ever think of pressing some random letter keys.
What I’ve Tried
Over the last four years, I’ve tried a number of different approaches to teach people how to play Crescent Loom. They include:
1. Voiced tutorial
- Pros: mostly effective, entertaining, consistently gets people started
- Cons: very high development cost, limited access to voice actors & recording equipment, has edge cases where people get confused and can’t course-correct.
2. Series of levels
…with only a few tools enabled & carefully-designed challenges to force people to focus on and learn each mechanic.
- Pros: feels like “content”, sense of progression
- Cons: high development cost, requires a lot of playtesting to tune correctly, people still get stuck, taking away people’s tools undermines the core creative fun of the game.
3. In-game encyclopedia
- Pros: very low development cost, can be consulted when needed & ignored when not
- Cons: weak context, does not give an overall sense of direction or how individual pieces fit into a functional whole.
4. In-person classroom demonstrations
- Pros: great ability to course-correct when player gets stuck via presenter or peers, exciting to see what other people are working on, requires very little ingame development work since you’ll be explaining it with your mouth instead
- Cons: requires in-person labor and environment, you can’t download a teacher.
5. Digital lab notebook
i.e. out-of-game guides. A youtube how-to tutorial would fall into this category.
- Pros: taking the what-to-do-next out of the game significantly lowers the development cost, shows rather than tells
- Cons: requires having two windows open which is a little weird & requires an internet connection, you need to be able to find guides that will be relevant to you.
6. Lego-style manuals
And now, with this latest release, I’m trying out something new: step-by-step manuals modeled after Lego or Ikea building instructions. I’m very optimistic. Let’s go through each step of interaction with this system. (note that these points are theoretical; I haven’t actually done any in-person playtests with this yet so let’s call these “hypotheses”)
- You are presented with a menu of creatures. Your first choice is very easy (“oh, that looks cool/beautiful!”), empowering (you are deciding what to make, not whatever I decide level 1 should be), and you can choose based on how much of a challenge you want. The player is given control over what their experience is going to be & what is going to come out of it
- The first page of the manual re-iterates setting up your expectations: “this is the thing that you will be making!” The a reason that both the cover and first page of a lego manual are of the thing you’re making is that they keep your eye on the prize. (Being able to make this a gif is a bonus of having these manuals be digital)
- Each step is small & the pieces that you need are listed. This gives you a clear objective as you poke around the UI looking for the pieces. It has the side-effect of probably accidentally teaching you where other things are as you stumble around on your scavenger hunt. The overwhelming choices of the UI are transformed from an impenetrable library into a “find the hidden object” game.
- The fact that you can page forward and backwards at your own speed is another mechanism of empowerment. It avoids the problem of needing to make a tutorial slow down to the pace the person who needs the most help. Paging backwards paired with an undo button also helps with course-correction if you find yourself in a snarled mess later on.
- It finally, finally is a good way to show how to make a brain. The technical challenge of both telling you what to do and detecting if you’ve done it is very tricky; there’s just too many combinations of ways you can do a thing and ways it can go wrong to programatically catch them all. To make these, I literally just take a screenshot of the brain at each step, point, and say “like that.” It also teaches more complicated things like modifying synapses as you need them with sub-steps.
- Including a finalé panel that invites you to paint & customize your creature opens the door back up to improvisation and personalization. Come to think of it, I should also highlight the aesthetics body parts here to let people REALLY go wild by adding doodads without affecting core functionality. The checkmark is a small celebration. Everybody loves validation.
Best of all, these instruction manuals are very, very easy to make. Turning a completed creature into an instruction manual only took about an hour each.
That’s all for this time! I know we’re all tired of quarantine by now, but remember we’re still in a pandemic. It’s a marathon. Find ways to stay sane safely. We got this.
Hope all’s as well as it can be with folks. I’m in a solid quarantine-crew and was able to keep my day-job, so I’m about as safe as one can be. This international crisis has let me take a lot of pressure off of my Crescent Loom work (“It’s OK if I don’t do all those things, we’re in lockdown! Anything I do is more than could be expected!”) which has ironically gotten me to feel better and do more on the project.
Action Potential Explorer
I’ve finished the first draft of the stripped-down version of the game I talked about last time. It’s designed for classrooms // for people who want a explorable simulation of how neurons fire. All the creature-building stuff is left out; there’s just poking around at neurons and ion channels. You can play it here.
Since making in-game tutorials is hard, I copied a solution from gaming’s history: instruction manuals. These books that came with many early games fell out of favor because they were intimidating and arcane. For guidance, people have come to instead rely on online resources; first GameFAQs, and now YouTube playthroughs. My hope is that if I make an interactive & visual online guidebook, I can get the low production costs of a manual and the actually-usefulness of online resources.
This guidebook is designed to be used in conjunction with playing the game. It tells you exactly what to try and gives a space to take notes for what happened — a sort of Socratic method / tutorial combination. It’s definitely an experiment. I’ve never seen anything quite like it in the wild. We’ll see how it goes.
Almost without fail, whenever somebody with a deep math or computer science background plays Crescent Loom they eventually ask: “Can I define some kind of subcircuit/module/pattern that I can then re-use?” Building up functional units of computation is a fundamental skill of these fields and it’s necessary to make anything beyond the most basic of systems.
I mocked up the first version of this “modularization” for Crescent Loom following the sub-circuit metaphor common in logic/computer programs: you can save a micro-brain with defined inputs/outputs:
And you could place as many of these as you want in the brain, just like you would a normal neuron. Any connections dragged onto its inputs/outputs would automatically connect to the simulated neurons inside it. You’d even be able to place subcircuits inside subcircuits!
While this had satisfying parallels to the power of computer architecture, it posed a few challenges that ultimately proved to be fatal to this system for Crescent Loom:
- First was the simple issue of navigation: how would one page through a brain like this? Would you have to constantly zoom in and out of these subcomponents? What would happen to the lower ones if you deleted the thing that contained it? What would happen if you changed one instance of a subcircuit? Suddenly, we’re presented with this turtles-all-the-way-down architecture & I would have to manage templates of subcircuits instead of actually neatly modularizing them.
- Second was the issue of sensory inputs and motor outputs. Could they exist inside of a subcircuit? If so, how could you place a subcircuit before you made the muscle on the creature? You would have to navigate into the subcircuit and place the motor neuron manually for each muscle, which again makes each subcircuit more of a template than a self-contained module.
How to cleanly handle inputs and outputs is a tricky problem in programming architecture — the whole Model-View-Controller philosophy just serves to group inputs and outputs into Controllers and Views, respectively, allowing you to keep your pure computation nice & clean & isolated in their Models. Since there’s such a high level of integration between inputs and outputs for nervous systems and relatively little Model-level processing happening, maybe moving away from this computation-inspired system would be fruitful.
Attempt #2 was simpler: just add additional “pages” to the brain. It’s basically just giving the brain more tiles, but putting the new tiles under instead of next to it. This solves the navigation problem in that the pages can just be displayed as small hexes wrapping around the currently-selected page, since none of them are “inside” any other.
It also solves the input/output problem because you can just drag any motor or sensory neuron to any other page. You just can’t delete a page until you’ve moved out all body-associated neurons (i.e. motor & sensory).
For connectivity between different pages, I took the idea from the sub-circuit model to let neurons connect outwards at the corners of the brain. That axon becomes a “loose end” and can be dragged into any other page from an empty corner. This system promises to be a lot more flexible and with less overhead than the subcircuit model — I don’t have to mess around with templates or saved subcircuits. It also took, like, two days to implement (sans loose-ends) after I’d come up with the design, and most of that was just making the buttons the right size and stuff.
I also have hopes that I can get some of the power of the subcircuit system here if I let players copy/paste pages. This again poses the input/output problem, but maybe I can make those “ghost” neurons that don’t function until they’re replaced with a real motor or sensory neuron.
Yikes, I haven’t actually uploaded a new build in over a year — not since February 2019. Hecka overdue. New version is up. Notable accumulated changes:
- Paging system in the brain, as described above.
- Axons are now single-compartment. I’ve traded simulation realism for the ease of a simplified model. Multi-compartment axons live on where they’re actually relevant; the AP explorer.
- On a related note, I’ve removed dendrites. There’s just not a reason to use them at this level of abstraction.
- You can select multiple axons to see many traces at once.
- Can toggle ion channels on/off
- Simplified neuron detail panel — now long status bar that shows up when you click a neuron. Seriously, this is way better. I’ll do post about the evolution of its design someday.
“I wish it need not have happened in my time,” said Frodo.
“So do I,” said Gandalf, “and so do all who live to see such times. But that is not for them to decide. All we have to decide is what to do with the time that is given us.”
~ Olive <3
I’m going through the BART turnstile and look up — and who is it but Mattias Lehman, an old friend who recently left Riot games to work as an activist in the Sunrise Movement. We talk and catch up. He’s amazing and working to directly make the world better (did I mention he has a Patreon?).
I look down. I see my light-blue button-up collared shirt as I commute into San Fransisco for my web development day job. I haven’t done any serious work on my projects for several months, ever since the grant didn’t go through. I feel like I’ve gotten complacent.
I’ve had some mental health challenges this year, and taking it slow has been good for me (especially after trying to cope by throwing myself into a pit of the aforementioned grant-writing work). But there was something about hearing what he’s done that made me feel like it was time to kick back into gear.
So I take a look at Crescent Loom. How does it make me feel? Overwhelmed. There’s so much it’s trying to do. My abilities have already been pushed to their limits. There’s two solutions for this: get more resources, or scale back. The grant was an attempt to get help, and didn’t work.
One option left: cut down the scope. Significantly.
Action Potential Explorer
What’s the smallest thing CL could be to start living out in the world? I listed the things it illustrates well: the propagation of action potentials, contralateral movement, how ion channels produce a neuron’s behavior, temporal vs spatial summation, how small networks of neurons are enough to make an animal move….
A common theme when I’ve talked to biology teachers is that teaching action potentials is hard. Students memorize its shape, maybe something about ion channels opening and closing, and then move on with their lives. I decided that this area was the best overlap between what CL illustrates and what’s needed in the world.
That very night, I hashed out a design for the Crescent Loom Action Potential Explorer. It cuts out most of the game; no creature creation, no editing of brains. Just a pre-made creature that you can poke and prod at, including the ability to toggle ion channels on and off to illustrate what they do. And instead of an in-game tutorial (which takes a lot of dev work), I’m going to guide students/teachers through the simulation using a website-based guidebook they can have open in another window/tab.
My goal is to finish this up as something to live-in-the-world by the end of the year.
However! Because life doesn’t care whether your busy for when it throws you curveballs, right in the middle of this redesign, I had a very special experience while attending the XOXO conference in Portland.
It was groundbreaking enough for me that I dropped everything to make a short narrative game about what happened. I finished it just in time for Coming Out Day this month — instead of saying more, I am ABSOLUTELY DELIGHTED to now share it with you:
It takes about 20 minutes, works in-browser, and headphones are recommended.
The grant-folk didn’t go for it, not even close. The submission got a score of 65 out of 100. I have two reactions:
This is disappointing, but par for the course. Getting grants is hard, and it’s normal to miss a number of swings. They gave fairly good feedback, and we actually did pretty well for where I’m coming from (outside of an institution, no previously awarded grants). We learned a lot by going through the process. I can rest, prepare, and try again next year having addressed their concerns.
I also was able to talk to some teachers and have ideas for a micro version of the game that could be used in classrooms almost as-is, so this will give us time to get some kind of minimum viable product living out there in the world.
Skin in the game
Not at all because I was sad and needed to google animals, I did some work going back to the game’s roots for the creature’s designs: nudibranches (and squid)!
So cute! So squishy! CL’s creatures don’t look much like them, though. It’d be cool if things could be more… squishy? I had a system at one point to have deformable skin. Playing around with that again:
Some errors: that weird popping-out of the skin when it bends far. Math is hard. If you happen to know about polygon convex hulls (and related things), I could probably use a hand?
I’m also taking a look at heating up two other games that have been on the backburner for a while now. I’m partnering with an artist to give my first game, Starship Rubicon, a facelift.
New (VERY VERY work-in-progress):
IMO my original art never really popped, so it’s super exciting to see it decked out to be a lot more colorful — it’ll be an interesting design challenge to keep that color while also preserving visual clarity amid the explosions.
Second, I have a geology board game that’s been begging to have its rules solidified enough that I don’t make up new ones every time we play through it.
It’ll probably need a kickstarter once it gets solidified, but seeing as I’ve never made a board game before, this is another one I’m gonna need to find some collaborators for.
🌈 Friendship is magic 🌈
Woof, the last wicklog was in January? I really let these slip. However! I have been writing. A lot. Out of the avenues for getting funding, I think that grant-writing is the best choice for CL. Grants are hefty, don’t come with many strings, and usually have for-public-good goals that line up well with CL’s educational aspects.
I wrote a grant about a year ago to get a sense of the process. As expected, I didn’t get it. They told me that they loved the idea, but I needed a business plan. Which was fair —I didn’t really have a plan beyond “I dunno, sell it to people, I guess?”.
So I’ve spent the intervening year talking with folks working in edu games get a sense of what works business-wise (and to make friends!). Cold-calling, setting up meetings, and going to socials was NOT AN EASY THING for me, an introvert who once bussed across town for a meetup, saw that it was in a ~bar~, and got so scared that I turned around and got on the bus going back. Emailing a handful of people to ask for something is usually a full day’s work for me.
So I’m hecka proud of myself and thankful to the folks I worked with, because we pulled all this together into a finished Grant Proposal #2: Operation: Get Crescent Loom Into Classrooms:
~ take a look! ~
(It was an SBIR application to the Department of Education, for reference)
These fifteen pages (plus a stack of supporting materials, e.g. budget) are a culmination of the last year’s worth of work, including a business plan that I think will be able to thread the needle between profitability and making it available to low-resource organizations.
I think we have a solid shot, but these grants are very competitive (I think they select ~12 out of 500 applications). Even if they don’t go for this one, I now have a good footing for future shots.
They’ll let us know about the grant on June 20th, so I have a few months to do some free-form tooling around with the design. I want to 1) make it run faster so there can be more critters on the screen, and 2) experiment with different layouts to make the initial contact with the brain stuff more intuitive.
There’s always a balance between what to simulate and what to simplify. I’ve taken the tactic of initially simulating as much as I could and then paring away what is unnecessary. I think simulated action potentials traveling down axons is now on that cutting block.
It used to be that you could see a pulse of activity travel along an axon, like so:
But setting up simulation values such that they worked for both the very-fast, very-large conductances of an action potential AND the slower dynamics of a cell body was difficult; it forced me to average things out so action potentials were slow enough that the simulation time-step could catch them. It also added a bunch of math overhead to calculated current flowing through these long wires.
So I asked myself: what does simulating them add? I think it’s really cool to be able to see the chain-reaction of a pulse going down the length of an axon, but functionally, is it worth it to do 20X more work to get “A activates B” to be a little more fancy? By treating it like a single unit, I cut out a ton of overhead and can get them to fire at slightly-more-realistic rates:
I have a few reservations:
1) I like how the original animation looked a LOT more.
2) There is an intuition that players have that pulses take longer to travel down longer connections, which is actually correct and is lost in this new simplification.
3) You won’t be able to stimulate any part of an axon anymore and see a pulse travel outwards from that, which I thought was the coolest way to understand what axons were actually doing.
But I’m pretty sure I can cheat most of these back in with a more-simple hard-coded mechanisms. It’s not as elegant, but pursuing structural elegance over usability is one of the deadly programmer sins.
As far as different layouts go, I’ve never been happy with how separated the brain is from the body. It’s a hold-over from the very earliest designs of the prototype, but I haven’t found a better solution yet. But I would love it if instead of working on the brain floating off next to the creature, you could zoom into the creature and work there. Something like this:
There’s a lot of challenges of this design (how do you see what’s going on in both the creature and brain at the same time?), but I’ll play around with it to see how it feels.
I wanted to get a better picture of where I was in my process, so I made a timeline of CL’s development thus far:
I’m a little surprised at how little time over the last two years I’ve actually spent working on it full-time. A bit after the kickstarter, a bit at Stugan, but wrangling with business stuff and writing and day jobbing has meant that it’s been only a bit under 50%, overall. Hopefully getting more resources with the grant will help stabilize things?
Happy new year! It’s been a good start for me, especially compared to the emotional wasteland of the last few months. I’ve started seeing a therapist, am surrounded by housemates who care about me, started a really really cool project (at the end of this post), and am putting together the pieces for another grant attempt.
I want to start out going through some technical stuff in this first section — feel free to skip to the end if you just want a sneak peek at what’ll be coming down the pipe this year.
Taking a break from development has hardly felt like a break. I attended a handful of conferences (XOXO, Intentional Play, and Society for Neuroscience) and life always finds a way to fill any empty space.
- Version 0.6.0 released, with all the work I did in Sweden.
- Prepping for another crack at writing a SBIR grant for the new year. (???)
- Talking with folks about using CL in some real-world applications.