Diary

Welcome! 🙂

This is both a wiki (a website editable by all) and a blog (an online diary about the stuff Alex Schroeder reads and does). If you’re a friend or relative, you might be interested in reading Life instead of this page. If you’ve come here from an RPG blog, you might want to head over to RPG. There are other similar categories to be found on the SiteMap.

Für Rollenspieler gibt es ebenfalls eine eigene RSP Kategorie.

2021-05-10 Messaging and Chat Control

The End of the Privacy of Digital Correspondence, by Patrick Breyer: “This is to allow the providers of Facebook Messenger, Gmail, et al, to scan every message for suspicious text and images. This takes place in a fully automated process and using error-prone “artificial intelligence”. If an algorithm considers a message suspicious, its content and meta-data are disclosed automatically and without human verification to a private US-based organization and from there to national police authorities worldwide. The reported users are not notified.”

Uuuugh. 😟

Comments on 2021-05-10 Messaging and Chat Control

Time for a self-hosted xmpp server in a third world country?

Peter Kotrčka 2021-05-13 19:15 UTC


I’m not very happy with the XMPP server’s I’m on. Have you tried it, with a client on the phone, encrypting all your messages? My impression is that this isn’t very friendly.

– Alex 2021-05-13 20:12 UTC

Add Comment

2021-05-09 Version control for beginners

I was talking to @pkotrcka who said that git is hard to understand, and I agree. But there is hope: if you just start with simple requirements, then git can be simple to use.

What are simple requirements? “I want to keep this directory under version control so that I can recover old revisions of what I wrote.”

Slightly harders is this: “I want to keep all my dot files under version control but they aren’t in a single directory.” The way to solve this is to put them all in a directory. What I do is I have a directory with all these files, and elsewhere I just have symlinks pointing there.

Here you can see that a bunch of dot files from my home directory all live in ~/src/home.

alex@melanobombus:~ $ ls -la | grep '>' | cut -c 66-
.XCompose -> /home/alex/src/home/.XCompose
.addresses -> /home/alex/src/home/.addresses
.bash_aliases -> /home/alex/src/home/.bash_aliases
.bash_logout -> /home/alex/src/home/.bash_logout
.bashrc -> /home/alex/src/home/.bashrc
.ecompleterc -> /home/alex/src/home/.ecompleterc
.gitconfig -> /home/alex/src/home/.gitconfig
.gitignore -> /home/alex/src/home/.gitignore
.pause -> /home/alex/src/home/.pause
.profile -> /home/alex/src/home/.profile
.rcirc-authinfo -> /home/alex/src/home/.rcirc-authinfo
.selected_editor -> /home/alex/src/home/.selected_editor
.signature -> /home/alex/src/home/.signature
.vf1-bookmarks.txt -> /home/alex/src/home/.vf1-bookmarks.txt
lynx_bookmarks.html -> /home/alex/src/home/lynx_bookmarks.html

Starting a local repository: init

OK, so now you have a directory full of files. Time to create a local repository.

alex@melanobombus:~/src/home $ git init

This creates a hidden “.git” directory and populates it with whatever git needs.

Adding files to your repository: commit

Now that you have a local repository, all you need are two commands:

git add .
git commit -m "new stuff got added"

“git add” just “stages” any new files for commit, and “.” means all of the files in this directory and all its subdirectories, i.e. all of them.

“git commit” does the actual commit, adding the files to your local version control directory (the “.git” subdirectory), and “-m” indicates that what follows is the commit message. Eventually, I hope you will write better messages. If you don’t use the “-m” option, git launches your favourite editor and you can type a longer message.

Longer commit messages should consist of a short summary (50 characters or less), followed by an empty line, followed by as much explanation you deem necessary, line wrapped.

One common mistake I used to make was to forget to run “git add”. Nothing got staged, and then the commit didn’t see any staged files so nothing happened. My files were still there, modified, unstaged, and uncommitted.

Another common mistake I used to make was that after I had used “git add” to stage some files, I would discovered a mistake I had made and I’d edited the file and use “git commit” without using “git add” again. The problem is that git commits what you staged and not the working directory. A staged file isn’t “marked” for commit, the changes are copied to a “stage” (called the “index”). Thus, if you edit the file again, the staged changes are not updated. You need to “git add” them again. Otherwise, you’ll experience what I used to experience a lot: you commit your staged changes, use “git status” and the file is still noted as having been modified, and your fix isn’t part of the commit!

To amend this mistake, git has an “--amend” option to “git commit”:

git add .
git commit --amend -m "new stuff got added"

You can also make no changes and amend the last commit to fix typos in your commit message!

git commit --amend -m "new things got added"

Finding out what’s going on: status

“git status” gives you a short message discribing what’s going on. I use it a lot.

alex@melanobombus:~/src/home $ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   .ecompleterc
	modified:   gpg.conf

no changes added to commit (use "git add" and/or "git commit -a")

Let’s see: “On branch …” tells me what the current branch is. As long as your requirements are as simple as what we started with, you don’t need to worry about it.

“Changes not staged…” means that you have modified or new files. As you can see, git helpfully lists some of the commands you might want to use. If you want to stage them all, use “git add .” as mentioned above. Alternatively, stage and commit them individually:

alex@melanobombus:~/src/home$ git add .ecompleterc && git commit -m "new recipients"
[master 1c9c3b7] new recipients
 1 file changed, 18 insertions(+), 7 deletions(-)

Finding out what changed: log

In the previous section, we saw that the commit we made created a commit numbered “1c9c3b7”. The command to show us all the commits is “git log”. As you can see, “1c9c3b7” is actually just an abbreviation for “1c9c3b7fa0b45b50be1449a78b86ee3cff636194”.

alex@melanobombus:~/src/home$ git log
commit 1c9c3b7fa0b45b50be1449a78b86ee3cff636194 (HEAD -> master)
Author: Alex Schroeder <alex@gnu.org>
Date:   Sun May 9 10:21:58 2021 +0200

    new recipients

commit af8e2cebf19e15f73402e73e3d956749f27b5be9
Author: Alex Schroeder <alex@gnu.org>
Date:   Sun May 9 09:44:44 2021 +0200

    New aliases for bc and cal

commit d89f0d0cab1e54640c6ab151c908dea28659b3aa
Author: Alex Schroeder <alex@gnu.org>
Date:   Tue Apr 13 19:49:07 2021 +0200

    Add tabletop alias

…

Remember how we said good commit messages start with a single, short line of 50 characters or less? Well, the reason is that you can use “git log --oneline” to get very compact output. There are also a gazillion other ways to print the log, but that’s the most useful alternative right now. 😄

Showing what changed: diff

