Sign in

Evan Balster 🍂

@art.imitates.life
340 followers 108 following 309 posts

they/them. 🪗 game dev, audio software, harmony and decay, swords into ploughshares. Free Palestine. worked on: imitone, Cave Story, SoundSelf, MIDI 2.0 standard. currently: HYPERCITY VERMIN, a co-op game 🏠 @evan@merveilles.town

PostsRepliesMedia
Evan Balster 🍂 @art.imitates.life · 22/08/2026
This evening please join me as I send all my chi, chakra, mojo, mana and prayers to Sabbath the Awful Cat, and also to those raccoons
A ponderously blurry photo of a grizzled black tomcat is set beneath a fully-capitalized bulletin:
"THIS IS SABBATH. HE IS A FERAL CAT THAT I HAVE BEEN FEEDING FOR 7 YEARS. HE IS WILD SO DON'T TRY TO PET HIM. HE WILL ATTACK  YOUR CATS SO KEEP YOUR CATS AWAY FROM HIM.  IF YOU SEE HIM , PLEASE SET OUT SOME CAT FOOD. HE WILL EAT ALL OF IT AND LEAVE. I'VE  BEEN CALLING HIM FOR TWO WEEKS, I THOUGHT HE WAS DEAD. IF YOU SEE HIM  PLEASE LET ME KNOW AND I WILL TRY TO GET HIM TO COME BACK HERE BUT THE RACCOONS CHASE HIM AWAY. THE BABIES ARE RELENTLESS."
131
Evan Balster 🍂 @art.imitates.life · 06/07/2026
Alternatively: the scavenger hunt version www.reddit.com/r/Morrowind/...
"Can you spot all 17 ash statues in this picture? Caius can't, and he hasn't slept in days."

Caius Cosades from Morrowind looks nervously over his shoulder in a room absolutely infested with leering, red-eyed statuettes.
000
Evan Balster 🍂 @art.imitates.life · 11/06/2026
No, no, you see, this is kitchen ink.
My ink-stained fingers handling two shaggy inkcaps.  The first is a day immature and pale cream in color; the second is fully matured and deliquescing itself into an ominous black slime.
100
Evan Balster 🍂 @art.imitates.life · 02/06/2026
This month instead of passing we're mentioned in passing.
The asexual flag: stripes of black, grey, white and purple.
010
Evan Balster 🍂 @art.imitates.life · 01/05/2026
Huh. I've been playtesting a co-op game about shapeshifters made of cryptobiotic ink. Trying to figure out how to design a walkable, labyrinthine (underground?) city comprised primarily of corridors. Also planning a warped, monochromatic underworld flooded with black sand. So... kinda, yeah.
100
Evan Balster 🍂 @art.imitates.life · 28/04/2026
You may have come a long way but never forget your childhood friends from the blood islands.
"Microglia are specialized macrophages capable of phagocytosis that protect neurons of the central nervous system.[22] They are derived from the earliest wave of mononuclear cells that originate in the blood islands of the yolk sac early in development, and colonize the brain shortly after the neural precursors begin to differentiate.[23]"
001
Evan Balster 🍂 @art.imitates.life · 06/03/2026
An attempt at articulating some complicated feelings about last year's fire, the support I received from colleagues in gamedev, and the slow process of unpacking grief in our new home. www.gofundme.com/manage/my-ho...
A photo of my bedroom nook, occupying a bay window at the tail end of a renovated RV.  The window is decorated with a botanical poster overlaid by an alchemical symbol.  This is flanked by plastic vines and a pair of lamps.  The decor is in shades of moss green, mimicking the colors of the pine forest beyond.
3131
Evan Balster 🍂 @art.imitates.life · 03/03/2026
It is 2 AM and I am learning of the grave repercussions of violating the Mug Warmer Code. I have a duty to uphold
Bullet points from the compact mug warmer manual. 

Keep mug, warmer panels at least 0.9 m away from combustible materials and keep them away from thermal coasters. In case of violation of this code and thus causing loss of life and property, it is not our company's responsibility. 

