Description

In this game, you push conducting blocks around, attempting to connect up wires (that is, conduits, or, if you'll allow me to be more whimsical and anagrammatical, "ion ducts") to open doors and make it to the GOAL. Watch out, though, since there is some deadly fire in your way...and you only have 4 HP. Use them wisely.

This game was originally going to be longer, but something came up so I just drew up a single level with a handful of mechanics. I added a bit to it, but since this level was hand-coded (unlike last year, I didn't put in the time to write/fix a level editor), I couldn't make more than one. Even post-jam, I still don't have a level editor, so at least for now that's all there is.

This is a submission to the Linux Game Jam 2023--together with a post-jam version including quality-of-life improvements along with a new "challenge" goal.

Mechanics

Part of the fun of puzzle games is figuring stuff out, and (like nano) the controls are always visible (except the menu controls, which are arrow keys and enter), so I encourage you not to look down here unless you're really lost. There's also now a mode (accessible from the menu) that allows you to explore the map and see what everything is.

What all the symbols mean
  • Grey blocks: solid walls
  • Grey blocks with lines through them: stationary wires
  • White blocks with lines through them: movable wires
  • Red blocks with an 'X': a closed door
  • Green '.': an open door
  • Grey blocks with an '8': a battery
  • Red '#': fire, dealing 1 HP of damage
  • Grey arrow: a one-way passage
  • Green asterisk: a checkpoint
  • Green GOAL: your goal
  • Green CHALLENGE: a goal which is a challenge to reach!
  • Last but not least, a yellow/orange arrow: you!
Assorted hints
  • Since you cannot pull the white blocks, be careful around walls.
  • If two blocks get pushed next to one another, you can't move the two together (although you can move them separately).
  • You have just enough HP and movable wires to make it through the game, no more and no fewer...well, maybe a bit more HP.
  • Figuring out how checkpoints work is probably useful, and you can always reset to the last checkpoint with 'r'.

Installation/dependencies/troubleshooting

To install and run, unpack the archive, and run

./ion_duct.sh

from a terminal inside the unpacked directory (you can also do it from outside, but just need to include the full path).

The requirements should be pretty light: it was built on a machine with a version of Arch Linux from March 2020, so glibc >= 2.30-3 and Linux >= 4.19.98-1-lts should be fine. I've tested it on an Ubuntu 22.04 machine and it seems to work, but let me know in the comments if there are issues. If you are running it on a sufficiently slow machine (or, above, in the browser version), there may be issues with lag when pressing/holding down keys, and I apologize for that but I can't really fix it now without rewriting a core part of this game's engine.

If the level looks weird, first compare to the screenshot to make sure that it's behaving as expected So far, I have seen two types of issues that are, unfortunately, terminal-dependent:

  • None of the grey walls or wires appear: that grey color is technically "bold black", and you may need to adjust your terminal configuration to see it on some systems: for example, there's an option in xterm called something like "use bright colors for bold" that you need to turn on.
  • None of the grey walls appear, and the wires look like grey lines, instead of black lines on a grey background: having bold background colors is supported (or unsupported) differently in different terminals. For some terminals (for example, xterm), you can get a background bold color by using the bold and reverse video attributes together. This is the option that makes sense to me. However, for some terminals (for example, the linux console), you need to instead use the "blink" attribute. This is a holdover from how VGA handles bold background colors. I currently only check for the linux console (since it was the only example I found), so if you are having this issue, running

    TERM=linux ./ion_duct.sh

    should resolve the issue (this is a currently untested workaround). To help resolve this issue in the future, if you ran into this bug and this fixed it, let me know in the comments below which terminal you were using so I can add it to the list.

If you have any other troubles with the colors, let me know in the comments and make sure to tell me what the output of

echo $TERM

is. Finally, if there are any issues running the shell script (which calls a pre-built, self-contained copy of the python interpreter), and you also have python >= 3.8.1-4 and ncurses >= 6.1-7 (potentially lower versions work), you can also simply run the executable python file in the included src/ directory directly.

StatusReleased
PlatformsLinux, HTML5
AuthorBaguette
GenrePuzzle
Tagsascii, Open Source, Sokoban
Average sessionA few minutes
LanguagesEnglish
InputsKeyboard

Download

Download
ion_duct-0.1.tar.bz2 (jam version) 4 MB
Download
ion_duct-linux-1.0.tar.bz2 (post-jam version) 4 MB

Development log

Comments

Log in with itch.io to leave a comment.

(+2)

This was so fun. I found the “speedrun” route first and thought, maybe I’ll try to not lose any HP by going the long way around. NOPE.

Also I have zero foresight so I literally had to reset every room until I figured out what to do, so I can’t wait to see this with some checkpoints!

(+1)

Thanks for the feedback!  I experimented with making it possible to avoid taking any damage, but I couldn't think of a good way to do it that wasn't incredibly obvious (though, as the puzzle designer, what's obvious to me is probably not obvious to other people).  I'd be interested in seeing if anyone can end the game with more than 1 HP, but I don't think it's possible...

(1 edit) (+2)

This has a lot of potential, and the health system is something I haven't seen before! (in sokoban)

(2 edits)

Thanks for the feedback!  As for the health system, the realistic answer was that implementing spikes/fire was the first thing I did because it was an easy sanity check to make sure the level worked, and then I just kept it in the game because why not.  I think I did see a similar type of system in a puzzle book, once:

https://caravelgames.com/Articles/Games_2/TLP.html

(although not a sokoban game).

(+3)

A very good puzzle game which mixes the madness of sokoban with "laser games". Despite showcasing only one level, you will find the four puzzles to exit the room quite interesting and varied and satisfying.

Terminal atmosphere adds to the feel, the only thing it is missing is an in-game legend to represent which-block-is-which.

Thumbs up!

(+1)

Thank you for the kind words!  As for an in-game legend, that's a good idea and something I can work on for a post-jam version.

(+1)

I would like to try it but

f@mkiii:~/download/ion_duct$ ./ion_duct.sh

Traceback (most recent call last):

  File "ion_duct.py", line 481, in <module>

  File "zuab/engine/game.py", line 27, in __init__

  File "zuab/interface/curses.py", line 184, in __init__

  File "zuab/interface/text.py", line 107, in add_window

  File "zuab/interface/text.py", line 144, in addch

  File "zuab/interface/curses.py", line 128, in getch

  File "zuab/interface/curses.py", line 90, in unrasterize

ValueError: chr() arg not in range(0x110000)

[1049943] Failed to execute script 'ion_duct' due to unhandled exception!

(+1)

Hi, sorry for the delay, I've never seen this error before, and I need to look into it further.  Could you tell me what distribution you're using, and what terminal you're using is (that is, the output of echo $TERM)?

(+1)

Sorry, the error went away by itself apparently!

(1 edit) (+2)

...huh, I mean, in a certain sense I'm not sure how it could have happened in the first place (I'll get to that below), but I'm glad it's working for now.

As for what was happening, the code that was hitting the bug was the part that reads back characters that have already been printed to the terminal (the reason why the code does this is so that it can join the two corners of windows together, like it does on the bottom left and bottom right, in order to make it look like they're connected).  However, somehow when it read back the character, it found neither a line-drawing character nor a valid unicode symbol, which is bizarre since those are the only two things that should have been sent to the terminal already.  Actually, the really bizarre thing is that the result from curses is already bitwise anded with 0x4000ff, which means that the argument to chr() couldn't possibly have been what the above error indicates that it was.

In any case, if I ever reproduce (and fix) this I'll be sure to add an explanation of what happened in this thread.