Before talking about changes let us quickly review the working directory, the stage, and commits: The working directory is what you’re looking at when you run “ls” or when you edit them. The “staged files” are the files you added using “git add”.

By default, “git diff” shows the difference between the working directory and the stage.

alex@melanobombus:~/src/home$ git diff
diff --git a/gpg.conf b/gpg.conf
index ee169ee..65ad9e3 100644
--- a/gpg.conf
+++ b/gpg.conf
@@ -135,7 +135,7 @@ charset utf-8
 #keyserver ldap://keyserver.pgp.com
 
 # gpg --keyserver ... --search-key ...@...
-# keyserver hkp://keys.gnupg.net
+# keyserver hkps://keys.openpgp.org
 # keyserver hkps://api.protonmail.ch
 keyserver hkps://keys.openpgp.org
 

If you have staged but not commited changes, use “git diff --staged”. Right now, I have committed everything so the stage is empty:

alex@melanobombus:~/src/home$ git diff --staged

Notice what happens when I stage my change: “git diff“ shows no changes and “git diff --staged“ shows the change!

alex@melanobombus:~/src/home$ git add .
alex@melanobombus:~/src/home$ git diff
alex@melanobombus:~/src/home$ git diff --staged
diff --git a/gpg.conf b/gpg.conf
index ee169ee..65ad9e3 100644
--- a/gpg.conf
+++ b/gpg.conf
@@ -135,7 +135,7 @@ charset utf-8
 #keyserver ldap://keyserver.pgp.com
 
 # gpg --keyserver ... --search-key ...@...
-# keyserver hkp://keys.gnupg.net
+# keyserver hkps://keys.openpgp.org
 # keyserver hkps://api.protonmail.ch
 keyserver hkps://keys.openpgp.org
 

If you use “git status” it’ll tell you what to do in order to unstage the change:

alex@melanobombus:~/src/home$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   gpg.conf

Let’s try it:

alex@melanobombus:~/src/home$ git reset HEAD .
Unstaged changes after reset:
M	gpg.conf

But let’s go back to “git diff” for a moment. We saw how “git log” gives us a history of all the changes. We can refer to those commits as well. A useful shortcut is this: append “^” to a commit to get the previous one. So if you want to see what the diff “New aliases for bc and cal” is all about, take the first few characters of the commit, “af8e2c” instead of “af8e2cebf19e15f73402e73e3d956749f27b5be9”, and let’s look at the difference between it’s predecessor “af8e2c^” and “af8e2c” itself.

alex@melanobombus:~/src/home$ git diff af8e2c^..af8e2c
diff --git a/.bash_aliases b/.bash_aliases
index cbce85d..00f956c 100644
--- a/.bash_aliases
+++ b/.bash_aliases
@@ -24,3 +24,9 @@ alias serve="python3 -m http.server"
 
 # mastodon archives
 alias tabletop="cd ~/Documents/Mastodon/ && mastodon-archive text kensanata@tabletop.social"
+
+# load math library and set scale=20 for the calculator
+alias bc="bc -ql"
+
+# show more months, add week numbers, start on Mondays
+alias cal="ncal -A2 -B1 -w -M"

Going back in time: checkout

Say you made a bunch of changes to one of your files and you really just want to get a copy of the file at some point in time. Use “git checkout” to go back to a particular commit. Let’s take the above situation. We look at the difference between “af8e2c” and it’s predecessor, “af8e2c^”. Say we want to go back in time: we want all the files from before that change.

First, verify that there are no changes we need to make:

alex@melanobombus:~/src/home$ git status
On branch master
nothing to commit, working tree clean

Looking good, let’s go back in time:

alex@melanobombus:~/src/home$ git checkout af8e2c^
Note: checking out 'af8e2c^'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at d89f0d0 Add tabletop alias

OK, so we checked out the predecessor of the af8e2c change. The “detached HEAD” state means that we moved back in time. You can think of the commits like the branch of a tree: it starts somewhere, and it has a tip, the so-called “head”. That’s where a new commit to the same branch is added. But if we move back in time, we move back along the branch, away from the “head”. We’re somewhere in the middle of a branch and we shouldn’t make any changes – at least for now. Let’s keep it simple: just look, don’t touch! 😃

Look at the old files, make copies, load them into your programs, whatever. And when you’re done, it’s time to return to the head. Reattaching head, I guess? Let’s do this!

We’ll use “git checkout” again. Instead of specifying a commit, however, we simply specify the default branch – implying the tip of the branch, the “head”.

alex@melanobombus:~/src/home$ git checkout master
Previous HEAD position was d89f0d0 Add tabletop alias
Switched to branch 'master'

Make sure we’re back! Remember, “git status” is your friend.

alex@melanobombus:~/src/home$ git status
On branch master
nothing to commit, working tree clean

Troubleshooting: reset

If you’re like me, however, things won’t be as smooth as this. There will be mistakes. Every body makes them, no worries. As long as you committed your changes, you should be able to get them back somehow.

Here’s what happened to me as I was preparing the example:

alex@melanobombus:~/src/home$ git checkout af8e2c^
error: Your local changes to the following files would be overwritten by checkout:
	.ecompleterc
Please commit your changes or stash them before you switch branches.
Aborting

Whaat? Apparently a file had been modified. If we go back in time, this modification will be overwritten by the older copy, and since we didn’t commit our change, the change will be lost.

In this case, I figured I might want to keep the change. I verified this by using “git diff”. Remember? It shows you the difference between the working directory and whatever you have staged (the “index”). Do I want to keep these changes, or toss them?

alex@melanobombus:~/src/home$ git diff
diff --git a/.ecompleterc b/.ecompleterc
index 4208244..19dcabc 100644
--- a/.ecompleterc
+++ b/.ecompleterc
…
(lots of stuff)

Let’s keep it by adding and committing the changes:

alex@melanobombus:~/src/home$ git add .
alex@melanobombus:~/src/home$ git commit -m "Updates to the mail addresses"
[master ff8b3f3] Updates to the mail addresses
 1 file changed, 5 insertions(+), 5 deletions(-)

Cool!

What happens if we want to toss changes changes? We want git to make a hard reset! Here’s me accidentally deleting a file using “rm” (should have used “trash” instead!), finding out about using “git status”, and then undoing it using “git reset --hard”.

alex@melanobombus:~/src/home$ rm .ecompleterc 
alex@melanobombus:~/src/home$ git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	deleted:    .ecompleterc

no changes added to commit (use "git add" and/or "git commit -a")
alex@melanobombus:~/src/home$ git reset --hard
HEAD is now at ff8b3f3 Updates to the mail addresses
alex@melanobombus:~/src/home$ git status
On branch master
nothing to commit, working tree clean

Phew! We got our file back.