Please disconnect the power cord with the mug. Warmer is not used for a long time. If you violate this code and thus cause damage to life and property, it is not our responsibility. 

Do not place the mug warmer on the side of a bathtub or other water-filled container. It is not our company's responsibility to cause damage to life and property if this code is violated.
000
Evan Balster 🍂 @art.imitates.life · 03/03/2026
Did a compact mug warmer write this?
An illustrated, brightly-colored page from an instruction booklet reads:

"The compact mug warmer is stylish and powerful. 
The 59 inch plug cord will fits on your desk perfectly."
100
Evan Balster 🍂 @art.imitates.life · 19/02/2026
This week I'm tinkering with SDF rasterization of complex polygons to speed up my game's collisions. To make it fast, I had it start from the polygon vertices and "grow" the SDF pixel by pixel like a crystal using a breadth-first prioritization. This seems to work quite well.
010
Evan Balster 🍂 @art.imitates.life · 26/01/2026
Ah, but are you respectful enough for King's Mitt?
January 2022. Evan's disastrous first attempt at a King's Hand has melted into a vast flat monstrosity of hot cookie dough.
010
Evan Balster 🍂 @art.imitates.life · 01/11/2025
Egg!
A tiny human, freshly emerged from an egg and clad in sky-blue pajamas, flaps and screams senselessly.
020
Evan Balster 🍂 @art.imitates.life · 01/10/2025
Somebody make an Oregon Trail style game inspired by the Sumud Flotilla
Camera footage from a motley fleet of boats sailing into the morning sun.  Their names are Estrella, Huga, Morgana, Wahoo, Paola 1 and Fair Lady.
031
Evan Balster 🍂 @art.imitates.life · 30/09/2025
Less than 24 hours until this civilian aid flotilla would make landfall, but the last nine flotillas were violently intercepted. It's difficult to imagine they will succeed, but it's undeniably worth it to try. Watching the stream with bated breath. www.youtube.com/watch?v=uEN2...
A screenshot of the Sumud Flotilla GPS tracker, depicting a flotilla of forty-five humanitarian ships making a beeline across the Southeast Mediterranean for the coast of Gaza.
131
Evan Balster 🍂 @art.imitates.life · 27/09/2025
Watching some very important boats. Searching up "Sumud" a couple times per day.
Location data for 42 humanitarian ships off the coast of Crete in the Mediterranean sea.
010
Evan Balster 🍂 @art.imitates.life · 24/09/2025
Intellectually I knew clay came from the ground but seeing it crumbling off the sea-cliffs near my home in 100kg bricks, basically the same stuff I played with in elementary school, kind of blew my mind.
I hold a hand-sized share of raw blue clay, freshly collected from below a cliff face.
010
Evan Balster 🍂 @art.imitates.life · 17/09/2025
Reminds me of the Dan Harpole Memorial Cistern (famed for having the most reverb of any location in the western hemisphere). I live about ten miles from it.
A photo of a subterranean chamber, illuminated by flood light and filled with a grid of deviled concrete columns.
100
Evan Balster 🍂 @art.imitates.life · 15/09/2025
folklore.org/Do_It.html?s... Rest OK, Larry Tesler.
Many of the academic types who were involved in creating the earliest implementations of the graphical user interface at Xerox PARC and various universities sort of sneered at the first generation of personal computers when they appeared in the mid-seventies, since the early personal computers were much less powerful than the machines that they were used to programming. There wasn't that much you could do with only four kilobytes of memory and no disk drive.



But Larry Tesler, who was a key member of the Smalltalk team in the Learning Research Group at Xerox PARC, felt differently. He was really excited by the potential of personal computers, buying a Commodore PET as soon as one became available in 1977. He was one of the demonstrators at Apple's famous Xerox PARC visit in December 1979, and he was so impressed by the Apple visitors that he quit PARC and started working at Apple on July 17, 1980, as the manager of the Lisa Applications team.Larry championed consistency between applications, and made many contributions to what eventually became the Macintosh User Interface. He was also the leading advocate and implementor at Apple of user testing: actually trying out our software out on real users and seeing what happened. Starting in the summer of 1981, Larry organized a series of user tests of the nascent Lisa software, recruiting friends and family to try out the software for the first time, while being observed by the Apple designers who recorded their reactions.

