Tuesday, June 18, 2024

Radxa X2L Single Board Computer Part 2

I have been experimenting with the Radxa X2L One of the conclusions I have come to is the Picomite Basic firmware is easier to work with on an RP2040 than MircoPython or Circuit Python. I am aware that the Basic programing language is not exactly in vogue these days and Python is superior in almost every way, but really no programing language beats Basic for rapid prototyping. On top of that, I really do like this Basic implementation, it keeps a lot of what made the old 1980's Basic fun, while adding modern features.


 To keep everything in line, I also opted to use FreeBasic on the Intel side of this system. FreeBasic is a pretty good implementation of the Basic language and even has some switches to make it compatible with old Basic code.


This project is going to show you how to use FreeBasic to retrieve the IP address of your system in Linux, then transmit your IP address to the RP2040, which will then use Picomite MMBasic to display the data on a SSD1309 OLED. This is useful for systems in a DHCP environment IP addresses change frequently. You could also use this method to display CPU temperatures or even a joke of the day.

 The first thing you will need to do is flash the firmware into the RP2040, this is covered in the Picomite documentation and a dozen or so Youtube video, so I will not go over it. The second thing you will need to do is wire your OLED to the RP2040 GPIO pins. Again, there are plenty of tutorials about how to do this.

Next you will need to connect to the RP2040 through the serial port. I use Minicom in Linux

minicom -D /dev/ttyACM0

Finally before we can start programming, we need to configure the Picomite software to use I2C and the SSD1306 OLED. You do this by typing the following two lines into your terminal program, you will only have to do this once.



The GP2 and GP19 switches tell the software what wires you are using for communication, if you are using different GPIO pins, you will need to adjust your command appropriately. The first one is the SDA pin, the second is the SCL pin.

 Now, in your terminal, type edit and press enter. This will open the built in text editor. Go a head and type this program in.


Box 0, 0, 128, 64, 2, RGB(WHITE), RGB(BLACK)
Text 10, 10, "Connected", "L", 1, 1, RGB(WHITE), RGB(BLACK)

Input "IP Address: ", ipaddr$
Text 10, 20, ipaddr$, "L", 1, 1, RGB(WHITE), RGB(BLACK)

 The first line is simply a comment stating the name of the program. I do this because when you save a program to the flash memory, it automatically names it whatever is in the first line. Doing this makes it easy to identify which is which.

The next five lines;

  1. Clear the OLED screen
  2. Draws a framing box around the edge of the display
  3. Writes "Connected" to the screen
  4. It then waits for input
  5. Once it receives input, it writes that input to the OLED.

Once you have typed in the program, or done a copy/paste, press the F1 key to save it. Next type "FLASH SAVE 1", This will save the program to the build in storage, so it can be retrieved later. Lastly, you will want to type "run", you should see is waiting for input, leave it be.

Now open a new terminal, if you have not installed FreeBasic, you should do so now. Type "nano intel.bas" and enter this program.

dim as string ipaddr
open pipe "ip -4 addr show wlo1 | grep -oP '(?<=inet\s)\d+(\.\d+){3}' " for input as #1
        line input #1, ipaddr
close #1

open "/dev/ttyACM0" for output as #1
print #1, ipaddr
close #1

Each line of this program

  1. Defines the variable ipaddr as a string
  2. Runs a shell command to retrieve the IP address of the system *
  3. Sets the ipaddr variable to the IP address of the system
  4. Closes the pipe used for running the shell command
  5. Opens the serial port so it can be written to
  6. Transmits the ipaddr variable to the RP2040
  7. Closes the serial port
    * In the shell command where it says wlo1, this is the network device whose IP address you want to retrieve, you will need to change this to match your system.

Once the program has been written, press Ctrl-x, press Y and then enter. This will save the program. To compile the program, type "fbc intel.bas", you should now have an intel executable, simply type "./intel" and press enter. If all went well, you should see the IP address appear in the minicom terminal and on the OLED.

If you want this to run each time the system boots up, type "OPTION AUTORUN 1" into the minicom terminal. This will tell the RP 2040 to run the program in slot 1 on boot up. Then copy the intel executable to /usr/local/bin and add it to you startup programs.

