Phlog Collection 2025-11-04

I haven't set up an automated way to push my Gopher phlogs from Cyberhole Online up here yet, so I'm just going to manually paste for the moment. So this may be a bit random.

mdh@Aegura:~/Code/CodeJS/Cyberhole/gopher/hole/phlog% cat `ls -1 *.txt|sort -r`|pbcopy

i=== Digital Mark's Phlog ===
2025-11-04 19:06:46 UTC
Momentary Thoughts About Game Design

I've been making games for 46-ish years, and I still don't know how to
make a "compelling narrative". Sometimes I have good gameplay and "kill
the thing" plots.

A few times I've worked at studios and had a writer who could produce
lore text, but we still didn't have much story.

That's why my games are mostly interface first, what does the technology
let me do, then work out some game logic behind it.

I generally reject the narrativist view of games. Games are interaction
+ challenge = fun. Books and movies are characters + plot = fun. Visual
novels combine book style with illustrations and a homeopathic level of
interaction, maybe one choice every 10-20 minutes for most. Modern MMOs
& mobage are largely predefined characters on a rails plot, with a
shooting or action game in between. Designers for these hate the idea
of you having your own character or making plot choices.

What I find interesting is exploring a world, fighting, and building. So
Atari 2600 games are still fascinating; the absolute focus on gameplay
was required by the limitations of the machine. Luanti (and that "mines
craft" game that's like it) is endlessly fun. Juice Galaxy is amazing,
just weird blobby monsters, toys, and vehicles in procgen world. AAA
titles are basically all crap, they have characters I can't stand, doing
things I don't want to do, minutes of fun after hours of hitting X.

Text adventures are in a weird space, where there's varying levels of
exploration or plot railroad, varying levels of character predefinition.
Hitchhiker's Guide to the Galaxy is fun once (possibly frustrating for
months), but it's very linear and you are Arthur Dent, of the late
Earth. Zork and Colossal Cave Adventure are still fun, because there's
no fixed path to solve everything, and you're not defined by the game.

A lot of people do like the excruciatingly long cutscenes and "Press F
to Pay Respects" pseudo-gameplay, I'm well aware I'm an outlier. But
that's why I make my games for me. If someone else has fun, too, that's
a sweet bonus!

2025-10-31 05:10:56 UTC
Cyber Mudhole

Starting on the Lisp Game Jam Autumn 2025
https://itch.io/jam/autumn-lisp-game-jam-2025

Plan is to put up a Terminal that talks to a MUD written in my Kawa
servlet platform.

I wrote a long, mostly aspirational, list of MUD commands inspired by
LambdaMoo and TinyMUD; it's not very like my old combat-oriented
Circle MUD. I doubt I'll get more than a fraction of the commands
done, but if multiple players can move around and say and emote, it's
good enough.

The way this works is there's a Java servlet container, and a single
servlet that takes POST requests for commands, then returns all your
chat history since last call. If it polls every so often with empty
command, it should look real-time-ish, and connection keep-alive
should prevent it from hammering the server.

The servlets are in Kawa Scheme, which compiles to normal enough Java
classes. I'll put the whole framework up on gitlab or whatever as I
get towards the end, it's definitely changing a lot each update right
now.

2025-09-02 13:03:13 UTC
Phlogging Like a Typewriter

One thing that occurs to me when writing gopher phlogs, is the 70-
column limit feels like typing on paper. Get near the end and I have
to guess if the next word will fit or not, and whack the carriage
return DING all the way back. I haven't got in the habit of hyphen-
ating words but I did it right there!

Is the physical act of typing different when you don't have auto
word wrap on? I could vi :set tw=70, but I don't.

2025-09-02 12:32:03 UTC
Mystic Dungeon beta

I have a barely-working version of the Mystic Dungeon, my dungeon
exploration game. Everything in the game system works again,
and I've added three new stores (one you won't find for a while!),
and some secrets to find outside of town.

Right now messaging is incredibly spammy and ugly, using up the full
screen if you move fast. Just wait a few seconds and the messages
will dissipate. I'll fix those in the next pass.

You can save [F3] and load [F2] and it's saved to local storage.

https://cyberhole.online/dungeon

Have fun, and let me know what you think!

2025-08-18 08:34:55 UTC
Amazing (converting MysticDungeon games)

I've now managed to convert one of the MysticDungeon.club games, see
front page of https://cyberhole.online/