There are other options to “git reset”, but you already guessed that. For now, I don’t think you’ll need them.

How to get back on track: a summary

If you don’t know what you’re doing, use “git status” and read it carefully.

If there are modified files and you forgot what changed, use “git diff” to look at the changes.

If there are new and modified files and you want to add them to your repo, use “git add .” (for the whole directory and all its subdirectories), and then use “git commit -m “some message”” to make a commit.

If you want to know about all your past commits, use “git log”. Hopefully you wrote good and long commit messages! Use “git log --oneline” if you only write short commit messages. 😅

If you want to know about a particular change in the past, usig “git diff 123456^ 123456” where 123456 are the first few digits of the commit “hash”, that weird code you see in the log for every commit.

If you want to go back in time, use “git checkout 123456^” to return to a time before change 123456 was made. Use “git checkout master” to come back to the present (the “head” of the default “branch”).

If there are changes you don’t want, that you can’t explain, if you just want to return to whatever you checked out, use “git reset --hard”.

Good luck!

That’s it. Hopefully that helps you get started.

Comments on 2021-05-09 Version control for beginners

An alternative to changing relevant files to symlinks in your home directory is to simply make ~/ a git repository.

The problem is that git status by default shows all files it doesn’t know about as “untracked” - but that can be remedied by adding:

[status]
    showuntrackedfiles = no

to your ~/.git/config.

The upside is that you don’t have to move the file, make a symlink, and go somewhere else to commit.

I use this “trick” in / on all my machines to keep track of configuration files I change.

Adam 2021-05-09 09:45 UTC


Interesting, thanks. I did not know about not showing untracked files. Does that work well if some of your subdirectories are again git repositories?

– Alex 2021-05-09 10:45 UTC


Yes, it works fine - I have plenty of git repositories in subfolders.

git will look for .git/ in the current directory, then the parent, then the grandparent etc. until it finds one, and that defines what repository you are “in”.

The only catch is that if you think you are in a git repo in a subfolder, and isn’t actually a repo, then you’re in a subfolder of the top/parent repository. In practice this very seldom confuses me; I might be weird that way, though.

Adam 2021-05-11 21:00 UTC


To avoid the potential confusion with Adam’s trick you can use a different name for the .git folder at your top level directory. I have the following alias I use to manage all my user level configuration files, etc.:

home='git --git-dir="${HOME}/.home-git" --work-tree="${HOME}"'

To set it up, go to your home directory and git init && rename .git .home-git (or maybe you could just do home init?). From then on use home for you config files, and git for everything else.

(I’m not sure why I added that --work-tree option is/was important… it may have been related to when I didn’t have the same username on all computers?)

– Björn Buckwalter 2021-05-14 17:05 UTC


Ending up with two different commands for the two kinds of repositories is a great idea.

Definitely a level tinkering that goes beyond “for beginners”, though! 😀

– Alex 2021-05-14 18:18 UTC

Add Comment

2021-05-08 No programming

It’s weird. Right now I don’t feel much like programming in my free time. None of my projects feel too exciting, nothing seems to need my immediate attention. I don’t feel like working on C code because it’s hard. I don’t feel like working on Perl code for my wikis (Oddmuse and Phoebe) because there are no feature I feel I need right now. I don’t feel like writing random tables for my Hex Decribe random generator, and I don’t feel like tinkering with the map generation algorithms of Text Mapper. My heart’s not into drawing more elements for the Face Generator.

Today we tried to make a backup and pluged the laptop power supply (19V, 3.42A) into the external backup disk (12V, 2A), and now it no longer works. I took it out of the enclosure but I have no other enclosure, so I can’t tell if there’s a way to keep using it. I tried an old disc I still have with the enclosure and that didn’t work so perhaps it’s just the enclosure that’s fried. The drive in question is a Samsung HD154UI disk (1.5TB), apparently from 2010. When I got new backup disks for my wife, I kept these for myself, as a replacement for the old pair of Western Digital MyBook Essential disks (1TB), apparently from 2009. Well, so what was I going to do? I dug up one of those old WD disks and used it instead. After a few hours the backup was made and both my external backup and my wife’s external backup are ready to be taken to the office, where we’ll pick up the other set of external backups to bring back home. That felt like enough computering for the whole weekend, to be honest.

I’m not sure why I’m somewhat disinterested in programming right now. My hands need more rest, I think. Less typing. When I get up in the morning, I often feel like somebody stepped on them. It takes a minute or two for me to get full motor control back. That’s not good. It’s also why I’m going to keep the update short.

If you’re looking for short updates, you can always check my fediverse account, @kensanata. I sometimes post pictures there, too. There’s a feed, too.

We recently went out and bought a staff and now I’m teaching her the “20 Jo Suburi by Morihiro Saito Sensei” (you’ll find them on YouTube and elsewhere, I’m sure). And we’re also practicing the “Tada Sensei jo exercises”, a video by Video Aikikai Italia (La Spezia 2006). I’m trying hard to spend a few minutes doing them every day, believing that if you do something every day (or at least: very often!), no matter for how much time you spend on it, a habit starts forming.

This is how I learned to run. Start running, for ten minutes, a quarter of an hour, twenty minutes, half an hour, keep at it. Go even if the weather is a bit colder than you’d like, or a bit windier than you’d like, or a bit rainier than you’d like. Just focus on “I have to run every opportunity I get”. Do it two or three times a week. And in a year, you’ll get nervous when the sun is shining and you’re sitting inside, thinking: I was born to run – I really need to get out, right now! And when you do, it’s a glorious thing.

In that year, your body will have changed. There are now muscles, and tendons, and lung volume, and reserves, that you did not have when you started. Slowly, bit by bit, you rebuilt your body. It is now fit for what you are doing.

Sure, you probably won’t be running a marathon. But when my wife started running, she could barely go those 10 minutes around the block, huffing and puffing, red in the face. And two years later she was going to races for 10km, and a year or two later, she was going for the half-marathon. It takes time, and dedication, no doubt. But it also starts in very small steps. Steps that are easy to do. Steps that help you build a habit. Steps that allow you to change yourself. Bit by bit.

Anyway, we also got our first COVID-19 shots yesterday (Moderna) and now our left shoulders hurt and we can’t run and we can’t lift the jō above our heads, and that already makes us sad. But I still take the staff every day and practice just a few swings, and I’m telling myself: it doesn’t matter if my training looks like I’m 80 years old. If I’m lucky I will be doing this when I’m 80 years old! You can do this, even if you’re 80 years old. And thus, you can do it now, even if you feel like your left arm is 80 years old.

And with that, I have to go. My hands hurt.

Comments on 2021-05-08 No programming

I’m glad to hear you got your vaccines!