That is pretty much it. You will still have two slots on the RP2040 to save other programs. This is a pretty good start to making the RP2040 useful to you when using the Radxa X2L. I kind of feel like all computers should have an RP2040 built in.


Saturday, June 1, 2024

Garbage Terminal: Part 3


So, I have this more or less built out, at least in its draft form. The 3D printing process did not go particularly well, which is not a surprise, I have a cheap printer and a very drafty house, so getting a good clean print is rather difficult. However, for version 0.95 I am not going to complain much. It pretty much does what I need it to do and it was built entirely out of parts I had on hand.

The first question of course, is it usable? Well, yes, however is it practical? No. Honestly I would not try to do any meaningful work on this terminal at all. It does not feel comfortable to hold, nor does the keyboard feel right. and the screen is too small for my old eyes.

On top of the feel, the Raspberry Pi Zero is just not designed to be useful in this sort of capacity. The CPU is too slow and the memory is too limited. If I were buying the parts for this today, I would have went for a Raspberry Pi 4 or 5 and a much better miniature keyboard, but even then I am not sure it would be terribly useful for anything, even with a GUI and a touchscreen.

Of course this also leads me to wonder if buying a professionally built hand terminal would be all that useful too me either. There is nothing this can do that a laptop can't do or heck, a bit of hacking and my phone could do most of it. Both of those options would be more useful and more comfortable to use. So yeah, realistically I think I will pass on the idea of a hand terminal.

Sunday, May 26, 2024

Garbage Terminal: Part 2

First things first, I found out that 3 AA batteries will not in fact power a Raspberry Pi Zero with an LCD screen attached. My wife offered up her Jackery Mini battery bank as her contribution to this project. Thankfully this works great. Second things second, I have been trying to work out a 3D printed case for this mess, but so far I have not had a lot of luck.

 This is the current state of the project. It is fully functional, but as you can see, it is waiting for some sort of case. The biggest problem with this build is the keyboard. I remembered why I never used it in a project, it sucks to type on. The size is not the problem, it is the buttons themselves that are the problem.

As you can see here, without the 3D printed cover, the buttons are literally little finger hating buttons. The cover makes it more tolerable, no let me rephrase that, the cover makes it usable. The downside of course is the cover also makes it harder to read the the letters, but if you are going to use this keyboard, the cover is an absolute must.


The instructions for getting the keyboard to work are here;


The STL files for the keyboard cover are here;


Installing the  Pimoroni HyperPixel 4.0" LCD is not terribly difficult, the instructions for getting it to work are here;


One of the issues I ran into, was the Pimoroni HyperPixel 4.0" LCD screen will not work if I2C is enabled on the Raspberry Pi with the raspi-config tool. I think the driver for the LCD hijacks I2C in some way. This is fine though, because it seems to provide its own I2C driver and a place on the back to attach devices. The keyboard shows up on bus 11 for me. Which can be verified easily enough with "sudo i2cdetect -y 11". 

The screen also does not power off automatically when the Pi is shutdown, which is a problem for battery life. To make this happen run the following command;

 sudo nano /etc/systemd/system/hyperpixel4-backlight.service

Paste the following into the file and save it.

Description=Sets up gpio-poweroff to handle Hyperpixel backlight upon shutdown/reboot
ExecStart=/bin/sh -c '/sbin/rmmod gpio-backlight;/usr/bin/dtoverlay /boot/overlays/gpio-poweroff.dtbo gpiopin=19 active_low=1'
WantedBy=reboot.target halt.target poweroff.target

 Followed by the following commands;

sudo systemctl enable hyperpixel4-backlight.service

sudo systemctl start hyperpixel4-backlight.service

One other issue I had, although not show stopping was annoying. When the Pi booted up I was getting "Boot errors: reached target sound card and error stopped target sound card". This is kind of to be expected because the Pi Zero does not have any sound device. To fix this open /boot/config.txt;

sudo nano /boot/config.txt



and change it to;


Then find;


and change it to;


 After the next reboot, you should not see those errors anymore.

I think that sums up the initial build pretty well. Once I have a case for it and had a chance to actually use it, I will do a part three and discuss software, battery life and usability.

Saturday, May 25, 2024