That wasn't too hard. It's using like 1/2 of the code of the previous
version, and doesn't rely on Node or have to be built, I can just empty
cache and reload a page. But it's a little harder to debug, eslint
doesn't work well on pile-o-random-js.

Amazing's not that impressive, and I'll probably do LostTreasure and
some other small ones, then get the big stuff converted. PortalWorlds
and Dungeon both rely on a shitload of libraries.

The high score server's gone, which is unfortunate. There's a few
options to replace it. A server running Scheme, of course. Or maybe some
web service that I can ajax out to? Cross-site posting is complicated
now.

2025-08-01 03:30:30 UTC
TinyBasicWeb

Now I have a working boot-to-READY prompt BASIC!
It's pretty primitive still, just enough to do interactive
forms, and I plan to put in some web tech (REMOTE and REDIR)
commands which will make it useful for that.

Currently some BASIC microcomputer games will work in it.

So with that basically (o_o) functional, I can focus on
adding more services to the CYBER HOLE.

2025-07-23 02:06:47 UTC
Gopher Holed

And now the CYBER HOLE has my phlog! I can either log in and
write-phlog.zsh, or do it locally and scp into place, refresh and
it's rebuilt by script.

Just finished the Lispy Gopher Show
gopher://gopher.club/1/users/screwtape
(who hasn't been updating his phlog, but like I'm Mr Reliability?)

RIP Ozzy Osbourne. The best and drunkest of us.

2025-04-27 14:39:03 UTC
Dayglo Decade

I was listening to Children of the CPU
https://childrenofthecpu.bandcamp.com

While testing out my write-phlog script.

2025-04-27 13:47:08 UTC
First post

So driven by my Hypertext post
https://mdhughes.tech/2025/04/22/some-of-my-history-of-hypertext/

I needed to set up Gopher again, and not just on SDF or tilde.town.
Talking to Screwtape & CatK got me moving on it.

Currently I'm running Motsognir,
https://motsognir.sourceforge.net
since it works well on BSD; on MacOS, I had to comment out the "dot
feature" to make it compile, but I changed NoTxtPeriod=1, the default is
just wrong, so it's fine.

Which has made it pretty easy to set up CGI (Common Gateway Interface!)
scripts to generate header, footer, and phlog indexes.

And I use shell scripts to start, stop the server, and generate phlog
posts in my format (TIME.txt filename; TIME, TITLE, blank for body); I
would use RFC822 but it's a little more parsing, and the date format is
wrong.

For client, I mostly test in Lynx
https://lynx.invisible-island.net
but also Lagrange
https://github.com/skyjake/lagrange

Which has revealed a few bugs in how I write gophermaps!
In particular, Lynx doesn't care if you list a text file as a dir or
text or binary, it'll render it anyway. Lagrange is very picky, so a
dumb directory doesn't work with it.

Game Project Status Report

