๐พ Isulion Space Invaders
Yes, It's Space Invaders. Yes, It's Inside a Node.
- high_score
- last_score
- summary
There is a node that plays Space Invaders. On the canvas. While your queue runs. It outputs three values, and one of them is a high score.
This is the kind of thing you add to a workflow for a screenshot and then quietly keep, so let's be straight about what's actually in it. The playfield is drawn on a canvas inside the node, eight columns of invaders, four rows worth 40/30/20/10, two-frame sprites, waves that get harder. Click the game to focus it, then Enter or Space to start, arrows or A/D to move, Space to fire, P to pause. It pauses itself when it loses focus and it only listens to the keyboard while focused - which matters more than it sounds, because a node that grabbed arrow keys globally would make ComfyUI unusable. Mouse wheel over it still zooms the graph. Somebody thought about this.
What comes out of it
high_score(INT) andlast_score(INT) - your session best and the score of the game you just lost.summary(STRING) - the human-readable line,High score: 120 | Last score: 80 | Best wave: 3. It also shows in the node after a run.
The scores live in a hidden game_state widget as JSON, saved with the workflow, so a good run survives closing ComfyUI. On the Python side the node does nothing but parse that JSON defensively - bad, missing or non-numeric values come back as zeros, and it's marked as an output node so it always executes and always refreshes its display.
What it's actually good for
Feeding high_score into a seed. That's it, and it's a better idea than it sounds: you get a seed you can't predict, that you can reproduce later from the saved workflow, and that you can reroll by playing a game instead of clicking randomize. Wire it into a converted INT input and the number of images you batch is now a high-score table. Wire summary into a prompt and your caption says something true about your afternoon.
It also pairs with ๐น๏ธ Mega Prompt V4 as the pack's own demo workflow (Simple_Megaprompt_V4.workflow.json): spin the reels, shoot some invaders while it renders, queue again. As an argument for the pack existing, it's silly. As a thing to do with a GPU that's already busy, it's fine.
Installing it
It's in the Isulion pack, so it arrives with everything else whether you wanted a game or not:
ComfyUI Manager โ Custom Nodes Manager โ search Isulion โ install โ restart. Or:
cd your_ComfyUI_install_dir/custom_nodes
git clone https://github.com/Isulion/ComfyUI_Isulion
Restart and hard-refresh the browser - the game is frontend JavaScript in the pack's web/ folder, so a stale cache gives you a node with no game in it. No models, no Python dependencies beyond the pack's lone requests.
The obvious gotchas
Every run reports zeros if nobody played. There is no browser in a headless run, in the API, or on a scheduled job - the hidden state never changes, so high_score is 0. Don't build a workflow whose output depends on this node firing on a server.
The game is not a rate limiter. It keeps running while the queue does, and separately, so it doesn't pause your generations and they don't pause it.
best_wave exists but isn't an output. It's in the state and in summary, and that's the only place you'll see it - there's no fourth socket for it.
One genuine caveat if you're shipping a workflow to someone else: save a game state that means something to you first, or they'll open the graph to three zeroes and assume it's broken.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| game_state | STRING | {"version": 1, "high_score": 0, "last_score": 0, "best_wave": 1} | โ |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| high_score | INT | โ |
| last_score | INT | โ |
| summary | STRING | โ |