Revisiting my ANSI tile map

A screenshot from my revised ANSI tile map, as it appears on my BBS, Guardian of Forever.

Nearly 10 years ago, my daughter Jadzia wanted me to make a game called “Jewel Mountain.” One of my early ANSI experiments for the game was to make an RPG-style tile map in ANSI.

When I started it years ago, my initial idea was to adapt 16×16 pixel-art tiles to sprites made of ANSI text, and implement the map in 132×60 mode, since it’s higher “resolution” and the characters are square rather than rectangular. I made a working version of this years ago and some of you probably saw it. But eventually I regretted those design choices: The 132×60 terminal mode isn’t commonly used by most folks; and the 16×16 sprite size was just too big.

Do you enjoy my retrocomputing research on Break Into Chat? Please join my email list so I can share future projects with you. 📬

An early handwritten note from Jadzia with some of her ideas for a Jewel Mountain game.

But Jadzia and I could never quite nail down the right story and goals for the game, and so we didn’t get much further than the tech demos. Though I did use some of the ANSI techniques to create a few cool animations for Blocktronics over the years.

Jadzia died in 2020. I discussed continuing the project with the family, and my daughter Josie especially has had some ideas for trying to finish it. I began revisiting some of those early experiments in 2022, but I realized recently that I never discussed it on the blog. So here goes.

My main work was redoing the tile map. It’s now built around 8×4 ANSI tiles in normal 80×24 terminal mode. I’m treating half-block characters as the equivalent of pixels, so effectively these are like 8×8 pixel tiles. The tile dimensions evenly divide into the screen dimensions, so I end up with a 10×6 tile grid, which is nice.

The main tradeoff of half blocks is that they have to be solid colors. ANSI gradient characters are full blocks, so I’m avoiding them in sprites, but using them in background tiles. Another tradeoff is that I can’t mask a half-block (making half solid and half transparent, letting what’s underneath show through). I can only mask a full character.

Speaking of sprites, I completely rebuilt my ANSI sprite system. On the old map, when a sprite moved to a new tile, I simply erased the old one and drew it in the new position. It was almost like it hopped from one tile to the next. This had a big speed advantage, which is important on a BBS, where latency can be a problem. But it didn’t look natural, and I wanted this to feel more like a real video game.

So I coded a walk animation, and moved the sprite one character/line at a time from the source to the destination, with arm and leg movement. I used the Frame.js optimizations I’ve come up with over the years to make the redraws as quick as possible.

But this walk animation work led to a mismatch with the map, which was still scrolling one full tile a time. The difference between the movement of the sprite and the map was quite jarring, and I realized I also needed to make the map to scroll finely.

It took some doing to get the two in sync, but eventually I succeeded. I now have fine map scrolling and an animated sprite walk, both of which are synced to each other. It looks really good!

If you’d like to check it out in SyncTerm or your favorite terminal, telnet to guardian.synchro.net. From the main menu, choose “Externals”, then “Jewel Mountain experiments” then “Jewel 5 – 80×24 map”.


Posted

in

by

Comments

6 responses to “Revisiting my ANSI tile map”

  1. Ryan Avatar
    Ryan

    Wow, this looks super cool. I’m really sorry to hear about Jadzia and hope that this project brings back positive memories of your time with her.

  2. Daniel Kelly Avatar

    What a grand way to honor your daughter! I’ll stop in to check it out soon. Drop by aBSiNTHE sometime and say hi!

  3. Martin F Kazmaier Avatar

    Wow, this is amazing! And such a wonderful gesture as well!

  4. Jim Kulwicki Avatar
    Jim Kulwicki

    This is stellar! Great looking stuff!

  5. Eric March Avatar
    Eric March

    Hi! Me again. 🙂 Haven’t visited your blog in a long time, but I should really address that. This is really cool though, and actually reminds me of some plans I had back in the 90s to make an online BBS game similar to this idea. I was going to call it “Wasteland” (before I became aware that a PC game by that name already existed) and the idea was very similar using ANSI translation and a top-down view, similar to — well, what I much later learned was the original Wasteland game, though my inspiration was more Ultima, but post-apocalyptic. I even had some proof of concept code that worked online letting you tool around a tiny map, with a stats display of important information like health, radiation levels, etc. This was all before I started working on FANSI, I was still learning to code in GFA BASIC, and writing online games was a good way for me to learn the essential ropes as it didn’t involve graphics or sound. But then I started learning those latter concepts and quickly started moving towards real video games (and FANSI). Still, I wish I’d completed that project, as it would have been a pretty unique experience. Although I hadn’t fully worked out how I was going to make it work as an online game, which would be necessarily time-limited. That was something for later. 🙂

    1. Josh Renaud Avatar

      Eric, that’s fascinating. And glad to have you back reading and commenting on the blog!

      Were you familiar at all with the BBS game “Land of Devastation”? It also revolved around a post-apocalyptic scenario involving a “wasteland.” And it offered an optional graphical front-end client.

      https://breakintochat.com/wiki/Land_of_Devastation
      https://breakintochat.com/blog/2020/09/09/a-different-way-to-play-part-4-gterm/

Share your thoughts!