The user tests were conducted in a specially constructed room featuring a one-way mirror, so observers could watch the tests without being intrusive. The tests were conducted by a moderator who made sure the user felt comfortable and showed her the basics of using a mouse. Then, with no further instruction, users were asked to perform specific tasks, without help from the moderator, like editing some text and saving it. The moderator encouraged each user to mumble under her breath while doing the tasks, revealing her current thinking as much as possible. Each session was audio or videotaped for later analysis.

When the software required confirmation from the user, it displayed a small window called a "dialog box", that contained a question, and presented two buttons, for positive or negative confirmation. The buttons were labeled "Do It" and "Cancel". The designers observed that a few users seemed to stumble at the point that the dialog was displayed, clicking "Cancel" when they should have clicked "Do It", but it wasn't clear what they were having trouble with.
Finally, the team noticed one user that was particularly flummoxed by the dialog box, who even seemed to be getting a bit angry. The moderator interrupted the test and asked him what the problem was. He replied, "I'm not a dolt, why is the software calling me a dolt?"

It turns out he wasn't noticing the space between the 'o' and the 'I' in 'Do It'; in the sans-serif system font we were using, a capital 'I' looked very much like a lower case 'l', so he was reading 'Do It' as 'Dolt' and was therefore kind of offended.

After a bit of consideration, we switched the positive confirmation button label to 'OK' (which was initially avoided, because we thought it was too colloquial), and from that point on people seemed to have fewer problems.
0146
Evan Balster 🍂 @art.imitates.life · 22/05/2025
Cerveillance
A tilted photo of a forest meadow.  A curious doe enters from the right side of the frame.The doe browses the grass with a wary expression.The doe has approached the camera and looms over it, investigating.The doe's black nose obscures half the photo, and the camera's lens is fogged with her breath.
060
Evan Balster 🍂 @art.imitates.life · 26/04/2025
Dangerous levels of radiation at Mount Holly Estate this evening.
A screenshot of a post-it note labeled "Experiment #19: each time you find some trash while digging, permanently add 1 gold to your allowance.  Successful triggers: 15"
140
Evan Balster 🍂 @art.imitates.life · 13/04/2025
In the colophon to this work, Hokusai writes:

From the age of six, I had a passion for copying the form of things and since the age of fifty I have published many drawings, yet of all I drew by my seventieth year there is nothing worth taking into account. At seventy-three years I partly understood the structure of animals, birds, insects and fishes, and the life of grasses and plants. And so, at eighty-six I shall progress further; at ninety I shall even further penetrate their secret meaning, and by one hundred I shall perhaps truly have reached the level of the marvellous and divine. When I am one hundred and ten, each dot, each line will possess a life of its own.
110
Evan Balster 🍂 @art.imitates.life · 04/04/2025
Spent a week searching this half-mile radius. Years ago this mapping strategy helped me find a lost cat after 9 days. I've relocated our other two cats to the Portland area, far from the toxic ashes. Just as I was handing off the search, a neighbor spotted a "brown and gold" cat — hoping it's her.
A series of annotations that were traced over a satellite map.  Circles mark out units of distance from our home.  Blue annotations mark explored areas and red rectangles mark some zones of avoidance.
2130
Evan Balster 🍂 @art.imitates.life · 31/03/2025
Lol nope
A burnt solid state drive pinched between my ash-stained fingers. The pried-open, incinerated carcass of MacBook pro sits in the background.
150
Evan Balster 🍂 @art.imitates.life · 30/03/2025
Another gift emerged from the ashes. These things can be replaced in time.
A page from a scorched and rain-soaked copy of Mushi-Shi volume one. An enigmatic spirit teases the protagonist from the rafters of an old cottage.
060
Evan Balster 🍂 @art.imitates.life · 28/03/2025
With my keen ears I've been searching the deep woods for our third cat. My uncle has been cutting away burnt aluminum in preparation to tow the ruin away. Most of my hard drives have been located and offer the promise of salvage.
Evan, dressed for forest exploration and accompanied by two cats, raises a teacup in salute. Their floppy green hat is adorned with autumn leaves. A man wearing an industrial respirator and ash-stained rain suit strikes a jolly pose. A deep forest scene bursting with ferns, birch, spruce, fir and various shrubs. There is no clearing, no path.
1130
Evan Balster 🍂 @art.imitates.life · 27/03/2025
😳
A pair of garter snakes cuddling as they mate on a log. One is resting its head upon the other.
131
Evan Balster 🍂 @art.imitates.life · 27/03/2025
Some of my games became more powerful in the fire.
My favorite page of The Quiet Year's rulebook, asking players to embody two contradictory roles as they explore themes of community struggle.  It is rain-soaked; symmetrical pattern of ash and charred paper runs between the pages. A box set of Secret Hitler, a gift from fellow Iowan Mike Boxleiter.  The box is badly burned and coming apart at the corners but otherwise intact. Its contents are safe.
2211
Evan Balster 🍂 @art.imitates.life · 26/03/2025
Back home today and searching for our missing cat. Walking the forest. Calling. Listening. Heartfelt thanks to the many colleagues who offered their emotional and material support this week. Thanks to them I've been able to face this wreck with positivity and focus.
James sits in front of the burnt out and partially dismantled wreckage of a class C RV. Pine Forest towers over the scene.Scout tiptoes across the burned floor between sections of steel framing. She looks happy to see me. My hand holds a small brass bell used to beckon the cats in at night. Its surface is blackened with ash and aluminum slag but it still rings clearly.
1200
Evan Balster 🍂 @art.imitates.life · 19/03/2025
Our pets. James was carried out of the house that night and is ok. Scout came back the next night, traumatized but uninjured. We believe Boom Boom escaped through the open door after the explosion but haven't found any sign of her yet.
James. A black and white tuxedo cat lounges on a forest path in Texas. Scout. A prideful calico tabby postures among ferns and pines. Boom Boom. A furtive calico tabby sits among ferns and pines.
3431
Evan Balster 🍂 @art.imitates.life · 19/03/2025
Our pets. James (tuxedo) was carried out of the house right after the explosion. Scout was outside and came back this morning. We haven't seen Boom Boom but haven't found her remains among the ashes. She had a chance to escape after the explosion and we hope to find her in the coming days.
James.  A haughty tuxedo cat lounges beneath a lichen-covered tree. Taken in central Texas. Scout. A tortoiseshell calico tabby postures proudly among ferns and pines. Boom Boom.  A timid tortoiseshell calico with a ruff of white fur sits among ferns and pines.
1495
Evan Balster 🍂 @art.imitates.life · 19/03/2025
An E-bike battery burned my house down on the first day of GDC. Seeking mutual aid from financially stable colleagues. gofund.me/47306b15
A column of fire envelops an RV in a pine forest late at night. My bedroom and office reduced to ashes. The metal walls and roof are largely destroyed, revealing the forest beyond. A class C RV gutted by fire. The heat of the fire has killed most of the plant life in a nearby garden. A segment of an RV's exterior wall. The heat of the fire has melted through the aluminum panels.
39388
Evan Balster 🍂 @art.imitates.life · 19/03/2025
An E-bike battery burned my house down on the first day of GDC. Seeking mutual aid from financially stable colleagues. gofund.me/47306b15
A column of fire envelops an RV in a pine forest late at night. My bedroom and office reduced to ashes. The metal walls and roof are largely destroyed, revealing the forest beyond. A class C RV gutted by fire. The heat of the fire has killed most of the plant life in a nearby garden. A segment of an RV's exterior wall. The heat of the fire has melted through the aluminum panels.
15315318
Evan Balster 🍂 @art.imitates.life · 16/02/2025
Huzzah! I figured out how to preserve the maximum area when smooshing the polygon. The answer is just to make corners that are parallel with the incoming plane. I've worked out all the edge cases... Now I just need to figure out if this algorithm is actually useful for its intended purpose.
000
Evan Balster 🍂 @art.imitates.life · 15/02/2025
Wacky geometry experiment: concocting a thing called a "DEAP Constraint" for fast, stable collisions when a game character is squeezing through tight spaces. It smooshes down an "equi-angular" polygon based on distance from each wall. But the smooshing needs to preserve as much area as possible...
110
Evan Balster 🍂 @art.imitates.life · 07/02/2025
A recent C++(17) experiment: Property accessors, like in C#. That is, get/set methods disguised as member variables, with full support for sub-members, casts, operator overloads, compound assignments, etc. They optimize down to zero time/memory overhead. github.com/EvanBalster/...
#include <property_accessor.h>