I’ve found that when I lose interest in a hobby or habit or anything else, it helps to do just a tiny bit every day, kind of like what you said about building a habit. It won’t get you out of the funk any faster, but it lets you know exactly when you start regaining interest, and helps to keep momentum for when you return to it. (Of course, that’s easier said than done. My desktop, both physical and virtual, is cluttered with abandoned projects - but almost all the ones I have finished faced a period of disinterest and survived, so I guess the rule works when I manage to follow it.)

– Malcolm 2021-05-09 07:56 UTC


Interesting corollary, haha!

A related post: Momentum Has a Quality All of Its Own where noism argues for “weekly sessions that you run come hell or high water”.

– Alex 2021-05-10 07:44 UTC


How about a village generator? With everyone in it? Some inspiration:

– Björn Buckwalter 2021-05-14 16:50 UTC


It’s an interesting idea. At the same time, however, how would that ever be relevant at the table? I don’t think I hardly ever need four or five non-player characters per settlement. It’s a bit like a movie: sure, there are a ton of nameless faces in the background, but how many of them have a name the protagonists remember, a face the protagonists can recall? A handful, I’d wager. And I’m suspecting that this might be true for settlements as well.

To put it another way: if the players need a blacksmith, and it isn’t important, then there is one, nameless, and the interaction is quick, pay the money, get the goods, done. If there is dramatic tension to be had, then it’s different, of course. I’d say this should be rare: does the blacksmith guild hate you? Are orcs the best blacksmiths there are? If so, perhaps the scene can be tense, and perhaps the blacksmith needs a name after all.