Radxa X2L Single Board Computer

 I will be coming back to the Garbage Terminal shortly, I had some hiccups with my original design, which is what happens when you pull a bunch of junk out of a parts box.

In the mean time, I have been messing around with a new bit of hardware I bought. Up until version 5, I was a big fan of the Raspberry Pi. With the Raspberry Pi 5 however, I felt it had jumped the shark. Yes, it was a good product, but it has reached the point where they are just as expensive as a low end computer and therefore lost much of their original luster. Enter the Radxa X2L, powered by an 4 core Intel Celeron Processor J4125. This little board costs as little as $39 for the 2GB of RAM version, I picked up the 4GB version for $52 and there is an 8GB version for $82. You can also get them with various amounts of EMMC storage. The really cool thing about this board is it comes with an RP2040 microprocessor built in, along with exposed GPIO headers very similar to the Raspberry Pi Zero.

The first thing I should say about this is don't bother getting it with any EMMC storage. EMMC is stupid slow and for about the same cost as the upgrade, you can get a 128GB NVME M.2 SSD, trust me, you will be happier. Second don't bother getting the M.2 wifi card either, they cost $20-$30 plus shipping, it is just not worth it. Instead just go find a $10 wifi dongle on Amazon, yes it takes a USB port, but the price makes it worth it.

Things I liked:

This board is basically a complete computer the size of my cell phone. It is a larger than an Raspberry Pi, but still reasonably small, so you can mount it on the back of a monitor or an out of the way corner of your media center, even with a 3D printed case.

I love having an RP2040 integrated into this board, I think all computer should have this.

The BIOS has CSM options for booting non UEFI operating systems like FreeDOS. Fewer and fewer systems are coming with this option and I am glad to see Radxa decided to include it.

Considering this is a Celeron CPU, it performs pretty well. X.org runs smoothly, Chrome and Firefox render well and no problems with Youtube.

Things I didn't like:

 When I was messing around with the RP2040, I found some problems than annoyed me. First off, it does not play well with Micropython, I could not get any I2C hardware to work. I had to use CircuitPython instead. 

The second thing I found was I could not chain multiple I2C devices together. I should be able to chain a dozen devices, but I could not even get two to work properly.

I am not sure what the issue here is, I know it is not the RP2040 itself, I have several Raspberry Pi Pico's and a couple of Waveshare Pico Zero's, I2C and Micropython  work flawlessly on these devices. I should not be having these problems and the GPIO is really the selling point of this board, otherwise I might as well just buy a Mini PC.

What am I going to do with this?

The short answer is I don't know. The longer answer is, I have a couple of idea, like maybe a Cyberdeck, ie a custom built hand made computer with flare and style. However, before I start on something, I need to work out the RP2040/GPIO problems I am having. I am currently working on getting some form of two way communication going via serial between the intel processor and the RP2040, once I have worked that out, I will post about how I did it, along with source code.

Saturday, May 11, 2024

Garbage Terminal: Part 1

I decided I wanted a little Linux handheld terminal. I had seen some YouTube videos of them and thought they were a neat idea. However when I went out and started pricing them, I was surprised at how expensive they were. I am sure part of that was just post COVID bullshit, but still. Then I started thinking about it and I realized I probably already had all the parts I needed. So I dug through my parts box and found a Raspberry Pi Zero W, a Pimoroni HyperPixel 4, a mini keyboard, 3 AA battery pack, a toggle switch from the junk drawer and an embarrassingly large pile of various USB flash drives. All stuff from other projects that were upgraded, abandoned or long forgotten. Now I just had to put it all together and make it work.

In the next installment I will go into the building process and include some pictures. However, before I get to building it, I am also thinking about what upgrades I might want to make in the future. I am also thinking about what I would do if I were buying these parts today.  I went out and looked at the current price and found these parts would cost $106.75 at today's prices. Mind you, I bought most of this stuff pre COVID, so it was considerably cheaper, I suspect at the time all of this stuff cost me less than $75.