struct Virtual_Rect
{
    struct RectPtr {Rect *rect;};

    //
    PropertyAccessors(RectPtr,
                      
        // Give the real RectPtr structure a name so we can assign to it.
        UnionMember(RectPtr rect_ptr;),
    
        // Proxy (reference) property accessors
        Proxy  (int,  x1,     rect->x1),
        Proxy  (int,  x2,     rect->x2),
        Proxy  (int,  y1,     rect->y1),
        Proxy  (int,  y2,     rect->y2),
                    
        // Value (get/set by copy) property accessors
        GetSet (int,  width,  rect->x2 - rect->x1,
                int new_width,           rect->x2 = rect->x1 + new_width),
        GetSet (int,  height, rect->y2 - rect->y1,
                int new_height,          rect->y2 = rect->y1 + new_height),
        GetOnly(int,  area,   rect->area())
   );
};#define PROPERTY_ACCESS_NO_MACROS
#include <property_accessor.h>

struct Virtual_Rect
{
    // The real data underlying the property accessor group.
    struct RectPtr {Rect *rect;};
    
    // Define reference-getters for proxy property accessors.
    struct acc_x1 : RectPtr {int& get() const {return rect->x1;}};
    struct acc_x2 : RectPtr {int& get() const {return rect->x2;}};
    struct acc_y1 : RectPtr {int& get() const {return rect->y1;}};
    struct acc_y2 : RectPtr {int& get() const {return rect->y2;}};

    // Define getter/setters for value property accessors.
    struct acc_width : RectPtr
    {
        int  get() const         {return rect->x2 - rect->x1;}
        void set(int new_width)  {rect->x2 = rect->x1 + new_width;}
    };
    struct acc_height : RectPtr
    {
        int  get() const         {return (rect->y2 - rect->y1);}
        void set(int new_height) {rect->y2 = rect->y1 + new_height;}
    };
    struct acc_area : RectPtr {int get() const {return rect->area();}};
    
    // Property accessors 
    union
    {
        // Give the real RectPtr structure a name so we can assign to it.
        RectPtr                       rect_ptr;
        
        // Proxy (reference) property accessors
        property_accessor<acc_x1>     x1;
        property_accessor<acc_x2>     x2;
        property_accessor<acc_y1>     y1;
        property_accessor<acc_y2>     y2;
        
        // Value (get/set by copy) property accessors
        property_accessor<acc_width>  width;
        property_accessor<acc_height> height;
        property_accessor<acc_area>   area;
    };
};void PrintVRect(const Virtual_Rect &vrect)
{
    // Properties support iostreams and acting as right-hand operands in general.
    std::cout << "VRect: {"
            << vrect.x1 << "," << vrect.y1 << ", "
            << vrect.x2 << "," << vrect.y2 << "} "
        << vrect.width << "x" << vrect.height << " = " << vrect.area
        << " ... width+height = " << (vrect.width+vrect.height) << std::endl;
}

int main(int argc, char **argv)
{
    Rect rect = {0,2,  1,4};

    Virtual_Rect vrect = {&rect};

    PrintVRect(vrect);

    // We can manipulate width and height
    vrect.width += 2;
    vrect.height += 3;
    
    // We can't manipulate area because it's a get-only property.
    //vrect.area = 7;  <-- this line won't compile!

    PrintVRect(vrect);
}#include <property_accessor.h>

