Categories
entertainment

Terraria: Journey’s End (Plus: Some more plague activities)

If you came for the plague activities, please scroll down.

I was a latecomer to Terraria when I first played the game in the spring of 2017. Best I recall, I saw a screenshot of something someone had built in the game, and intrigued by that creative aspect I gave it a try.

That is still probably my biggest plus for the game: building, creating. The worlds are generated, which gives you a good amount of variability to begin with. That variety includes the different zones or biomes like the ocean, desert, and jungle. Each has its own flavor, and you can build in any of them.

A house in a jungle with a roof made of living vines and plants.

The final major update has released today. The official word was that there would be some delay in Linux (and Macintosh) stability or optimizations, but so far it plays fine here.


One of the other neat things about Terraria was digging into their savegame format (with the help of some sites that publish some of the specification) with Python. Prior versions (we’ll see what 1.4 does) use what’s known as run-length encoding (RLE) to store a subset of the actual world tiles. You can think of it similar to a keyframe system in video, except it marks the last tile type and then the number of (vertically and below) tiles of the same type. Given that large parts of the world are filled with the same type of material (dirt, sand, etc.), this saves a lot of space.

Anyway, for awhile I had a lot of fun messing with that, even wrote a simple tool to turn an image file (using PIL as I recall) into background walls (something that, from a search at the time, had been done by several others).


The main thing I’m looking forward to for 1.4 is the improvements for building (including the ability to craft previously-uncraftable walls and some of the new furniture and other enhancements). They also add a feature called block-swap that speaks for itself, but will be useful for quickly changing the look of a building without having to tear everything down.

A single-mast ship with sail down (in port).

But some of the other features will be nice, including the more responsive world, updated artwork, added music, new town NPCs, and even golf.

Plague Activities (to get them out of your hair long enough to catch your breath)

As obvious, age-appropriateness depends on propensity to put things in mouth, dexterity, etc.

  1. Painting the basement walls. Requires a paintbrush and some container with water. Suffice it to say, you let the kid dip the brush in the water, then use the brush to make wet the basement wall, because it looks like they’re painting it. Could work on other surfaces like sidewalks/walkways or exterior walls. Good for a relatively unsupervised 20 minute break.
  2. Sort the things. Requires three containers, items to be sorted. Preparation: dump the things to be sorted into one bucket, then task your child to put the items of each type into the other buckets. More buckets needed if more than two types of things. Elastic task, as the more things to sort the longer it lasts, but boredom may take hold at around 20 minutes depending on complexity/enjoyability of the particular stuff being sorted. Suggested items include coins, pasta of different shapes, nuts and bolts, goats and sheep, etc.
  3. Terraria! The new version has so-called “journey mode” which lets you turn off enemies. You could build in peace, and you could play a video game while your kid(s) help you decide what to build. Something to consider anyway. Probably works better if you’re already familiar with Terraria. Not as unsupervised as some, but you get to videogame while keeping the runts entertained! Could work for some other games including Minecraft, bridge building games, Besiege, etc.
  4. Tape recorder. If you have an app or other way to play with audio recording, kids can amuse themselves quite awhile just recording, then replaying what they recorded. (At least I did when I was wee. I spent a lot of time playing by myself, in case you wondered.)
  5. Draw your own alphabet. (Requires basic alphabet skills.) 26 new drawings for new letters. Even if they take a minute to come up with each one, that’s 26 minutes back to you.
Categories
software

Pondering a Query Language for Mail

Query languages are typically used for databases. The basic formula of a query follows subject-predicate form: which entries are targeted and what to do with them.

The simplest form is “print (or return) all entries in this database.”

When you’re dealing with a single piece of mail, you don’t really need a query language. It’s just a matter of directly applying predicates to it.

But when you want to do batch operations, it seems like a query language would be much more useful.

Thankfully, there’s always python. With a few lines of this language you can do the equivalent to what you would with a query language.

Doing something like (untested):

import mailbox
import datetime

# factory to None to avoid it being an rfc822.Message
md = mailbox.Maildir('~/Mail', factory=None)
for key, mail in md.iteritems():
    if not mail['Subject']:
        date = datetime.datetime.fromtimestamp(mail.get_date())
        mail['Subject'] = "[Received on {0}]".format(date)
        md[key] = mail

This will set any mail missing a subject to have it say when it was received as the subject. That’s probably not very useful, but for other things it might be.

But it’s still a bit complicated, in that you need to know python and if you need to operate on several folders, it gets more complicated.

Also, given the number of systems mail might have passed through, all the different filters and handlers, each which may tack on its own special headers, mail is rather messy. Add to that the fact that you may need to leave them untouched for reasons of regulatory compliance and/or security, and the medium becomes a great joy to deal with.

My guess is that separating e-mail into the usable copy and the canonical copy is the best strategy. Every mail gets thrown in a read-only archive that’s untouched and only accessed to pull out of, and another copy goes to the user where they can mangle it as much as they please.

I’ll also take issue with the interfaces used for mail. There has to be a better way to build an interface for cases where people have to manually sort through many items.

A few thoughts on that:

  • Don’t necessarily show the user the whole mail as one piece. By breaking up subject, from/to, body, etc. and showing these independently, it may allow the user to make better judgments. They don’t have to look at the subject and the from/to, two types of data, in rapid succession.
  • Reshow the mail several times. By having it appear more than once, the user has less pressure to get it right in one go. In a normal interface, if they misfile the mail, it will be permanently misfiled. If they know they will see it a few more times, they can give their best guess and the system can sequester mail that has conflicting filings over multiple passes.
  • Show progress. The user seeing that they are on page X of Y has some idea of progress, but most systems, they’ll stay on the first page and the Y will diminish. They won’t have as clear an idea of how much they’ve accomplished.
  • Let modes be modes. While some activities eschew modal uses, others thrive as modes. Manual sorting is such an activity. Instead of trying to have the same interface function for both browsing and sorting, a dedicated sorting mode is perfectly fine.

When used with a query language, such a sorting activity might just be to weed out any false positives. Other times, the query language would be used to feed into the sorting, with sorting being the predicate.

It’s important to recognize that the use for e-mail can apply equally to any sequence of complex artifacts. It could be news, search results (web pages, library books, etc.). Currently, you get a large set of ordered results from services like Google, which you have little ability to easily cull out of. While the engineers work hard to guarantee the relevance of items, often a further search within the set would be easier left to the user when equipped with more advanced tools.