If I were buying these parts rather than digging them out of my parts box, I would probably make some different choices. For instance the Hyperpixel 4 LCD screen does not play well with the current version of Raspberry Pi OS, which is why I am going to have to use an old version for this build. This LCD also uses all the GPIO pins, I would like to have a few left exposed for other things. I would likely choose the Miuzei Raspberry Pi 4 Touchscreen with Case Fan, This would cost me $30, but it would give me a touch screen and open GPIO pins. This flows right into using a Raspberry Pi 4 rather than a Pi Zero. While this would make the build much bigger and heavier, it would give me a lot more CPU power, memory and sound. I would also get a rechargeable battery pack, 3 AA batteries will probably not last nearly long enough. Unfortunately, buying all this stuff today would probably throw the price well into what just buying one of those Linux handheld terminal I was talking about earlier.

Here is my parts list for anyone who cares.

 Obviously if you shop around, You might get this cheaper, like the switch you can probably get at a hardware store for 89 cents and it never hurts to shop ebay for used hardware.

Monday, March 25, 2024

Review: Daggerheart Open Beta

The open Beta of Daggerheart has been released. For those of you not in the know, Daggerheart is a new fantasy roleplaying game being put out by the popular D&D streaming group Critical Roll as a replacement for D&D.

Over the last 2 weeks my Sunday night game tried it out. The first game was session zero, where we built characters and tried to figure out the rules. The second session was actually playing the game. I want to be critical of this game because there is a lot that did not work for me, however I am going to pull my punches here because it is an unfinished product that may well improve in the final presentation.

Things I didn't like:

The 2d12 game mechanic just seems awkward, I am not sure why they chose 2d12 over 1d20 or even say 2d10. This awkwardness is magnified by the fact that the GM uses a 1d20 for combat. This is weird because it puts the monsters on a flat probability but the characters are on a curved probability. I honestly do not see how this adds anything interesting to the game.

There is no initiative system, no way to lock down whose turn it was or who could do what and when. Combat was a mess until half way through the GM implemented a turn order so no one missed the opportunity to take a turn. This game incentivizes show boat players and marginalizes less aggressive players.

Characters seemed bland, special abilities were highly situational and reminded me of D&D 4th Edition, which is not a good thing. One of my fellow players commented that had we not announced our classes to each other, he would have had no idea what classes we were actually playing.

The Fear and Hope mechanic had a lot of potential, but it honestly fell flat. During the game, I did not generate a single Hope and accounted for 2/3 of the Fear generated during the session. Virtually all of that Fear was used against other members of the party, I was not impacted by the fear I generated and that was frustrating for the other players. Everyone else in the party had a plethora of Hope, but nothing to use it on because their abilities were all situational.

There were layers of needed complexity, such as the severity of the hit determining how mach damage was taken rather that just rolling the damage directly. Evasion/Armor/Armor slots along with Stress being used as extra Hit Points, served to slow the combat down to a crawl.

Things I did like:

Players are incentivized to engage with the game. The more you engage with the game the more chances you have to generate Hope. Players who do not engage with the game tend to have less options available to them over the course of the game.

I liked the Advantage/Disadvantage mechanic, adding a 1d6 to the roll when using Advantage and subtracting a 1d6 to the roll when using Disadvantage has a much larger impact on the game than just rolling 2d20 and taking the better roll.


This game does not really work for me all that well. I prefer a unified dice mechanic and the 1d20 flat probability works well for that. Using 2d12 just seems arbitrary to me and unnecessarily bunches up rolls into the 12-14 range making rolling high maddeningly rare. Characters were underwhelming and shy quiet players are quickly pushed to the background. Unless something changes dramatically, I don't see myself playing this game in the future.

Sunday, February 4, 2024

Playing Shadowdark Part II

I wanted to love Shadowdark, I really did. The idea of simplified game mechanics and clarified resource management rules made it a very enticing game. I am sure for some groups is what they need and what they want, for my group not so much. We played six games of Shadowdark, adding in the previous 4 games, a total of 10 games in all. I think we all went into it with an open mind and we gave it a fair chance. In spite of that the game fell flat with us.

Things we didn't like:

To start of with, resource management is not fun. I am not saying it is bad, just boring. My players did not like equipment slots and worrying about torches. This just added a level of book keeping that only served to annoy my players and take away from the enjoyment. They don't mind dealing with things like how much weight they can carry or the lack of dark vision. The problem was, these rules required the players to pay meticulous attention to details they really didn't care about, they wanted to play the game, not do supply room inventory every game.