OK, thinking about projects time, what I've done with my 3-year summer vacation (extended, 2022 edition).

  • Scheme for local problems, sysadmin tasks, just general dorking around on the computer: ?, best decision I've made in some time. In case it's not clear, Chez Scheme and Thunderchez.

    Schemers in general are annoying but less annoying than LISPers, so if the LISP community pissed you off, Scheme's might be 50% less toxic. I still have to block some people in IRC because they won't STFU or tolerate anyone Doing Things in Unapproved Manner. You know what would be amazing? A language as technically awesome as Scheme, with Python's friendly community. Python the language is trash, tho.

  • Haunted Dungeon, Scheme roguelike. Needs at most weeks of work, and then I can take a day and grind out binaries for various platforms (UUUUuuuugh Windows & Linux suck so much to interact with; Mac does for different reasons), ship it. It ballooned past my original tiny roguelike design long ago, but it's still not that big.

  • Multiple small Scheme programs & games, once I do that ship day I may just make a bunch of binaries. None of these are amazing but some are nice. Don't ask a developer to praise their own software, you know?

  • New Perilar CRPG, also Scheme. I have this at like 60% functionality, map generation's beautiful, and fuck-all for story, it's fine, same shipping problems, so much I need to think about if I get it to a playable state. Or it may be a learning experience.

  • Little Atari 8-bit game. Dungeon crawler with no purpose but it's cute, was meant to be a ZX SpecNext game but that's still not shipped after 2 years so… It's now at like 30% done, but I have some vision for it.

  • Open world action-adventure game I've got a bit of design for (in my paper sketchpad! Not even on the computer!), it could either be Scheme or Atari 8-bit or whatever. I don't actually know of anything like this design, tho original Zelda & Metroid are the parents (I clearly don't understand genetics) of all such games. Needs so much mapping & writing before I even start, but all the technical side is easy for me.

    Currently Atari stuff's in TurboBASIC-XL which is less bad than you'd think, but still really sucks compared to having a modern language; both Pascals and C's I have access to are less useful. I've been borderline to making a new language that compiles to 6502 ASM, but I know I'm lazy at tools-to-make-tools support.

    One nice part with Atari 8-bits is, shipping is easy. Put it in an ATR file, with an Atari emulator as seen on archive.org. One click, any browser shows it. Down side is, can't really charge money for this. Beg for patreon support; which I need to be better about giving you goodies in return for your cash, my fine patrons. Shall I write thee a sonnet?

  • Update & reupload my iPhone stuff. Should I even bother with Castles? I liked the underlying game but the UI is unbelievably shit, I had no idea what I was doing and limited by iPhone 1 screen/UI constraints. But Perilar, and some utility stuff, and maybe patch Brigand to be paid-up-front instead of IAP and say "this is what you could've had!". And I have my 3D game which never got shipped, just shown as demos. Worth spending some time on this and then never looking at it again.

  • Tabletop RPGs. Fuck this third goddamned plague year, which has made playing & playtesting RPGs just a nightmare. Every online group I try flakes out so fast they may be composed entirely of microscopic black holes. So I have my "original dungeon game" retroclone, and my much nicer sword & planet game, and a couple tiny gamelets. And with Hasbro's sabre-rattling at the OGL and "One D&D", I'm inclined to just ship only the sword & planet game, and turn the rest into world books for it. But I'd like to test it more than once with other Humans and also not get infected with plague. So. State of that world is uncertain.

Haunted Dungeon early beta

Hey, it's a new and slightly more usable build (still Mac only) of the Haunted Dungeon! You can now use all the weapons & armor, eat & drink food & potions, might even make it down to floor 2 or 3!

Up in the next few days:

  • Tossing out items. I need to write a new event mode for selecting it, so I didn't feel like it today.
  • Levelling up. Right now you're doomed because you can't heal except by food & potions; or improve, except by very rare (and a long ways down) stat potions.
  • Start getting the actual story into the game. But only the first hints will be in the upper levels, since you can't get far anyway.
  • Main release on Halloween!

Probably next month:

  • Backpack for storing more items. One of the premises of this game is every item's a singleton, there's no stacking. So every item must be useful by itself, and item slot management is hard.
  • Ranged weapons have range.
  • Magic spells.
  • Elemental effects. It's already true that hitting some monsters with sharp or blunt weapons is better, but there's many more interactions when magic gets involved.
  • Much more dungeon dressing, I'm using Vexed's Demonic Dungeon art for that late-'80s, hi-res but low color count effect.

I'd love to get some feedback if it actually works on everyone's machine, because I'm doing some weird tricks to make it launch. As noted on itch, if it doesn't launch, or crashes, try looking at ~/Documents/haunted-dungeon.log, email me with that file.

The game's written in Scheme, running on Chez Scheme, with SDL2 from Thunderchez. Then I have an excessively complex Scheme script that compiles it, and builds a .app structure for Mac, and should also make Linux & Windows builds on those platforms (or in a VM, which is how I do it); been a while since I tried those, but once this is solid I'll include those.

I normally discuss ongoing projects on fediverse, @mdhughes@appdot.net

Haunted Halloween

I've added a new seasonal game to my Mystic Dungeon: Haunted Halloween.

A text-mode twin-stick shooter (well, except it's an emulated Atari 800 "text mode", and the sticks are WASD and IJKL, I haven't written joystick support yet).

Five different levels:

  • Pumpkin Patch: Collect pumpkins for ammo.
  • Dark Forest: Find the path through.
  • Graveyard: Easy, just dodge gravestones and monsters.
  • Corn Maze: Unless you're Ted Forth you won't have a problem with this maze.
  • Haunted House: Just run thru the spooky house full of ghosts, and other monsters crawling in from the woods, get candy, get out!

Three difficulty levels:

  • Treat is turn-based, but there's so few monsters & candies you won't get a high score.
  • Trick is real-time, but you can generally outrun monsters.
  • Nightmare has twice as many monsters & candies, so it's the best way to get a high score… or die quickly, completely overwhelmed.

You can also play it like a stealth game, H hides you from non-adjacent monsters, so you can just run in, hide, wait for them to move off.

You collect candies for score (and banishing monsters earns candy), but every time you move to the next level you eat 10 candy to recover a hit and get some free pumpkins. So it's usually better to stay and clear all monsters, pick up all candies, then move on. But if you have a bunch of witches and ghosts, might be worth running away early.

The interesting thing from development is how little code is required for this kind of game. Halloween is under 1000 LOC, and that includes some long text blobs! Portal Worlds was 3000 LOC, Dungeon's over 3200 LOC and not even close to "done".

I'm still working on Public Caves, moving from BASIC to web-tech requires a lot more infrastructure!

Computer Archaeology: Public Caves Discovered!

Exploring the archives of the People's Computer Company (a public timesharing computer center in the early '70s, yes before home computers), and many of the programs we're familiar with from David H. Ahl's Creative Computing come from here. 15 different variations on guess the number and guess a coordinate, sure, but also some really important things, many of them long forgotten.