I fear my own generator doesn’t live up to these principles, unfortunately. If you check out the village generator, it generates:

  • a number of people in case there’s mass combat
  • some guard animals in case there’s a smaller fight
  • some powerful people with levels (in the one I’m looking at: a level 10 warrior, a level 8 sorcerer, a level 2 wizard
  • a dragon hunter who happens to be a level 8 warrior who wants the party to come slay a dragon with him

All non-player characters generated with levels have names, a portrait, treasure, sometimes with a mission.

The generator can also produce the leaders of the local branches of secret societies, the members of a travelling circus, war veterans, and so on.

Sometimes, I think it’s a bit much. It’s so long! Then again, I often thing: every one of these villages could be a starting village. To be really good starting villages, however, there should be more missions. I’m not sure whether adding a named blacksmith, a named rope maker, a named baker, or any of the other jobs would help.

Perhaps I need to see or hear of an example of play where all the data actually made the game better. If I as the referee have to sit down and prep the town for half an hour with a highlighter, then I’d say I’d rather spend that half an hour adding the two or three people I know my players will look for by myself. At least that seems like a more enjoyable way to spend my time.

As an example, I offer the town table. The town generator generates two kinds of towns. The one I’m referring to contains the phrase “protected by a large keep”. It’s modelled after the classic keep on the borderlands. I think looking at the ten towns it produces per page is an interesting exercise: what do you like about it, and why? Right now, I think I like the village generator above the best: it’s limited in scope. What do you think?

– Alex 2021-05-14 18:16 UTC

Add Comment

2021-04-30 Trunk: Dropping Lists

I wrote the software that runs Trunk, a kind of directory for the fediverse. There are lists (topics), suggested by people, then people volunteer to be on the lists because they say they’ll write about the topic, and fediverse newcomers interested in the various topics can look at the lists and they’ll find some people to follow. It’s good to get started, even if it isn’t ideal. There are other options, of course: Mastodon instances also recommend users to newcomers, admins can add accounts to the list that all newcomers follow when they join, users can use groups hosted externally (accounts that boost all the messages that mention them). Still, Trunk is a small effort trying to improve the situation.

When people approach one of the Trunk admins and suggest a new list, we usually ask them to help us find a bunch of people that will join them on the list. We don’t want there to be single-person lists, for example. The number we ask for is often three other accounts, so four in total. Five is better. But as we all know, life happens, interests change, and the admins sometimes go through the lists and try to remove inactive accounts and all that. So lists can shrink, too, and eventually we end up with the situation we wanted to avoid: empty lists, single-person lists, lists that are too small.

What to do?

Recently some admins asked me to look into helping to automate the task of possibly removing lists that don’t have enough people on them. I’d like to describe what I have in mind so that people can provide feedback. Perhaps there’s something I’m not seeing and putting the idea out there before writing code seems like the right idea.

We already put the empty lists at the bottom of the front page. I’m proposing we do the following instead:

  • automatically move all lists with less than five members to a separate page
  • this check happens every time an account is removed
  • link to that page from the bottom of the front page
  • thus, new lists that don’t meet the minimum requirement also start out on that separate page

The result would be that there are less lists visible on the front page, and of the lists that are shown have a least five members.

Tools that use the API no longer see the lists with less than five members.

Existing members of these lists can still try and find people to join them in order to get the list back to the front page.

When volunteering for lists, nothing changes: lists with less than five members are still shown, so that particular page remains as crowded as ever.

What do you think? If you have feedback, tag @trunk on the fediverse and we’ll see it. 😁

Links

Add Comment

2021-04-20 Writing 2D Cellular Automata using uxn

Uxn is a portable 8-bit virtual computer inspired by forth-machines, capable of running simple tools and games programmable in its own esoteric assembly language. The distribution of Uxn projects is not unlike downloading a ROM for a console, as Uxn has its own emulator.

It comes with a few programs out of the box, a simple drawing program, a simple tracker, a simple editor.

It’s absolutely fascinating!

Sadly, I also don’t know how to write assembler, or how to think assembler, and I think I would need a very, very simple idea to get started. Something like a 2D game of life visualisation or something like that.

There’s this super short introduction to assembly and to uxambly, the programming language for the Uxn stack-machine. That’s all I had.

The idea was simple: have a line of cells. Every generation, a cell lives if it has at least one live neighbour and it dies if the neighbours are either both alive or both dead. Draw a dot for every live cell, draw a row for every generation.

Here’s the code that I managed to write over the last few days.

%RTN { JMP2r }
%GOTO { JMP2 }
%GOSUB { JSR2 }

( devices )

|0100 ;System { vector 2 pad 6 r 2 g 2 b 2 }
|0110 ;Console { vector 2 pad 6 char 1 byte 1 short 2 string 2 }
|0120 ;Screen { vector 2 width 2 height 2 pad 2 x 2 y 2 addr 2 color 1 }
|0130 ;Audio { wave 2 envelope 2 pad 4 volume 1 pitch 1 play 1 value 2 delay 2 finish 1 }
|0140 ;Controller { vector 2 button 1 key 1 }
|0160 ;Mouse { vector 2 x 2 y 2 state 1 chord 1 }
|0170 ;File { vector 2 pad 6 name 2 length 2 load 2 save 2 }
|01a0 ;DateTime { year 2 month 1 day 1 hour 1 minute 1 second 1 dotw 1 doty 2 isdst 1 refresh 1 }

( program )

|0200 

	( theme ) #54ac =System.r #269b =System.g #378d =System.b
	,main GOTO

BRK

@main ( -- )

	( run for a few generations ) #00 #FF
	$loop
		OVR #00 SWP ,print-line GOSUB
		,compute-next GOSUB
		,copy-next GOSUB
		( incr ) SWP #01 ADD SWP
		( loop ) DUP2 LTH ^$loop JNZ
	POP2

BRK

( 64 cells )

@cell [ 0001 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
   	0000 0000 0000 0000 0000 0000 0000 0000
	0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
   	0000 0000 0000 0000 0000 0000 0000 0000 ]

@next [ 0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
   	0000 0000 0000 0000 0000 0000 0000 0000
	0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
   	0000 0000 0000 0000 0000 0000 0000 0000 ]

@print-line ( y -- )
	( set ) =Screen.y
	
	( loop through 64 cells ) #00 #FF
	$loop
		( copy ) OVR #00 SWP DUP2
		( pos  ) =Screen.x
		( addr ) ,cell ADD2
		( draw ) PEK2 =Screen.color
		( incr ) SWP #01 ADD SWP
		( loop ) DUP2 LTH ^$loop JNZ
	POP2

RTN

@compute-next ( -- )
	( loop through 62 cells ) #01 #FE
	$loop
		OVR DUP DUP ( three copies of the counter )
		#01 SUB #00 SWP ,cell ADD2 PEK2
		SWP
		#01 ADD #00 SWP ,cell ADD2 PEK2
		( the cell dies if the neighbors are either both dead or both alive, i.e. Rule 90 )
		NEQ
		( one copy of the counter and the life value )
		SWP #00 SWP ,next ADD2 POK2
		( incr ) SWP #01 ADD SWP
		( loop ) DUP2 LTH ^$loop JNZ
	POP2

RTN

@copy-next ( -- )

	( loop through 64 cells ) #00 #FF
	$loop
		OVR DUP ( two copies of the counter )
		#00 SWP ,next ADD2 PEK2 ( one copy of the counter and the value )
		SWP #00 SWP ,cell ADD2 POK2
		( incr ) SWP #01 ADD SWP
		( loop ) DUP2 LTH ^$loop JNZ
	POP2

RTN

Looks like a Sirpinski triangle

Looks like a Sierpiński triangle!

If you have suggestions for my assembler code, let me know!

Comments on 2021-04-20 Writing 2D Cellular Automata using uxn

Now with a small pseudo-random number generator!

%RTN { JMP2r }
%GOTO { JMP2 }
%GOSUB { JSR2 }

;seed { x 1 w 2 s 2 }

( devices )

|0100 ;System { vector 2 pad 6 r 2 g 2 b 2 }
|0110 ;Console { vector 2 pad 6 char 1 byte 1 short 2 string 2 }
|0120 ;Screen { vector 2 width 2 height 2 pad 2 x 2 y 2 addr 2 color 1 }
|0130 ;Audio { wave 2 envelope 2 pad 4 volume 1 pitch 1 play 1 value 2 delay 2 finish 1 }
|0140 ;Controller { vector 2 button 1 key 1 }
|0160 ;Mouse { vector 2 x 2 y 2 state 1 chord 1 }
|0170 ;File { vector 2 pad 6 name 2 length 2 load 2 save 2 }
|01a0 ;DateTime { year 2 month 1 day 1 hour 1 minute 1 second 1 dotw 1 doty 2 isdst 1 refresh 1 }

( program )

|0200 

	( theme ) #2aac =System.r #269b =System.g #378d =System.b
	,main GOTO

BRK

@main ( -- )

	,seed-line GOSUB
	( run for a few generations ) #00 #FF
	$loop
		OVR #00 SWP ,print-line GOSUB
		,compute-next GOSUB
		,copy-next GOSUB
		( incr ) SWP #01 ADD SWP
		( loop ) DUP2 LTH ^$loop JNZ
	POP2

BRK

( cells )

@cell [ 0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
   	0000 0000 0000 0000 0000 0000 0000 0000
	0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
   	0000 0000 0000 0000 0000 0000 0000 0000 ]

@next [ 0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
   	0000 0000 0000 0000 0000 0000 0000 0000
	0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
        0000 0000 0000 0000 0000 0000 0000 0000
   	0000 0000 0000 0000 0000 0000 0000 0000 ]

@print-line ( y -- )
	( set ) =Screen.y
	
	( loop through cells ) #00 #FF
	$loop
		( copy ) OVR #00 SWP DUP2
		( pos  ) =Screen.x
		( addr ) ,cell ADD2
		( draw ) PEK2 =Screen.color
		( incr ) SWP #01 ADD SWP
		( loop ) DUP2 LTH ^$loop JNZ
	POP2

RTN

@compute-next ( -- )
	( loop through 62 cells ) #01 #FE
	$loop
		OVR DUP DUP ( three copies of the counter )
		#01 SUB #00 SWP ,cell ADD2 PEK2
		SWP
		#01 ADD #00 SWP ,cell ADD2 PEK2
		( the cell dies if the neighbors are either both dead or both alive, i.e. Rule 90 )
		NEQ
		( one copy of the counter and the life value )
		SWP #00 SWP ,next ADD2 POK2
		( incr ) SWP #01 ADD SWP
		( loop ) DUP2 LTH ^$loop JNZ
	POP2

RTN

@copy-next ( -- )

	( loop through cells ) #00 #FF
	$loop
		OVR DUP ( two copies of the counter )
		#00 SWP ,next ADD2 PEK2 ( one copy of the counter and the value )
		SWP #00 SWP ,cell ADD2 POK2
		( incr ) SWP #01 ADD SWP
		( loop ) DUP2 LTH ^$loop JNZ
	POP2

RTN

@seed-line ( -- )
	#00 =DateTime.refresh
	~DateTime.second =seed.x #0000 =seed.w #e2a9 =seed.s
	( loop through cells ) #01 #FE
	$loop
		OVR ( one copy of the counter )
		,rand GOSUB
		#10 AND ( pick a bit )
		SWP #00 SWP ,cell ADD2 POK2
		( incr ) SWP #01 ADD SWP
		( loop ) DUP2 LTH ^$loop JNZ
	POP2

RTN

( https://en.wikipedia.org/wiki/Middle-square_method )

@rand ( -- 1 )
	~seed.x #00 SWP DUP2 MUL2
	~seed.w ~seed.s ADD2
	DUP2 =seed.w
	ADD2
	#04 SFT SWP #40 SFT ADD
	DUP =seed
RTN

Random noise

– Alex 2021-04-22 18:49 UTC


Related stuff by @eloquence:

– Alex 2021-04-23 09:31 UTC

Add Comment

2021-04-18 Blogosphere

Yet another list of links to blog posts I liked, inspired by the read through of @jmettraux’s End of Week Links 16. Like John, I get my links from the RPG Planet. Please join us, if you haven’t already.

“A thousand miles and a thousand years. That’s the Middle Ages as a setting for popular fiction and reference frame for Fantasy. Compared to many popular fantasy settings, that’s tiny. But there’s so much stuff in this little box. More space than you could ever possibly need to tell your stories” How large does a setting have to be?, by Spriggan’s Den. I often wonder about that when reading some adventure or setting background. On the one hand, we barely remember what happened one thousand years ago. Think about it. When was the last time you saw ruins that were 1,000 years old? 2,000 years? And yet, there are settings with back history going back several thousand years (the Wilderlands of High Fantasy being the one I remember right now). Totally unnecessary, I think. And yet… Thinking about the longevity of elves: even if they are not immortal and just live to a thousand years, two thousand years is something their grandparents might have been involved in, like my grandfather’s involvement in the second world war. It’s not something I know much about, but I certainly read about the war. And I know how to read the signs: I recognise the bunkers and tank barriers that dot our landscape. So perhaps we need to add more history than makes sense on the human scale? And yet, think about it. The bronze age was 3,000 years ago or so? City states 5,000 years ago? Agriculture 10,000 years ago? I’m hazy on the details. Modern humans about 300,000 years ago? I guess you could go all the way with Robert E. Howard’s The Hyborian Age, but I think that’d be weird. Either you wanted to link it up with the present in which case great, use the Hyborian Age, or you don’t, in which case you can simply posit your world as-is without having to trace a history through the millennia, or only as far as you actually need it to provide some texture. For example, my setting “an orc settlement style unchanged ever since the War of the Landgrab”, “a relic from the Old Lizard Wars”, “forged in Asgard by Ábria Proudaxe during the Vampire Wars”, etc. Who knows what else happened back then? Nobody cares unless it affects their magic items, I’m sure.

More about deep time: “Today their culture is old, proud, hide bound, jaded and decadent. You cannot tell them anything they have not seen before. Novelty is a precious thing.” Still Here: Lizardfolk culture post, by Seed of Worlds. I love such posts about culture and time. I first thought about this in a game with some elves played by @oliof, if I remember correctly. They basically told us: “Why fight? Let’s wait for 50 years and they are all dead anyway…” 🧝🧝 Well, if you put it that way…

“Some people look for epic battles – I look for epic ambushes. I try to scout and prepare so that the enemy is totally surprised and totally overwhelmed, all die or surrender in the first round.” Game design: life experiences, by the Viking Hat GM. This is my thinking exactly. And this is why I like my fights to be over in two rounds (at least that’s the goal). The last round is the most interesting one, so it’s more exiting if every round could be the last one. And if my players are well prepared, their plans just work, not much die rolling required. Some people might thing that anticlimactic, but as far as I am concerned, the planning was part of the game, and if the plan was well thought ought, we don’t need to roll to figure out whether it worked, unless there is some surprise change circumstances.

“How do you judge what was an important early influence? This is my (undoubtedly shoddy) rubric: if you look at it now, you still feel a visceral reaction to the possibilities it hints at.” (a repost from 2013) A Visual Tour of Boyhood Influences, but Tales of the Grotesque and Dungeonesque. “If I’d been called on to run a D&D campaign at age 10 or 12, these are the images and plots I would have drawn on to provide the inspiration for my game. … What were your earliest childhood fantasy inspirations? What did your fantasy world look like back then?” My Earliest Childhood Fantasy Inspirations, by DIY and Dragons. As for myself, I don’t know. I read Perry Rhodan, Darkover, Dragonriders of Pern, Karl May, and Jules Verne as a teenager. I’m not sure whether these influenced me in my gaming: there’s precious little of a fantastic science-fiction universe in my games, nor psychic redheads, not a lot of sexual themes, no riding of dragons, no bonding with huge creatures, no adventures in Kurdistan or North America, and precious little of strange submarines and descents into the centre of the earth.

“They’re a sub crew, piloting a demon-powered submarine through an eldritch, haunted water-world called the Bathosphere. To help capture the feeling of a crew with titles and jobs … I’ve made a menu of party roles for them. … what the player is in charge of calling and what their duties are. … The duties are an ad hoc mixture of notes you might be in charge of taking, and just a fun little flavor thing.” An OSR experiment: Party roles, by Seventy-Seven Vicious Princes. I guess this is something I’d like to see but that I never get to see: players taking on the roles of diplomat, pilot, quartermaster, dungeoneer, fireteam leader, ritualist, scrapmaster, epicure, jailer, divemaster… Inspiring! Perhaps I should think of it in terms of inspiring names and cool privileges instead of thinking of it in terms of duty: not who must draw the map, but who gets to decide which corridors to pick and what the marching order is going to be, for example.

Something I’ve brought up a few times in discussions on Mastodon was this: “I suspect that the reason the D&D campaigns go on for so long are built into the system. Spell levels structure D&D gameplay: on the one hand, every new spell level attained changes the gameplay itself (suddenly you can fly, or fireball large groups of kobolds), and it also advertises that change ahead of time in the rules: if you play until you get to level so and so, you’ll be able to do this and that. And immediately, people start dreaming.” Changing Gameplay Over Time.

“… maybe make a double attack and if both succeed you perform the maneuver, … utilize a contested strength roll. You then give the enemy who has suffered under the technique a disadvantage – next strike gets a bonus to hit them, … they degrade their armor class. You start thinking of how to balance this, … what class restrictions lay around it, and ask how will you rectify this maneuver with weapons that aren’t blade or blade-like. I recommend by default: don’t do this.” Less Rules To Do More: Combat Maneuvers, by Aboleth Overlords. I agree! At the time, I phrased it as “nobody gets to push Conan around, trip him or disarm him, unless he’s out of hit-points.” Combat Maneuvers.

“… there are tons of issues that come up when how we use rules conflicts with why rules were written that way. A gamer who’s looking forward to delight but is handed an elaborate fairness engine? Boring! A GM who’s excited to share their knowledge and has to work with a bunch of inspirational-but-goofy tables? Ugh! And so on. Pick any mismatch, you’ve probably seen it play out in the world.” The Many Utilities of Rules, by The Indie Game Reading Club. So true. That reminds me of my take on thieves: Originally, I wanted to get rid of them. Anybody who steals is a thief, I would say. But my wife did not agree, and she was playing a thief. So I left them in the Halberds and Helmets rules and just added: “Since thieves don’t cast spells and don’t wear a lot of armor, playing a thief is a bit like playing on skill level Hurt Me Plenty. You have been warned.”

Comments on 2021-04-18 Blogosphere

DeletedPage

Add Comment

2021-04-13 Against EDO mono-culturalism

I was listening to @Judd’s podcast, Daydreaming about Dragons the other day. In episode 74 he was talking about avoiding mono-cultures in our world-building.

Good point! This tendency to think of monsters a bit like a different species in terms of biology, or calling it race, and then ascribing a single culture to all of them is something that often has me squirm in my seat. I know this is how we learn about the game, but there is an uncomfortably close connection to racism and all that. It bothers me here in Europe as well, on a smaller scale: the attitudes we ascribe to all Germans, the attitudes we ascribe to the mountain cantons in Switzerland, and so on. It’s weird. I don’t want to deny that sometimes there can be some truth to it – that is, I don’t want to deny the cultural differences themselves, but I do object to the idea that these cultural values are all-encompassing. It’s probably true that most people do not fit the mould; perhaps there’s just a tiny minority that does. If a small group fits the same mould, however, they might still stand out. What I’m trying to say that individual actions, individual words, are still what counts.

So, we have two forces at work, here. On the one hand, these shortcuts make it easy for us to all be on the same page. I can’t deny how well it suits me to have “elves, dwarves, orcs Fantasy” (EDO Fantasy) as a short hand. We can all agree on those archetypes (or prejudices, I guess). The question is, what do we do with the mould we are given? Break it, of course! Thus, on the other hand, I need a quick way as a referee, to generate cultures that are “close, but different”.

In order to keep the benefit of EDO Fantasy, I have to keep some of the cultural traits and at the same time, I want to make sure that the individuals aren’t predictable, that is: not every elf is haughty, not every dwarf is greedy, not every orc is hateful.

Elves live a lot longer than everybody else, so surely the aspects of their culture that derive from their longevity can be universal. They are patient. They are sticklers for detail. They have seen it all before. They are perfectionists. But some elves are cruel and some are kind, some like to travel and some stay in their regions, some are great builders and some are great gardeners. I often try to find an explanation for the local culture by looking at the local terrain. In this sense, the elves are a bit of an embodiment of where they live. So sure, wood elves can be similar to other wood elves, but it’d be a shame if every wood is the same as every other wood. So as I add diversity to woodlands, I add cultural diversity to wood elves, and as I add elves to other lands, even more diversity is created.

In my multi-planar campaigns, I often have elves be “first comers” in Tolkien style. This means, you can find elves everywhere, and they always embody some of the planar terroir as well. Surely, the wood elves are different from the elves living along the Astral Sea, and those are again different from the elves that live in a fiery hell.

Dwarves simply have access to better technology. That is to say, anybody can master it, if they want to: building, mining, steam engines, it’s knowledge that anybody can attain. And there are plenty of dwarves leading simple lives as travelling salespeople, tinkerers, knife sharpeners. I still keep trade and clan as talking points for dwarves. The importance of these can be universal, but the particulars must vary. Some are rich, some are poor, some are greedy, some are generous, some are far away from home and some have lived here for many generations.

In my campaigns, I often have dwarven strongholds associated with powerful monsters, colouring their culture. Fire giants, frost giants, dragons, beholders, chain devils, these all influence how the individual dwarves act. Beholder-friends might be travelling the area, spying on people, reporting back what they see. Chain devil-friends might be closeted, paranoid, xenophobic. Fire giant-friends might be proud of their products, makers for fantastic weapons and armour, or maybe even divided with respect to the giants. And so on.

Orcs are tricky in that I don’t particularly like the brute or hateful stereotype, but I also don’t want to fall into the noble savage trope. I see two ways out: for one, the Tolkien orcs marching across the plains of Mordor like soldiers in the first World War. There’s soot and fire and the cannons of hell, and all the plants are gone, and here are two orcs, complaining about having to march all these miles, having to guard these tunnels all these hours, resentful, but cruel or kind, spiteful or merciful, it all depends. The other orcs I like are the Skyrim orcs. They are peaceful people living away from the big cities. I don’t know where I got the idea, maybe it was from ktrey parker who suggested them to me as I was working on the Hex Describe tables for my setting: orcs are great cooks, and they like strong cheese. So now my orcs are often herders, dairy farmers, cheese makers, as well as martial artists in fantasy sword fighting schools, a bit like the fifty schools or more of kung-fu, maybe warlike, maybe peaceful, maybe xenophobic, maybe serving the long distance trade networks.

Given the context of their military leaders, or the dairy animals they keep, the food they cook, and the preferred fighting style of their clan, often allows me to give orcs their individual touch.

For other creatures, it gets harder. One way around that is to deny biology as we know it. The reason that trolls and goblins are all the same is that they’re magic. Goblins grow in the mud; trolls grow from dead trees that are kept in the dark, and so on. I find that such a magical origin story, without procreation, without family, makes them poorer, of course, but also allows me to use a mono-culture of magic creatures without feeling too weird about it.

And generally speaking, if, in your mind, the campaign is localised, then mono-culturalism isn’t a problem if the next campaign takes place in the same location, or if the next campaign has different elves, dwarves, and orcs. So if you are in fact playing mono-cultural EDO fantasy, but your EDO ideas change over time, then maybe that’s not a problem after all.

I’m just suspicious of people that play all elves, dwarves and orcs the same way, all the time. Happily, I don’t see this happening a lot in my games, so all’s good.

Comments on 2021-04-13 Against EDO mono-culturalism

EDO is probably the biggest reason why we run Zakhara where orcs etc are just part of the population. Basically the only difference is what ears you have. Sort of like a Duckburg except green. No-one bats an eye at an Ogre walking down the street. The lines of conflict are more planar.

– Sandra Snan 2021-04-14 05:45 UTC


Haha, I like the idea of ears being the important differentiator. Like Star Trek aliens, or Goblinoid Games’ Forehead Friday back in 2012.

– Alex 2021-04-14 06:39 UTC


This is why I find myself using elves in my games a lot more than dwarves or orcs even though I find dwarves and orcs infinitely more interesting than elves. The way elves seem to adapt to their environment (wood elves vs sea elves, dark elves vs high elves) means you can easily set one group of elves apart from others while still retaining one general feel for the entire species. They all share the same building blocks - haughty, magical, obsessed with nature - but the differences between a wood elf and dark elf are massive even though they’re still the same on the most basic level.

Individually, of course, it’s relatively easy to avoid every character being the same, but when talking about whole communities, you have to walk a fine line between what people like and expect from each species and what can be unique and surprising but different. If you go too rigid it gets uncomfortable, but if you go too loose you start to wonder why you don’t just replace dwarves with a human mining town.

– Malcolm 2021-04-16 07:59 UTC


Good point about the dwarves and the mining town, I agree. Perhaps the use of demihumans in Fantasy games is a way for us to make it easy on ourselves. Operating with prejudices and putting people into neat categories just makes it easier all around: the inexperienced player has a better idea of what their character’s personality might be like, the others have an immediate opportunity for interaction, after all: don’t all elves and all dwarves quarrel all the time? It’s how we started our elves & dwarves interactions as kids, in any case. 😀

As I think about it some more and as I consider my current Traveller campaign (the Tau Subsector), which doesn’t feature any aliens (no wolf-people, no lion-people, no Psionic-people), I wonder: why would I introduce aliens? What plots would they further? They definitely don’t fill the roles of elves, dwarves and orcs, at least not for me, since I’m absolutely clueless regarding their lore. They can’t serve as shortcuts for characterisation. So it would have to be an interesting first-contact story, or a “find the home world of the ancients” story, or an “explore strange sexuality” story.

A mono-gender race, the asari are distinctly feminine in appearance and possess maternal instincts. Their unique physiology, expressed in a millennium-long lifespan and the ability to reproduce with a partner of any gender or species, gives them a conservative yet convivial attitude toward other races.” – Asari on the Mass Effect Wiki

– Alex 2021-04-16 11:50 UTC


I agree with you entirely regarding including or not including aliens, because of the five main non-Imperial races in Traveller’s default setting, it’s the Zhodani and Solomani who’ve always interested me the most - even though they’re as human as the Imperials (moreso, arguably, since the Solomani are descended directly from us Earthlings).

It’s hard to roleplay a truly alien alien, so most PCs and NPCs alike are going to wind up being rubber-forehead types, who are more less just humans with one or two unique traits. Which means, in my eyes, that the more “human” of Traveller’s aliens - the Vargr (wolf vikings) and Aslan (lion samurai) - aren’t really all that distinguishable from the literally human “aliens”, who wind up being as interesting as them, if not more, even though their only differences from the Imperium are cultural.

I still like aliens (and elves/dwarves/orcs, for that matter) because I like the biological and surface-level cultural differences, but I think they’re better used as Star Wars-style “average galactic citizen who happens to be amphibious” characters than Star Trek-style “entire civilization defined by their love of war/peace/science/hats/etc” characters.

Malcolm 2021-04-17 05:16 UTC

Add Comment

2021-04-09 New features for Gridmapper

Gridmapper hasn’t gotten a lot of new features lately, but today somebody calling themselves the Flying Neko (neko being a cat, if I remember correctly) (which reminds me of El Gato Volador by Gian Varela & El Chombo) (anyway, Gridmapper!!) submitted some small changes:

  • $ toggles the visibility of secrets
  • ! makes all the lines a bit thinner

Making the strokes thinner is something I might have appreciated twenty years ago, when my eyes were better. If you’re twenty years younger, have at it! 😀

Flying Neko also added unidirectional doors, which is a nice new feature.

If you want to see some of the things people are creating using Gridmapper, you can visit the web app and click the “Load” Link for a huge list, or you can visit the Grimapper wiki (which is where the maps are actually stored):

To open the map in Gridmapper, click on the link, and then click on the link at the top of the page.

Example:

Comments on 2021-04-09 New features for Gridmapper

Oh my goodness, hiding the secrets is a brilliant idea! Thanks to the Flying Neko whoever they are. 🙂

acodispo 2021-04-16 20:42 UTC


Now I’m wondering about secret notes! Maybe even multiline notes?

– Alex 2021-04-16 20:50 UTC

Add Comment

2021-04-07 RPG Podcast Planet

If you are a RPG podcaster, would you like your podcast added to the RPG Podcast Planet? It works much like the RPG Planet except for Podcast episodes instead of blog posts.

I started it with my own podcast so that you can get a feel for it.

Et si vous avez un podcast français, la même offre s’applique à la planète podcast rôliste francophone, et à la planète de blog rôliste francophone. 😀

Comments on 2021-04-07 RPG Podcast Planet

I’ve got an RPG Podcast: Monster Man! It’s a micropod that releases multiple episodes weekly about monsters in fantasy RPGs broadly defined. You can find it here:

https://monsterman.libsyn.com/

James Holloway 2021-04-09 21:19 UTC


Added! It’ll be up in a few hours. As I’m going through monsters myself on my podcast, I’m going to have a listen to your old episodes. Over 300! Wow!

– Alex 2021-04-10 07:38 UTC


https://anchor.fm/thoughteater

– froth 2021-04-13 19:33 UTC


Added!

– Alex 2021-04-13 19:53 UTC


I added preload="false" to the templates because my browser made metadata requests for each episode. Documentation.

– Alex 2021-04-15 07:53 UTC

Add Comment

2021-04-06 More directories!

Is there a good RPG podcast directory?

To be honest, I’m thinking of something like the RPG Planet, but for podcasts. You’d have the directory itself in the sidebar, and recent episode summary excerpts (if any) for the most recent episodes.

Is it worth it? Does somebody already maintain such a thing?

I’m also interested in expanding into other languages. So, if you’d like to help me setup and maintain a list of blogs, or a list of podcasts, in some other language, I’d love to help!

All I know is that @blechpirat runs rsp-blogs.de, “das Netzwerk der deutschsprachigen Rollenspielblogs.” So we have German blogs covered.

The help I need involves the following:

  • write a few pages in the respective language for the Planet wiki
  • get the OK of blog or podcast hosts (via email)

I’ll be happy to handle the technical side of things.

For now, it looks like @jmettraux will help me set up a French RPG podcasting directory. Yay! Let’s see how far we get on the upcoming weekend. 🙂

See 2021-04-07 RPG Podcast Planet for more.

Comments on 2021-04-06 More directories!

I don’t know of any such thing! I often see people online asking for this and the answers are scattered. Having an updated directory like the planet is sweet

– Oliver 2021-04-06 14:47 UTC


Well, we have French Podcasts, now! 😀

The English RPG podcasts are just a proof of concept...

– Alex 2021-04-07 07:17 UTC


And French RPG Blogs. 😀

– Alex 2021-04-07 11:21 UTC

Add Comment

More...

Comments

You probably want to contact me via one of the means listed on the Contact page. This is probably the wrong place to do it. 😄

– Alex Schroeder 2020-05-22 12:19 UTC

Referrers: Diary Diary Diary Diary Diary Diary Diary Diary Diary Diary Diary Diary Diary Diary