The next issue was characters tend to be bland with very few id any interesting things the players could do in any given circumstance. Character development is just uninteresting, honestly, there is very little difference between a 1st level character and a 5th level character beyond a few extra hit points. The fact that the player had little control over how development progressed, irritated my group a lot.

The worst part of the game is how fucked spellcasters are. Roll to cast sounds like an interesting idea, but in practice was a terrible idea. Loosing key spells at the wrong time often spelled disaster for the group. Luck tokens are supposed to alleviate the issue, but really didn't, even giving out 2-3 luck tokens to every character in every game did not seem to make a big difference, if the dice were against you, they were against you. Ultimately no one in the game wanted to play a spellcaster and even the one person who did, rarely bothered casting spells and only did it if he had luck tokens available.

Lastly, 4 classes and 6 ancestries is not enough. Ancestries we could probably get by with, but 4 classes just isn't enough and adding enough classes and ancestries to bring the game into parity with D&D 5E breaks on of my rules of DMing, which is keep house rules to a single page, otherwise you are playing the wrong game. I thing that is what this really amounted to, we were just playing the wrong game.

Things we did like:

I don't want anyone to think we hated this game, we didn't, it is just not what we want out of a game. There are things from Shadowdark that I will be bringing back to D&D 5E. I loved the always on Initiative, it just made the flow of the game much smoother. I just ordered everyone by Dexterity score (then alphabetical by character name) and proceeded from there.

My players really enjoyed getting back to rolling for stats rather than point buy or standard array. They did not like rolling for class talents, but they did like at the beginning having to take what you roll and build something out it, even if it was not optimal for what you wanted to do. Lets face it, rolling a 6 in something is a great role playing opportunity.

Overall, Shadowdark is a solid game and I would not turn down a game of it if someone wanted run it, but sadly, fo my group it is just not what we want. One of my players has said over and over, the only thing we want from a game is to be able to play interesting characters and I think that is where Shadowdark fell short for us. So last night we had a session zero and we are going back to D&D 5E.

Saturday, January 27, 2024

A Night on the wall


A Night on the Wall is a pure combat session, where the PC's are defending the wall of a city against a monster attack. This is meant as a replacement for the Gauntlet style game or as a quick and dirty game session that can be run with no preparation. This works well for up to 6 characters of 4th level or less. Much after that it becomes an epic battle fought at the end of a campaign rather than a skirmish fight.

Along with the PC's there will be teams of NPC's, each team will contain 4 Commoners and 1 Militia man. The number of teams on the map will depend on the length of the wall to be defended. There should be roughly 1 NPC for each 10 feet of wall, plus 1 team on the ground to act as medics and 1 team to act as runners and defend the wounded.

Generally speaking an attack will last 20 rounds. If a breach occurs and the light sources cannot be re-lit, chances are good the battle will not go well. If the PC's are able to keep a breach from occurring or re-lighting the light sources quickly, they stand a pretty good chance of making it through the 20 rounds. If the PC's make it 20 rounds without an uninterrupted breach, the monsters will withdraw and go look for an easier sector to attack.


A breach occurs when two or more light sources next to each other are extinguished and monster bands start coming through that area every round instead of every 1d4 rounds from a random direction. The only way to stop a breach is to re-light the light sources.

What the NPC's will do:

  • NPC's who are reduced to 0 HP will die in 4 turns unless taken to the building where they can be stabilized by the one of medical team, each member of the medical team can restore 1 HP per turn. NPC's will return to the fight if they at at least half their HP restored.

  • NPC's will use their ranged attacks and attempt to stay out of reach of any monsters and will only use their melee weapons if a demon comes within Close distance. The NPC's will use their ranged attack on any monster within Near proximity, otherwise they will be scanning their section of the wall for more monsters.

  • When a light source is extinguished, the closest NPC who is not in a fight will attempt to re-light it with a DC 8 Dex roll. If there is no monster in Close proximity, they have advantage on this roll.

  • If the number of NPC's is reduced to half its starting number, any PC or NPC can call for reinforcements. It takes 1d4 rounds for reinforcements to arrive. Reinforcements will generally be 2 fresh teams of 1 Militia man and 4 Commoners.

  • The Militia men will move around the map to assist with attacks coming in other areas, commoners will assist using their ranged attacks on any monster in near range, but will otherwise stay at their posts.