Then I find this artifact:

pcaves

What the. This is basically a MUD†, from 1973!

Source code (uses a very long TREES library on previous pages).

Everyone knows WUMPUS, which is based on CAVES, but this is the rock star of these! How does everyone not have a copy of PCAVES? This is like finding a working Airwolf helicopter in a cave with ochre handprints on the walls. HOW THE FUCK did cavemen do that? Why don't we all have an Airwolf, if it existed 47 years ago?!

So anyway some barely-modernized version of this will be added to the MysticDungeon soon, you'll all be able to graffiti up a cave!

† more like a MUSH ("Multi-User Shared Hallucination") with one user at a time, specifically.

  • Note: You can play a version from the Narrascope conference 2019: PublicCavesNarrascope
  • Renga in Blue typed it in for the above event, and briefly reviews it as an adventure game. Which it's not, this is a social environment, literally a MUSH.

MysticDungeon.club Random Thursday Update

Redesigned the front as a software gallery, got Portal Worlds working with my common input system, adapted Amazing (the dumb maze game).

I might get Heist adapted this weekend. Cityscape needs either a custom character set, or I add sprite graphics to the retro screen, which is a better plan. I have a bunch more JS games and demos, most can be adapted pretty quick. Porting the Mystic Dungeon RPG from Python is harder, but on the list.

Still thinking about the forum idea, I haven't seen a lot of interest yet, but a place for smack-talking would be nice.

It's really quite nice just having an easy way to focus on the game design or UI mechanics, and not have to make infrastructure from scratch every time.

Everything should be usable without an account, but you can't post scores unless you do!

MysticDungeon.club

I've finally got my web games/tech demo site MysticDungeon fully running SSL, a proper Node & database server, and all the existing games ported to my common "Learn2JS" framework. High scores and hit counters work for all of them; I haven't set up a really stable migration tool yet but that's on the TODO list before anything more serious gets stored there.

If you run into any bugs, let me know here or on fediverse.

Upcoming will be getting a couple features in PortalWorlds finished, then the rest of the Umbral Adventure world, and some more tools in Grimoire, which will be a tabletop RPG journal/toolkit, more for Referees to use as a virtual screen/notebook than as a coop gaming tool, but you could screen-share it if you needed to. Proper user accounts instead of an unverified screen name will be part of that.

I'm still thinking about if I should replace the old BBS with a forum, or what. Rebuilding the Mystic Dungeon game is on the list, that's part of what the Umbral Atari-like screen is for; nice ATASCII line-drawing characters instead of the few ANSI chars it supported.

PortalWorlds Progress

  • PortalWorlds 0.9 on mysticdungeon.club

  • 2020-03-18:

    • Mob names
    • Boss monsters (only ones with a nametag, and much tougher than the rest of the level)
  • 2020-03-17:
    • Structures: circle tower, box tower, campsite
  • 2020-03-16:
    • All levels are solveable
    • Map indicates map name and row/column of player

Pop back over to itch.io or my Patreon if you want to support this!

PortalWorlds Progress

Doing some more work on the post-7DRL version of PortalWorlds, will publish this when judging's done.

  • 2020-03-13
    • Message history, toggle with H.
    • World counter.
    • Terrain smoothing.
    • Rivers.
  • 2020-03-16
    • Longer tutorial level (and first predefined map, may add more of these later).
    • Messages display on screen instead of HTML.
    • Increased view distance/window size. Should make this configurable for small screens.
    • Physical layout for on-screen keyboard.
    • Started on making all worlds solveable.
  • TODO: I have a longer list, but these are Real Soon Now.
    • Finish making worlds solveable.
    • Structures and level bosses.
    • Audio.