struct Rect
{
    int x1, x2, y1, y2;
    
    int area() const    {return (x2-x1) * (y2-y1);}
};

// Expose members of the Rect type as members of their property accessors.
PropertyAccess_Members(Rect,
    Variables(x1, y1, x2, y2),
    Methods(area));
176
Evan Balster 🍂 @art.imitates.life · 19/12/2024
OK, hear me out: what if instead of crafting materials you just use the vitamins and minerals from all that stolen bodega food
A bizarre nutrition facts label whose serving size is "1 quivering pool".  All of the weights and daily values are hundreds of times higher than normal.An ordinary-looking nutrition facts label for an ice cream cone, in the USDA standard style.Nutrition facts for an eggplant, in the USDA standard style.
000
Evan Balster 🍂 @art.imitates.life · 18/12/2024
I needed to keep track of which directions near a game object were blocked, so I made a little class that uses an int16/32/64 bitmask to represent FOV ranges around a central point.  It's a simple little thing but the test program for tracking a circular obstruction looks neat.
000
Evan Balster 🍂 @art.imitates.life · 17/12/2024
Garments like this are both practical and intimidating. Wear them as a power move.
A figure seemingly levitates in a narrow doorway, clothed in a hooded blue corduroy jacket whose buttons are clasped all the way up over their face.  The wearer's baseball cap, eyes and nose poke through giving the impression of a visor. Their bony arms are crossed in an intimidating pose.
010
Evan Balster 🍂 @art.imitates.life · 16/12/2024
The step-count visualization makes it look like molten metal. Dancing at a specific tempo throws bouncy bits everywhere. TODO: eyeball physics, portal stability, render batching
000
Evan Balster 🍂 @art.imitates.life · 16/12/2024
Fine-tuning the behavior with the goal to keep these critters coherent but sort of loose and splashy. They still can't traverse non-euclidean spaces without exploding. :(
100
Evan Balster 🍂 @art.imitates.life · 15/12/2024
This mix of attractive and repulsive forces is unstable. And a bit unsettling.
100
Evan Balster 🍂 @art.imitates.life · 15/12/2024
🎵 Deck the halls with meta-baa-alls 🎶
010
Evan Balster 🍂 @art.imitates.life · 14/12/2024
Blobs of ichor are now individual objects with attractive and repulsive interactions. Very jiggly! But the eyes get buried and the "main blob" breaks away too easily. True decentralization of the slime mind will be implemented... eventually 🫠
100
Evan Balster 🍂 @art.imitates.life · 14/12/2024
Temporarily reduced to a single blob, to work on motion feel. Varying surface tension makes the little horror ball up and roll, then pancake out when resting. A few bystanders are gathering around to gawk.
100
Evan Balster 🍂 @art.imitates.life · 13/12/2024
More importantly: ample eyeballs. And more jiggle. (Explaining 🍤: I'm making a multiplayer game about urban shapeshifters who steal food. It's called HYPERCITY VERMIN: these are basically liquid raccoons.)
100
Evan Balster 🍂 @art.imitates.life · 13/12/2024
A few pieces of shapeshifter-stuff, held together with spring forces with fixed droplet deformation. I could do a lot more with the movement and shader.
100
Evan Balster 🍂 @art.imitates.life · 13/12/2024
Basic in-engine raymarching setup. Had to remember the mathemagic for calculating ray directions. These visualize into a nice pastel gradient in the (normally invisible) bounding box I'll use to render the creature.
100
Evan Balster 🍂 @art.imitates.life · 12/12/2024
Figured out an equation to make the liquid body flatten out like a water droplet when it's on the floor. Hardcoding animation in a shader is not great, so next steps will be in my game engine.
110
Evan Balster 🍂 @art.imitates.life · 12/12/2024
Re-learning raymarching. Making some gloopy little comrades.
140