Commoner: AC 10, HP 1, ATK 1 Club (1d4) or 1 Shortbow (far) (1d4), MV near, S +0, D +0, C +0, I +0, W +0, Ch +0, AL L, LV 0.

Militia man: AC 13 (Leather+Shield), HP 5, ATK 1 Shortsword +1 (1d6) or Crossbow (far) +1 (1d6), MV near, S +1, D +1, C +1, I +0, W +0, Ch +0, AL L, LV 1.

What the monsters do:

  • At he beginning of the session, one band of monsters will appear on the map outside the wall from a random direction. Each round thereafter roll 1d4 and on a 1 another band of monsters will appear on the map, approaching from a random direction. If the battle goes 4 consecutive rounds without a monster band appearing, one will appear on the next round.

  • However if at the beginning of a round  two light sources next to each other have been extinguished and have not been re-lit a monster band will automatically approach from that direction.

  • If a monster comes into Close distance of a PC or NPC, the demon will attack, otherwise it will move Near distance in a direction determined by the GM.

  • If a monster comes into Close distance of a light source, they will use their action to extinguish it, this requires a DC 8 Dex roll. If there is no PC or NPC in Close proximity, they have advantage on this roll. If an NPC or PC is also within Close distance, it will extinguish the light first and attack second.

Monster Bands

I use generic monster stat blocks for two reasons, first I can skin them as I please depending on the needs of the setting, and second I did not want the monsters to have special abilities, because this can slow down what is already a long drawn out combat.

To determine what each monster band is, add up the levels of all the PC's in the group and match this number with and equal number of monster levels. Additionally each monster band will have two level 0 monsters for each PC in the group. The 0 level monsters will usually come in first trying to extinguish light sources and kill any commoners near by.

Don't make the monster bands swarms of level 1 monsters. It is bad enough that there are so many NPC's and level 0 monsters, don't slow combat down by adding sixteen level 1 monsters to the attack because there are four 4th level PC's. Read the section "HOW MANY MONSTERS?" on page 193 of the Shadowdark RPG rule book on balancing an encounter.

  • Example 1: For a group of 4 1st level PC's each monster band could contain 4 level 1 monsters and 8 0 level monsters, or 2 level 2 monster, or 1 level 3 and 1 level 1 , or 1 level 8 Monster along withe the 8 level zero monsters.

  • Example 2: A group of four 4th level PC's totaling 16 levels could be facing monster bands made up of two level 8 monsters, and 8 level 0 monsters.

Level 0 Monster: AC 10, HP 1, ATK 1 Claw (1), MV near (Climb), S +0, D +1, C +0, I -3, W +0, Ch +0, AL C, LV 0.

Level I Monster: AC 11, HP 5, ATK 1 Claw +1 (1d4), MV near (Climb), S +1, D +0, C +0, I -2, W +0, Ch +0, AL C, LV 1.

Level II Monster: AC 11, HP 10, ATK 1 Claw +2 (1d6), MV near (Climb), S +2, D +0, C +0, I -2, W +0, Ch +0, AL C, LV 2.

Level III Monster: AC 12, HP 14, ATK 2 Claw +3 (1d6), MV near (Climb), S +3, D +0, C +0, I -2, W +0, Ch +0, AL C, LV 3.

Level IV Monster: AC 12, HP 20, ATK 2 Claw +4 (1d6), MV near (Climb), S +3, D +0, C +0, I -1, W +0, Ch +0, AL C, LV 4.

Level V Monster: AC 13, HP 24, ATK 3 Claw +4 (1d8), MV near (Climb), S +3, D +0, C +0, I -1, W +0, Ch +0, AL C, LV 5.

Level VI Monster: AC 14, HP 29, ATK 3 Claw +5 (1d8), MV near (Climb), S +3, D +0, C +0, I -1, W +0, Ch +0, AL C, LV 6.

Level VII Monster: AC 14, HP 33, ATK 4 Claw +6 (1d8), MV near (Climb), S +4, D +0, C +0, I -1, W +0, Ch +0, AL C, LV 7.