Retrospective: PortalWorlds

What worked, what sucked, lessons learned, The More You Know, and knowing is half the battle, go Cobra, etc.

JS: Test Your Libraries -1

Especially the hard-to-test parts. I had one "obviously correct" array shuffle function I've been using for maybe 10 years:

WRONG RIGHT
function arrayShuffle(arr) {
    for (let i = arr.length-1; i >>= 1; --i) {
        const j = Math.floor(Math.random() * i); // WRONG. NO.
        const tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
    return arr;
}
/** Fisher-Yates */
function arrayShuffle(arr) {
    for (let i = arr.length-1; i >= 1; --i) {
        const j = Math.floor(Math.random() * (i+1)); // RIGHT. YES.
        const tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
    return arr;
}

And because of that, I got a distorted shuffle. I only noticed because no mob using my dumb-as-rocks not-even-AI would ever choose to move north… everything ended up piled up at the bottom of the map.

It's hard to test randomness, but you can check that values are in a sane range. For a decade I've had wrong code just copy-pasted into new projects because I never checked my assumptions.

JS: UI Libraries are Great +1

I mean, I knew that. But how easy it is to throw something up is a bit of a surprise every time I do it. It's a fast, dynamic, functional/OOP language that also has good graphics and sound libraries (I didn't do sound in PortalWorlds, but I will before 1.0), and tolerable event handling these days.

I'm not releasing the full source, but in a week or two I'll add a few more things and release my common library under BSD license. This is mostly stuff from my Learn2JS project, and some from TTMS-76, but those have a giant framework for running scripts, this is just a few functions for a pure JS application, and greatly condensed.

Pulling in common code makes this stuff so much easier.

JS: Application Structure -1

There's no proper "run loop" in PortalWorlds, and late in the process that bit me in the ass.

What you should do is, collect events, put them in a queue. Every X milliseconds (I usually use 30 FPS, so 1000/30=33.333ms) have setInterval do an event-update-redraw loop. If something takes a long time or requires animation updates, it must be done in chunks or in a background thread (using Web Workers ). This is true of any application, not just games.

What I did wrong is having events immediately perform actions, and the setInterval just does update-redraw. This is much easier, but it's wrong. I have no control currently over blocking user actions, and animation has to all happen at once.

The trick I used is to keep a "frame" counter, and that chooses animation frames, moves floating text and the tracers of missiles and fireballs. Next turn invoked by user event just wipes those out. An amusing side-effect is missiles vaporize corpses as they fly past.

Switching to a correct run loop isn't super hard, but does require changes to all my timing and animation hacks, so at this point it's not worth it.

JS: Fonts -1

I used Oryx's "simplex" font, which looks fine and bitmappy in web pages, but in Canvas it gets antialiased, and I wasn't able to make it stop. So I have to make all fonts slightly larger than I'd like, and they're still kind of blurry.

The smarter way would be to use a bitmap font, and a very simple bitmap text renderer. That's what I do in Perilar: Dark Weaver, with an ATASCII-inspired fantasy font. But in 7 days I didn't have time to write and test that.

That's on a "maybe later" list for 1.0. Alternately, I could figure out how to get them antialiased in Canvas?

JS: Minimizer -1

I used to use yuicompressor, which renames variables and aggressively minimizes your code into unreadable but very compact line noise. But with the long-drawn-out death of Yahoo!, that hasn't been updated in a decade, and it doesn't handle ES2020.

I could probably have run everything thru Babel and then yuicompressor, but it's time to move on? So I just used Crockford's jsmin which only removes whitespace. It might be a good time to look into compiling JS to WASM binaries.

My build.zsh script:

#!/bin/zsh
rm -rf portalworlds*.zip
rm -rf build
mkdir -p build
mkdir -p build/js

# *.js -> .min.js
for f in js/*; do
    n=`basename $f .js`
    perl -ne 's/const DEBUG = true;/const DEBUG = false;/; s/^\s*DLOG.*$//; print;' $f >build/$f
    jsmin-crockford <build/$f >build/js/$n.min.js "Copyright (c) 2020 by Mark Damon Hughes. All Rights Reserved."
    rm build/$f
done

# index.html
perl -ne "s/\.js'/.min.js'/; print;" index.html >build/index.html

cp -R favicon.* style.css i ttf build
cd build
zname=portalworlds-$(date "+%Y%m%d_%H%M%S").zip
zip -r9Xq ../$zname * -x "*.DS_Store"
cd ..
echo $zname

Game: Combat Design +1

So I knew I wanted combat to be very swingy (allowing anything from instant death to instant kill), but not have levels or many stats; I didn't have time or inclination to make another detailed RPG!

Instead, combat works by adding your current strength and enemy's current strength, rolling 2 dice in half that range, so central results are more likely, but it's easy to get results at either far end. Then apply the difference from your strength as damage to you or the monster, depending on which side of the line it's on:

const roll = Math.floor(dice(2, this.strength + mob.strength)/2);
if (roll <= this.strength) {
    const dmg = Math.floor( (this.strength - roll) * (100 + this.getDamage()) / 100 );
    mob.takeDamage(dmg, true);
} else {
    const dmg = Math.floor( (roll - this.strength) * (100 - this.getDefense()) / 100 );
    message(mob.toString()+" hits you for "+dmg+" damage");
    this.takeDamage(dmg);
}

Kind of ridiculously simple, but it makes for symmetric combat, so player-attacks-monster and monster-attacks-player have the same results. It's not practical for a tabletop game, but this is a really fun mechanic in a computer game.

Damage and Defense from gear just modify the result by percentiles, they don't affect attack roll at all. If your strength + defense % is less than the monster's strength, you can be one-hit-killed, and vice versa.

Experience adds to current strength, and increases base strength if you're near max; you need to finish fights against slightly superior foes unharmed to grind up strength.

Game: Spells +1/-1

I knew I didn't have time for a lot of magic, and I never feel like I'm finished with magic systems anyway. So here I just picked 4 types: AOE damage, AOE control, escape, and heal; or as the game knows them, Fireball, Sleep, Invisible, and Heal. Then rather than have MP and worry about regeneration, I just give you "base" spells in each based on class, and you can pick up scrolls to add new points to current spell total. When you heal with mana potions or going thru a portal, you get back your base spells.

Last three were trivial: Sleep just searches a radius and has a die(100) > strength chance to give humanoid or animal targets a sleep condition for 2d4 turns; if they're sleeping, they skip the turn. Invis just sets an invis condition for 2d4 turns; mobs ignore you if you have that condition. Couple places like melee and taking damage I manually clear the Invis and Sleep conditions. Heal just heals 50% of base strength, woo.

Even with just 4, doing Fireball turned out to be quite challenging (the Application Structure problem); how do I show it go across the board, maybe have a turn or two delay, then explode? Well, it does it by moving 4 steps every turn, and only having the fake animation for a tracer of where it's been.

Game: Permadeath +0

Permadeath happened more by lack of save state than any intention. I much prefer to have save slots, and then you can choose to save your game and reload last or earlier, or you can play hardcore and never reload. It puts the moral burden of choosing permadeath on the player, not the developer.

But JS localStorage doesn't really have room to stash a huge amount of data. In Reaper's Crypt I had a very aggressive compression for the map (which looks like a giant grid of tiles but it's really about 64 rooms per level), and it's still problematic, sometimes maps just can't be saved.

I could save the character as of last portal you entered, and regenerate maps. But that encourages "stair-scumming", which I do have a problem with. So instead this is very arcade-like, you just play until you die, then insert another quarter.

I do plan to add a scoreboard, both local and maybe server-based for a copy hosted on mysticdungeon.club.

Personal: Shipping is Awesome +1

Actually finishing something and making it public without a decade-long process is amazing. It's not perfect, and I know nothing is perfect, I should just ship things, but I can't normally do that. Having a hard deadline and meeting it was the best feeling.

Personal: Drone-Slack Balance -1

I was desperately exhausted afterwards. Bone tired all day Sunday, and I'm still feeling it on Monday. 7 days in a row, even with a couple shorter days, is about 3 or 4 days too many.

I'm nocturnal. I like to wake up ideally just before midnight (but sometimes backslide to evening if Real Life interferes), eat and coffee, then work until dawn, walk the dog at sunrise, maybe get my own walk in (tiny dog cannot keep up for a mile+), then finish up and goof off until early afternoon when I can sleep. The schedule weirds out some daywalkers, but it's quieter and more compatible with "morning people" (ugh) than waking in afternoon and sleeping at dawn, which I did for decades.

But normally that work is 3 days of code, 1-2 days of writing or art, 2-3 days of just playing videogames or going Outside, doing Real Life AFK stuff.

Drones who can work all the time frighten me, they're basically Terminators. People who Slack all the time frighten me, they're a waste of precious oxygen & water, and I may foolishly try to rely on these people and get nothing. You need to be in the middle area.