Level VIII Monster: AC 15, HP 37, ATK 4 Claw +7 (1d10), MV near (Climb), S +4, D +0, C +0, I +0, W +0, Ch +0, AL C, LV 8.

Order of the battle:

  • The Monsters go first in every round. When the monsters appear on the map, the PC's and NPC's will have a chance to attack with ranged weapons. Any monsters surviving the first round will make it to the top of the wall at the beginning of the next round and will have both their move and action available to them.

  • PC's go next in order of initiative.

  • NPC's go last in every round.


As is, this can a difficult scenario to survive, especially if a breach occurs and is not fixed quickly or two, perhaps three consecutive attacks occurring from different directions. To make it easier;

  • The monster bands come every 1d6 rounds.

  • Halve the number of Level Zero Monsters with each band.

  • The PC's and Militia men are given 2 Potions of Healing each and they can get 2 more by visiting the medical team.

  • Add an NPC Cleric to the medical team.

  • Reinforcements are doubled and automatically come 2 rounds after the arrival of each monster band.

  • Make the Militia men tougher

  • Give the players a round of notification that a band is coming from a particular direction, so the PC's have a round to move around the map, or perhaps shoot into the darkness at disadvantage.

Zero Level PC's:

  • If this is being used as a replacement for a Gauntlet style game for Zero level characters, generate the PC's as normal.

  • Each player should roll up 4 characters, if a PC dies, the replacement PC will arrive with the next set of reinforcements.

  • In addition to starting gear, the PC's will be given flint and steel, a torch, a club, shortbow and 20 arrows.

  • Monster bands will consist of one Level I monster and a number of Zero Level Monsters equal to the number PC's.

Player Strategy:

  • Keep the light sources lit at all costs.

  • Commoners pop like balloons, Militia men can take a couple of hits from level zero and level I monsters, but they will still soak up a lot of damage in the long run, use that to your advantage.

  • Ranged attacks are your friend, especially on the first round a monster band is approaching the wall and everyone gets a free shot at them.

  • Let the Commoners and Militia men handle the level 0 monsters, while the PC's tackle the big boys.

  • Sometimes allowing a breach to continue is the best way to funnel the monsters into a single direction of attack. Use this strategy wisely.


Shadowdark License. This product is an independent product published under the Shadowdark RPG Third-Party License and is not affiliated with The Arcane Library, LLC. Shadowdark RPG © The Arcane Library, LLC.

License: This adventure is licensed under the Creative Commons Attribution-NonCommercial 4.0 License.




Sunday, November 26, 2023

The state of Wayland on Linux

Is it just me or does Wayland piss everyone off? I am not a new Linux user, I have been at it since 1992. Every time I give Wayland a try, I find something that is broken. They have been at this for 15 years and it still feels like an early beta release. Maybe its time these guys gave it up and acknowledge this was not the way to go.

Don't get me wrong, I am not a Wayland hater. I am all for new technologies that genuinely improve our experiences on computers. If 10 years ago Wayland had been ready to go, I would have jumped on it, but back then it was barely demo code let alone a usable desktop environment and that was after 5 years of development.

I am also not saying that Xorg is the end all and be all of  windowing systems on Linux. Xorg has its problems and back in the 90's it was not fun to setup and get working. I remember needing to know mode lines for the monitor I was using and sometimes, even the manufactures didn't know what that was. Don't get me started on hardware acceleration.

My point is, Wayland was a solution looking for a problem. By the time Wayland came around Xorg was pretty much done, all of its major issues had been solved and it was a pretty good framework for building new extensions. Then a small group of developers working on Xorg, decided it was not any fun to work on anymore and started work on Wayland. At the time, no one wanted Wayland, but by god we were going to get it anyway. Now 15 years later, it is functional, but unless you have a setup exactly like the developers, you are probably not going to have a good experience.

I think it is time to call a pig a pig.

Saturday, November 25, 2023


Anybody concerned about A.I. taking everything over, please keep in mind that for A.I. to become a serious threat to humanity, computers must be able to;

  • never hallucinate
  • understand abstractions
  • form long term plans
  • understand causality
  • reliably maintain models of the world
  • reliably handle outliers

Currently computers cannot do any of these things.