Yeah, SwiftUI too dude!

SwiftUI is just not good at macOS apps

So because I’m stupid, (I know, shocker), I decided to do a thing Apple says is pretty easy: try to make a macOS app using SwiftUI. Setting aside beta issues, let me be clear on this:

  1. It’s not an iOS/iPadOS app that will run on macOS via Catalyst.
  2. It may never run on iOS/iPadOS. I don’t really care about those
  3. This is not some thing with a list picker and a nav view and hey, UI is done.

Here, a screenshot of the non-SwiftUI version:

There’s a lot going on here

So yeah. There’s a lot going on and for what it’s used for, a front end to managing my Nagios servers, it’s pretty good at it. It does thing things I need it to do. That large blank area at the bottom is for status stuff. Also, I don’t want to hear that the reason I had a hard time with this is because I haven’t been a Swift Dev since it was introduced. If the only way an environment is usable requires years of experience to do even simple things, that environment is a failure. Period.

So okay, this is pretty straightforward right? tabs, controls, done. I mean, just to mock up the UI.

Lol.

So after two weeks, spread across much longer, I can say a few things about SwiftUI.

  1. If you’re building a macOS app that is macOS – first or only, stay away from SwiftUI. Like it had the dysentery and was dragging your conestoga towards a school of piranha. It’s honestly awful, as we’ll see
  2. I’m actually really sure at this point, that SwiftUI is an attempt to bring CSS into Apple Device app UI design. In and of itself, that’s not awful. But the current implementation as of the GM 2 drop of Xcode is just awful for macOS. Again, see 1. above.

What I wanted to do was build two tabs and have some stuff in it. So let’s go through this. First, here’s the ContentView of a generic starting macOS project using SwiftUI:

import SwiftUI

struct ContentView: View {
    var body: some View {
        Text("Hello World")
            .frame(maxWidth: .infinity, maxHeight: .infinity)
    }
}


struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

This gets you this:

Yep. That’s a window.

So now, we want to add tabs. This requires a tab view. So we erase the text saying “Hello world” hit ye olde + button in Xcode and drag in a tab view.

This is my first complaint here: You drag a control into a code window, not onto the window of things you want. Like, I did try, and this may work correctly for i(Pad)OS apps, but for a macOS app, it’s full of fail. I tried to drag a button into a tab view, couldn’t do it. So basically, with SwiftUI, you’re not visually laying out your controls at all.

And this is what the code looks like (in the interest of space, I’m going to not include the content view preview code, it doesn’t change:

struct ContentView: View {
	var body: some View {
		TabView(selection: /*@START_MENU_TOKEN@*/ /*@PLACEHOLDER=Selection@*/.constant(1)/*@END_MENU_TOKEN@*/) {
			/*@START_MENU_TOKEN@*/Text("Tab Content 1").tabItem { Text("Tab Label 1") }.tag(1)/*@END_MENU_TOKEN@*/
			/*@START_MENU_TOKEN@*/Text("Tab Content 2").tabItem { Text("Tab Label 2") }.tag(2)/*@END_MENU_TOKEN@*/
		}
	}
}

Fugly, but it gets us this:

Okay, so far so good

Now already, this is weird. The content of the tabs occurs outside/before the tabItem itself. The label of the tab happens after the tabItem. Sort of. So let’s reformat this a bit, also so it looks more like what you see in examples:

struct ContentView: View {
	@State private var selection = 2
	var body: some View {
		TabView(selection:$selection) {
			Text("Tab Content 1")
			.tabItem{
				Text("Tab Label 1")
			}
			.tag(1)
			
			Text("Tab Content 2")
			.tabItem{
				Text("Tab Label 2")
			}
			.tag(2)
		}
	}
}

This gives us the same thing we saw before. A window with two tabs, a single string in each tab, and the tabs themselves have names. I added a line, the “@State” line, so that the first tab, with the .tag(1) property is the start tab.

But this is really weird right? First, the content, the strings “Tab Content 1” and “Tab Content 2” aren’t “in” the .tabItems. They’re before it. Whaaa? This right here is the most counterintuitive shit ever. The content of the .tabItem should be inside the .tabItem block, not outside. The name of the tab should be a property, just like the tag, i.e. .label or some such. Instead, it’s just a text string. Maybe a picture too.

So then, what if you want to put a text field with a label? Oh, then it gets stupid. So first, keeping with “content of thing before <thing>” which took me a WHILE to get, (I kept trying to put it IN the .tabItem, I mean, what kind of IDIOT would think that’s where it goes?) So now, we have this:

struct ContentView: View {
	@State private var selection = 1
	var body: some View {
		TabView(selection:$selection) {
			Text("Text Field Label")
			TextField("Text Field", text: .constant(""))
			.tabItem{
				Text("Tab Label 1")
			}
			.tag(1)
			
			Text("Tab Content 2")
			.tabItem{
				Text("Tab Label 2")
			}
			.tag(2)
		}
	}
}

Which gets us the field and the label on top of each other, because this was designed for iOS. Also the text field stretches the width of the window. It looks like this:

Sigh

Actually, that’s not what happened. SwiftUI added a third tab and now it’s all stupid. No warning. What the hell? Well, first, we can try adding a horizontal stack (read “row”) and putting things in that. Sure. let’s try that. According to Apple et al, you just cmd-click the thing you want in the HStack, select “embed in HSTack, and oh look, it also put the .tabItem in the HStack too, which was completely not what we wanted. So NOW, we put our text field inside the HStack, the next line down from the label, and put in a .frame property one line below the TextField declaration to limit the width of the textField because this is not iOS and I don’t want a gigantic text field on a 4K screen and we get closer:

struct ContentView: View {
	@State private var selection = 1
	var body: some View {
		TabView(selection:$selection) {
			HStack {
				Text("Text Field Label")
				TextField("Server URL", text: .constant(""))
					.frame(width:96,height:22)
			}
			.tabItem{
				Text("Tab Label 1")
			}
			.tag(1)
			
			Text("Tab Content 2")
			.tabItem{
				Text("Tab Label 2")
			}
			.tag(2)
		}
	}
}

which gets us:

Okay, getting there…

But we want this on the left side of our window, and at the top. So the first is pretty easy. We add a spacer, which shoves it all over to the left, and then we add in some padding so it’s not at the edge of the window. Like seriously, this is some hardcore iOS shit you have to work around. Also, why can’t I just say “hey, in this horizontal row, I would like everything to be aligned left.” That’s a great idea, so of course you can do that. LOL! Nope, in an HStack, you can only adjust the vertical alignment of the things inside it. Because that’s how everyone thinks of aligning horizontal things in a horizontal structure. Vertically.

Sigh.

So now we have:

struct ContentView: View {
	@State private var selection = 1
	var body: some View {
		TabView(selection:$selection) {
			HStack {
				Text("Text Field Label")
				TextField("Server URL", text: .constant(""))
					.frame(width:96,height:22)
			Spacer()
			}
			.padding(.leading)
			
			.tabItem{
				Text("Tab Label 1")
			}
			.tag(1)
			
			Text("Tab Content 2")
			.tabItem{
				Text("Tab Label 2")
			}
			.tag(2)
		}
	}
}

Which gives us:

Closer…

So now, what if we want two rows? Another HStack under the other one right?

Oh honey, no, it’s not that simple. That gets you a third tab. But go ahead and try it. Right, so now what? Well, now we embed this in a VStack, (Column) which will also let us handle our vertical positioning via a Spacer on that:

struct ContentView: View {
	@State private var selection = 1
	var body: some View {
		TabView(selection:$selection) {
			VStack{
				HStack {
					Text("Text Field Label 1")
					TextField("Text Field 1", text: .constant(""))
						.frame(width:96,height:22)
					Spacer()
				}
				.padding(.leading)
			Spacer()
			}
				
			.tabItem{
				Text("Tab Label 1")
			}
			.tag(1)
			
			Text("Tab Content 2")
			.tabItem{
				Text("Tab Label 2")
			}
			.tag(2)
		}
	}
}

and we get:

Closer….

Of course you’re thinking “why not just set the VStack so everything in it is at the top?” Well, that would be logical, and also have nothing to do with VStack alignment options, which are of course, left, right, and centered. Or leading/trailing/centered. Because when I’m looking at a vertical structure, I only care about horizontal alignment.

Sigh.

So now we just shove another HStack in and we’re set…sort of:

struct ContentView: View {
	@State private var selection = 1
	var body: some View {
		TabView(selection:$selection) {
			VStack{
				HStack {
					Text("Text Field Label 1")
					TextField("Text Field 1", text: .constant(""))
						.frame(width:96,height:22)
					Spacer()
				}
				.padding(.leading)
				HStack {
					Text("Label 2")
					TextField("Text Field 2", text: .constant(""))
						.frame(width:96,height:22)
					Spacer()
				}
				.padding(.leading)
				
			Spacer()
			}
				
			.tabItem{
				Text("Tab Label 1")
			}
			.tag(1)
			
			Text("Tab Content 2")
			.tabItem{
				Text("Tab Label 2")
			}
			.tag(2)
		}
	}
}

Which gets us:

Hrm…

I mean, it’s not bad, but the field alignment is kind of messed up. So how do we fix that? I mean, we could add in some padding statements, but that’s a bit much, especially as we may want to have more stuff in the window.

So to do that, we’re going to get medieval on this thing, by which I mean, we’re basically going to have to build a damned table to hold things. (Seriously, I’m having flashbacks to GoLive CyberStudio here.) Because that’s so much better than the old way.

So what we end up with are two VStacks in an HStack in a VStack. To get everything lined up correctly and with the right amount of margin from the left side of the window, we have (Comments added for clarity):

struct ContentView: View {
	@State private var selection = 1
	var body: some View {
		TabView(selection:$selection) {
			VStack {
				HStack {
					//the alignment statement here sets both labels to be left-aligned
					VStack(alignment: .leading) {
						Text("Text Field Label 1")
						Text("Label 2")
					}
					//this padding statment creates space between the edge of the
					//window and the text
					.padding(.leading)
					//this alignment property may not be strictly needed
					VStack(alignment: .leading) {
						TextField("Text Field 1", text: .constant(""))
							.frame(width:96,height:22)
						TextField("Text Field 2", text: .constant(""))
							.frame(width:96,height:22)
					}
				// this is the spacer for the HStack so it's all on the left
				Spacer()
				}
				//this is the spacer for the main VStack so it's at the top
				Spacer()
			}
			//this padding property gives us some space between the tabs and the stuff
			//in the main VStack
			.padding(.top)
				
			.tabItem{
				Text("Tab Label 1")
			}
			.tag(1)
			
			Text("Tab Content 2")
			.tabItem{
				Text("Tab Label 2")
			}
			.tag(2)
		}
	}
}

Which looks like:

Alllmost

That’s really close. but the labels and the text field alignment is kind of muffed. You might think “this is where that vertical alignment thing in the HStack comes into play!” You would think that, but you’re wrong. These are two VStacks in the HStack, remember? The way I ended up solving it was to add some padding to the bottom of the one label, so they separate out better:

struct ContentView: View {
	@State private var selection = 1
	var body: some View {
		TabView(selection:$selection) {
			VStack {
				HStack {
					//the alignment statement here sets both labels to be left-aligned
					VStack(alignment: .leading) {
						Text("Text Field Label 1")
							//this separates the labels enough so they seem to
							//line up with the text fields better
							.padding(.bottom)
						Text("Label 2")
					}
					//this padding statment creates space between the edge of the
					//window and the text
						.padding(.leading)
					//this alignment property may not be strictly needed
					VStack(alignment: .leading) {
						TextField("Text Field 1", text: .constant(""))
							.frame(width:96,height:22)
						TextField("Text Field 2", text: .constant(""))
							.frame(width:96,height:22)
					}
				// this is the spacer for the HStack so it's all on the left
				Spacer()
				}
				//this is the spacer for the main VStack so it's at the top
				Spacer()
			}
			//this padding property gives us some space between the tabs and the stuff
			//in the main VStack
			.padding(.top)
				
			.tabItem{
				Text("Tab Label 1")
			}
			.tag(1)
			
			Text("Tab Content 2")
			.tabItem{
				Text("Tab Label 2")
			}
			.tag(2)
		}
	}
}

and from this, we get:

Hey, that looks right!

Oh, so if you want your window to be the right size, you add a .frame property to the bottom of the view block:

struct ContentView: View {
	@State private var selection = 1
	var body: some View {
		TabView(selection:$selection) {
			VStack {
				HStack {
					//the alignment statement here sets both labels to be left-aligned
					VStack(alignment: .leading) {
						Text("Text Field Label 1")
							//this separates the labels enough so they seem to
							//line up with the text fields better
							.padding(.bottom)
						Text("Label 2")
					}
					//this padding statment creates space between the edge of the
					//window and the text
						.padding(.leading)
					//this alignment property may not be strictly needed
					VStack(alignment: .leading) {
						TextField("Text Field 1", text: .constant(""))
							.frame(width:96,height:22)
						TextField("Text Field 2", text: .constant(""))
							.frame(width:96,height:22)
					}
				// this is the spacer for the HStack so it's all on the left
				Spacer()
				}
				//this is the spacer for the main VStack so it's at the top
				Spacer()
			}
			//this padding property gives us some space between the tabs and the stuff
			//in the main VStack
			.padding(.top)
				
			.tabItem{
				Text("Tab Label 1")
			}
			.tag(1)
			
			Text("Tab Content 2")
			.tabItem{
				Text("Tab Label 2")
			}
			.tag(2)
		}
	//set the window size here. Beats me why
	.frame(width:706,height:651)
	}
}

And now we have a window that starts life in a precise way:

This is…this is a lot of weird-assed work to get the very simplistic results I wanted. And that’s only on one tab. I have to redo that for every tab. Literally all that code I added is to set up two labels and two text fields, that aren’t doing anything.

I freely admit that my n00bness probably caused a lot of this. But, it was not helped by nothing about using SwiftUI with macOS apps. All of Apple’s documentation and every gods-forsaken screen shot I could find were all for iOS. This may be the longest bit of anything using SwiftUI for macOS available on the internet, and that is sad. Shamefully so. Keep in mind, my end goal has a lot of UI elements. So this should be awful at some point. But I may keep banging on it, because god knows, no one else is, and even documentation from a n00b is better than nothing.

If Apple wants people to use this for macOS dev, and not just i(Pad)OS -> macOS via Catalyst, then they have to, to be blunt, pull their goddamned heads out of their asses on this. Start creating documentation and tutorials and sample code that actually works for macOS targets in and of themselves. Or just admit that SwiftUI is not a good choice for starting on macOS, and that they don’t plan to care about that. That would at least be honest.

As well, there’s some choices here that are just baffling. I refer to SwiftUI as CSS for native UI design, but even CSS isn’t as bad as some of this. Having me put all the contents for a tab before the .tabItem block and not oh, in the .tabItem block is pretty damned weird, and completely counterintuitive.

Forcing macOS devs to specify control location the way you would on i(Pad)OS is way more work than it needs to be. Let me drop a damned button on a window and give me the shell code for that.

But for now, outside of idle curiosity, I cannot see why a macOS dev would ever want to use SwiftUI, it’s just awful.

(If you feel a need to tell me what you think about this, I’m @bynkii on twitter. If you feel the need to tell me i’m stupid for not immediately falling to my knees and loving SwiftUI, you may want to not actually tell me that. It’d be a waste of time for both of us. If you want to give me some pointers from a macOS perspective, DEAR GOD PLEASE!!!!)

Advertisements

“It’s Complicated”

Warning: this is not about tech or D&D comedy. It’s a bit personal, and some of you may not want that here. I understand that more than you think, but it is my site, so yeah.

I have been a reader of Goldie Taylor’s work for some years now, but it wasn’t until I started following her on twitter (@goldietaylor) that I gained a true appreciation for her depth as a writer, her ability to talk about the events of her life, in particular her father, and the mystery surrounding his death, one that may never be cleared up.

The writing she’s done about her family has resonated in me in a big way, but it wasn’t until recently that it came together why: in a very real sense, I never knew my parents. I mean, they were there, my dad until 1991 when the throat cancer he’d worked so hard to get took him, and 1999 when my mom’s lungs did the same for her. I wasn’t there when either of them died. I was in the Air Force in 1991, assigned to Grand Forks, and when my mom died, I was living in Boston, she in St. Petersburg, Fl.

My mom had died some time before I knew about it. For many, that seems strange, but my mom and I would regularly go weeks, sometimes months without talking. We were…contentious…at times. All three of us. We spent a lot of time talking at, or over each other, but rarely with each other. It wasn’t until I’d tried to call her and getting no answer, called the local police to check on her that I found out I was no longer just half an orphan. The way the cop said “Mr. Welch?” told me everything he was about to say.

I was 24 when my father died, and 32 when my mother died. My father died long before my son and my somewhat disastrous first marriage happened, my mom was able to spend sometime with Alex when he was younger (two or so.) My dad was fond of telling stories about himself as a child, and as a young man, most of them…well, the movie “Big Fish” reminded me a lot of him. His stories have a kernel of truth in them, but taking any of them as gospel, probably not a great idea.

My mother said almost nothing about herself. Before she died, I knew she’d been raised in dire times (they were both born at the beginning of The Great Depression), that she had walked away from the Catholic Church after being disgusted by the opulence of a cathedral in Mexico City in 1966 (while she was pregnant with me) while so many of said cathedral’s parishioners were living in the street and starving. “They wouldn’t give them food, but still demanded tithes.” she said, with more disgust in her tone than I’ve heard before or since.

To my knowledge, she never set foot in a Catholic church for services ever again. My mother was unbending about some things.

All I knew about them as a couple was they met in the Boule Miche bar in Chicago, my dad thought she was quite attractive, they dated, they got married and well, then we were a family. They were married in a civil service in Indiana, ostensibly to avoid payback for the many pranks my dad had pulled on his siblings.

It was only later, after she died, that I found out the truth underneath a lot of things. They were married in November of 1966, I was born in March of 1967. Everyone can do that math.

Sitting on the floor of her apartment, reading that wedding license, so many things clicked. Like really why they’d gotten married in Indiana. My dad’s family was very Irish-American and very Catholic. There had always been this tension between my mother and his family. Her antipathy was barely-disguised, and after about 3-4 beers, loudly undisguised. It took me 32 years to find out why.

It took me another few years to forgive them. Which is funny, given my parents and I weren’t that close the last 10-15 years we were on the planet together, but that was us. Other people being unkind to them was not permissible. Weird, isn’t it, how that works.

What also clicked were the reasons behind the nightly, alcohol-fueled screaming matches they had. Well, alcohol-lubricated. They were fueled by anger and resentment. My mom had carved out a rather nice niche for herself in Chicago, and my surprise introduction cratered that niche, rather thoroughly. She never learned how to deal with her resentment at that, and so I was called a remarkable variety of unkind things growing up. Usually at night, with beer being the lubricant that opened the doors to where she mostly kept those feelings locked away.

I’m not angry about it anymore. Getting older does that, it gives you perspective, and with any luck, some empathy.

But when I was younger, it meant that there was this distance between us that never went away, never got better. Had they lived longer, I don’t know if it would have gotten better. I’d like to think it would have, but hard to say.

My mom had radiation poisoning from a job she had with the Air Force in Japan in the late 1940s. Her office was in Hiroshima. I found this out from a cousin long after she died. She’d come home sick, her hair falling out, weakened…then some months later, she was better and she never talked about it to my knowledge. I know she never talked about it with me. All I knew of that time was that she’d been in Japan and there are some pictures of her at parties. She is almost never smiling. There’s a wariness about her, but I don’t know why.

There are things about her life that tell me she may have not been completely straight. I can’t imagine, if that was true, what that was like for a woman in the U.S. in the 30s-60s. But it would explain much. I never knew what her life as a woman, as a person was like, and I doubt I ever will. My mother guarded her privacy more zealously than anyone I have ever known, and even if I could find out, it would almost feel like a betrayal to actively do so. Whatever reasons she had for closing off her past as tightly as she did were hers and I do respect her memory enough to allow them to remain as she preferred.

If abortion had been legal in the late 1960s, I am quite sure I’d not be here. If that would have allowed my mother to live a life with joy instead of resentment as its core, I would almost volunteer to fix that. Every unwanted kid knows that fact. No one has ever hidden that from their children.

note: This does not mean I don’t think that she loved me. I’m sure she did, I know that to be true. But love does not eradicate everything negative about a relationship.

My father was something of an open book, in that he talked a lot. What I learned, decades after his death, was that what he talked about was shallow. It wasn’t until his youngest sister sent me a box of his things that I learned things like how he’d not hit puberty until after high school. I took after him that way, fortunately my son did not. That is a shitty way to go through high school. I learned that he and his father had not gotten along well, and at least up until him being drafted into the Army for Korea, he’d not known why, but desperately wanted to fix that.

I don’t know if he really ever did, but I would like to think so.

He had a host of anger issues that he was never able to manage well. After he was mangled by a car in 1978, he spent the next 13 years kind of waiting for death. He just gave up in many ways, and the beer didn’t help. Sometimes, often times, I think the cruelest thing ever done to him by the universe was allowing him to survive that accident.

I’m regularly surprised that I’m not ardently anti-alcohol, given its centrality in so many of the worst experiences of my childhood, but ultimately, the beer just sits there. It’s the human that causes the problems.

People, not often, but sometimes ask me if I miss my parents. I say “yes” because that is what is expected. In truth, I don’t know. I miss parts of them. They were both, regularly fiercely intelligent. They were obsessive readers, and played Scrabble the way MMA fighters go after belts. They were amazing writers, and my father a just as talented photographer. I learned a lot from their good qualities, as well as their bad.

But I can’t cafeteria them. I can’t just remember parts of the people they were. For better or worse, I’m stuck with all the memories. I am specific about what I will share, but i’m stuck with the range of memories they left me with. So when someone asks me if I miss them…I don’t know. There are parts I absolutely miss, and parts I absolutely do not. Twee tropes like “don’t dwell on the bad” don’t help. They were complicated people, completely unprepared for the ADD-poster child they brought into the world. I daresay most people were unprepared for me.

They did the best they were able to do with the paucity of tools they had available. I managed to not die at a young age, and given I grew up in Miami in the 1970s/1980s, that is kind of an accomplishment.

So yeah. There’s no real point here. There may never be. Other than maybe I feel a certain sympathy/empathy with Goldie Taylor’s lack of knowledge about her father and his death.

What’s The Difference Between An Or-gee And an Orgy?*

Our trio is in Westgate. This is a bit odd, for Paladin at least, because Westgate is not a place for the pure of heart. Outside of Zhentil Keep, and Thay, it’s the worst place for the pure of heart, and yet Paladin likes Westgate. (He tolerates Thay, but Zhentil Keep is a no-go. Even he cannot handle the smells from that city.) Paladin likes Westgate mostly for the restaurants and their smells. Which is a bit odder. (A bitter odd?) He greatly wishes the general level of evil was much lower, but over the years, he has come to realize that larceny, murder, pettifoggery and really good food go together. Even to him, that makes no sense, but it is how things are, and so Paladin likes Westgate.

Monk also likes Westgate, for a related reason: the abundance of amazing coffee shops. Paladin once asked him why coffee shops and criminals seem to exist in nigh-equal quantities and Monk explained that since criminals tend to do criminal stuff at night, they need coffee. Since they have, at least occasionally, gold to spend, they like good coffee. “Oh.” Paladin said, and went back to smelling his latte. (Paladin never smells Monk’s coffee. Paladin tried smelling Monk’s coffee once and was miserable for a week. “It took forever to get that smell out of my head.”)

Barbarian doesn’t really care. There are few places she likes or hates more than any other places. The only real standout is Shadowdale. Because someone there thinks he knows everything and won’t shut up about it, and even she gets tired of the dickwaving with Storm Silverhand. 

What Barbarian doesn’t know is how amused The Simbul (and quite possibly Mystara herself) are by how much a certain archwizard annoys her, (and vice-versa), and how regularly the both of them work to arrange things so she has to go into or near said wizard’s home.

Mages, even good ones, even ones that have ascended to godhood, can be right proper pricks. Remember that.

As they walk about, they have their usual discussion about where to eat. As has become her custom, Barbarian is fine with whatever Paladin wants. She has decided Paladin is her…well, there’s not a proper word for it. She feels kindly towards Paladin, (she also feels things for Monk, but they are Very Different Things) and were Paladin a child or pet, would be said to be spoiling him rotten. Honestly, it’s how Monk also treats Paladin, and well, how just about everyone treats Paladin. 

There’s a rumor that Szass Tam built a kitchen with living staff just for when Paladin comes by for their semiannual checkers match, mostly because Paladin always gives him advance notice so he doesn’t accidentally destroy Szass’s zombies. “He’s the only living creature who is genuinely considerate of my feelings. Of course I’m going to be nice to him.”

She does ask that they not go to The Quivering Thumb, as it is one of the few places that has not only banned her, but spent a fortune in magic to make said ban stick. “They’re more whiny than a gnome without turnips. Something, something you’re not allowed to behead the other gladiators. Bah.” Paladin nods and makes a note of it, Monk, as he always does when she demonstrates her mayhem’ing ability, sighs and falls even more in love with her. 

Monk and Barbarian are a terribly cute couple. In that they are both absolutely enraptured by the other, (the cute part) and what that has involved in terms of surrounding areas is legitimately terrible, (the terribly part. They are literally terribly cute.) There’s a beholder that will never again open its eyes after accidentally espying them en flagrante destructo. That’s a description, not a typo.

They’re walking down a fairly large road in front of Big Edna’s Tavern when Monk pulls up short, gets an annoyed look, holds out his hand and says “Give it back.” Both Barbarian and Paladin are complely confused by this, and said confusion is not helped by Monk’s shadow suddenly appearing to give birth to just over a meter’s worth of halfing dressed all in black. A grumbling halfling. With red hair.

“You are absolutely no fun.” the halfling says. “I am all the fun I need to be, and if you take my money, I cannot buy coffee.” Monk replies. “Fine. Here.” “All of it.” Slitted green eyes roll into the back of Thief’s head. “One day.” she says as she drops another handful of coins into Monk’s hand. “Not yet.” he replies as he weighs the items she’s handed him. At this point, they are both aware of two things. First, Paladin is very happy to see Thief. Not that he approves of stealing or any of Thief’s hobbies, but she is one of his favorite people, for she manages to procure a variety of things for him to smell that no one else can. 

The second thing is the growling and chattering noises coming from Barbarian, who is seeing this strange woman bantering with her Monk. Her eyes are not quite actually glowing red, but it is a near thing. Thief, hearing the noises Barbarian is making, stands fully erect, which means she is slightly taller than Monk’s beltline, and says “DO I HEAR A MIDGET?” The murderous rage that was about to explode out of Barbarian does a reversal into joy so fast it sprains something, and Barbarian says “DO I SEE A GIANT?” with an unusually large smile on her face.

Thief turns, and in an explosion of giggling and squee-ing, jumps into Barbarian’s arms. No one is sure how she avoids all the spikes, but she does. Both Monk and Paladin are agog, for they have never actually seen Barbarian giggle, but giggle she does as she and Thief hug the dickens out of each other. “I didn’t realize you were in Westgate!” Barbarian says once they’ve stopped. “Aye, I’ve been here for a while now. I accidently own an inn” she says, jerking a thumb over her shoulder. “YOU’RE “Big Edna” now?” Barbarian says as she starts to laugh. 

Thief hangs her head. “Technically no, but everyone seems to just love to call me that. At least until they get stabbity’d.” “Well, I will not call you that Thief” Paladin says, “for you clearly do not like it.” The halfling beams up at him. “You are truly the bestest of friends as well as the cheapest of dates. All of you come inside, and Paladin, I have treats for you.” While Paladin is not a jumper, (he can out-jump an Otyugh. Barely), he manages what could be a heel-kicking jump while cheering. Half the passers by are amused by this, the other half throws down money and run away. Thief quickly collects the money, because of course she does.

They all head for the nicest table in the establishment, which is initially occupied by some “of” adventuring company. “The company OF light”, “The guild OF gold”, or whatever. It’s always something OF something. They quickly abandon said table at a high rate OF speed, without any words OF protest. Unsurprising given the simultaneous smiling from Paladin, Monk’s “I wonder if I could drive your elbow hinge through your skull with one finger tap” look, the glare of “IF YOU DO NOT MOVE I WILL END YOU AND EVERYONE WHO HAS EVER MET YOU” from Barbarian, or Thief smiling sweetly at them.

It is probably Thief. The last group she smiled at like that was found with stab wounds in their stab wounds. it’s one of the reasons Monk gets along with her: he appreciates her artistry. Thief likes Monk because while everyone for a league is hating him, they don’t notice her picking their pockets or their houses. (She cleans up during the yearly “Why Won’t Monk Just Die Already” hate parade in Port Llast.) 

Thief snaps her fingers, and drinks appear on the table for all. Paladin’s drink is not actually drinkable, but it’s there for the scents, not the taste, and judging by how Paladin is starting to glow a bit, they are very good smells. There is coffee for Monk, something very alcoholic for Barbarian and Thief has some vaguely vanilla-scented tea that she lets Paladin get a good sniff of before she drinks it. 

“So how…” Barbarian asks, “do you “accidentally” own a tavern?” “She stabbed someone for it.” Monk says. He and Thief get along, but it is a very grumpy kind of friendship. No one is sure why they snipe at each other the way they do, but that is Thief and Monk. A constant stream of insults and grumbling. “I did not. I won it fair and square.” “You have never done anything fair and square. You’ve never even managed a vaguely cheating triangle.” “Well, in this case, I did. Sort of. What I discovered was that if you’re going to stab a fat Sembian merchant in his nethers, make sure before he dies that he’s not under some stupid curse that transfers all his assets to you and keeps them, and you, there.”

“Wait…” Barbarian says, with badly concealed laughter, “…you’re the one that offed old fat Gornhaudar?” Thief’s eyes narrow and her lips grow thin with annoyance. “…yes…that would be me.” “Didn’t you know about his curse? I thought everyone knew about that.” “NO…no I did not. You think I’d have killed him if I had?” “You’re the only one. It’s why I only broke most of his bones when he groped me.” Thief rolls her eyes. “I knew I should have asked you about that. Everyone was dreadfully curious as to why he lived.” 

By now, Monk and Barbarian are staring at the two women, completely baffled. Monk drains his coffee and signals for more by first attempting to get the waiter’s attention, and when that does not work, flinging his mug so that it bounces off of the waiter’s and the barista’s heads before coming to a stop next to the coffee station, upright, undamaged, and ready to be filled. “Can one of you explain this in a way that won’t make my head hurt?” he asks. Paladin thinks about paying attention, but there’s a strata of a lavender variant that he’s only smelled once before buried under layers of efreet sweat and stone giant tears that is demanding all his attention. Also, he knows if it involves Thief, it will be very complicated and probably involve her deep love of shiny things. The only thing that ever changes is how complex the trouble is and how many shiny things are involved. He goes back to smelling.

Thief sighs and nods. “I suppose I should, since I’m now “Big Edna” after all. See, this restaurant? It’s a moneymaker. It always makes money. Been in Westgate since Westgate was big enough to have a restaurant, and it has always made money.” “This is bad?” “Monk…nothing always makes money. I don’t always make money. This place has almost two millennia of non-stop profit. The Time of Troubles? Profitable. Spellplague? Profitable. Dragon swarms? Profit. Lords of Hell running rampant? Profit. Plague? Profit. Swarms of whores? Profit. Nothing. Ever. Stops. The. Profit.” “I can see where that would attract you.” 

Of course it did. My gods, you own this place and you can do whatever you want because you’ll always have money. I was going to finally go back into full time literature acquisitions, which doesn’t pay well at all, but part of my deal is I get to read it before I turn it over.” “And then you found out about the curse.” Thief sighs and stands on her chair so she can properly slam her head into the table. “And then, <wham>, I found out, <wham>, about, <wham>, the curse.<whamwhamwham>” 

“Said curse being…” “That you can’t leave Westgate. When it was first cast, you couldn’t even leave the gods-damned building, but millennia or so of constant attempts at dispelling and circumvention by the victims, and it’s gradually weakened to where you can at least get to the city borders.” “What happens if…” “You try to really leave? You end up back here. Mid-stride. Mid-jump. Mid-jog, mid-skip, mid-slide-on-your-ass-on-a-long-trail-of-grease. If you’re on horseback, the horse keeps going, you pop in here…at full velocity mind you, which was not fun.” “Well, there goes my catapult idea.” “Already tried it. Broke six bones. Stop laughing.”

Monk thinks a moment, and hands his again-empty mug to the waiter who has realized that making this table wait, or even have to vocalize their wishes will be quite painful and so now is the very model of quiet, efficient, servitude. “That…is a remarkably appropriate curse” he says, chuckling a bit at the misery on Thief’s face. “It’s a remarkably something curse.” “So how do you break it?” “So far? Death. The owner’s. That’s the only thing I’ve found. You can’t sell the place, the curse won’t let you put it in writing or even verbally. I tried doing the entire thing in that finger language I learned from a Drow and my hands stopped working. I tried firing the whole staff and closing the place. The next morning, they were all at work, the place was open, and no one remembered me firing them. I’m making more money than I thought possible with less work than I dreamed possible and I am more miserable than a Drow at the beach.”

“Death…hmm…” Barbarian saying those words gets everyone’s attention. It’s rather like a dragon’s inhale. One with bad halitosis in addition to you know, the fire. Everyone in the room is quietly moving towards the exits, somehow casually running for their lives so as not to attract Barbarian’s attention. They’ll all have some very pulled muscles in the morning. Barbarian stands up, walks over to the nearest support column in the room and as gently as possible, removes a small piece from it with her axe. 

She looks over at Thief. “Did you feel that?” “No, it’s a piece of wood two of you away. Why would I feel you hitting it?” “Death…is such an imprecise word.” Barbarian looks over at Monk who has figured out what is going on and is also now standing, putting on the handwraps she says are her favorite, the ones that cause  things to catch on fire when he punches them. “I knew you were special.” she says to him, her eyes aglow with love. 

Love of Monk, love of immenent destruction, it’s hard to tell with her, but, they are indeed aglow. “Paladin dear, would you and Thief mind stepping outside for a few minutes?” she says as she dons her helmet. “Monk and I have a curse to dispel. Make sure you take Thief by her safe, she’ll want to grab as much as she can carry before.” “Before what?” “Before it’s all splinters. Hurry dear, Daddy and I need some special us time.” Monk’s eyes are starting to glow as well.

Somewhere, a blind beholder whimpers.

“But you can’t dispel curses, and Monk is not mymfffff” Thief has jumped on to Paladin’s shoulders and put her hands over his mouth. “Let us do as Mummy asks,” she says, “and make some haste for the nice, safe street. Don’t worry about the safe, Barbarian knows I don’t keep anything I care about in something someone might be able to lay hands on.” With that, they both exit, stage now.

Twenty minutes later, the restaurant is not even splinters. It would be doing well to be ashes. It has not just been destroyed, it has been removed from existence Of the crowd in the streets when the destruction starts, Thief and Paladin are the only ones left when it ends. Thief is the only one who watches the entire thing, and she’s not sure she should have. She makes sure Paladin is facing away from the bar, and has cast a lovely deafness spell upon himself. 

At the edge of Westgate, the four of them pause to let Thief work up the courage to take a step she hasn’t finished properly in over a year. In theory they are being “run out of town by the Eye of Justice”. By which they mean the most junior member of the Eye followed them at sufficient distance that he could see them leave. Barely. The step works, as Barbarian thought it might. “There’s not a huge difference between killing a building and killing a person. Well, I have to sharpen my axe a bit more after killing a building, and it screams less, but other than that, killing is killing. So now, what shall you do that you have your freedom but no more profit machine.” 

Thief once again smiles sweetly, causing Monk to start cursing in three languages no longer spoken on Toril, one of which never was. “Why, hang out with the three of you my dear. None of you are terribly profitable, but you are all a lot of fun.” Monk is the only one not in agreement with this idea, but Barbarian gives him a look and his protests die faster than the last person who told Barbarian girls can’t use axes as well as men. (Oghma is still researching exactly how she managed to do that much damage to one person on every plane of existence at the same time. Mystra doesn’t let him spend too much time on it, it makes him weep about physics.)

As they walk off, Thief suggests they should all go to Shadowdale.

Somewhere an archmage whimpers.

*if you aren’t enough of a Benny Hill fan to get the joke, I’m certainly not going to explain it to you. -Writer

Dinner In Voonlar

It’s early evening in Voonlar. Enough light to see, be seen, but just enough darkness to make it…interesting.

Fortunately, (for those who would make life interesting for others more than any) there is enough light to see why our trio should be allowed to dwell in the depths of boredom evermore. 

As is common in the smaller towns, no one really knows what to make of Paladin. They may have heard of golems, but he doesn’t really fit the bill. For one thing, he radiates happiness at simply being alive. Literally. Paladin’s aura is the kind of pure shiny thing that gives even the foulest demon a strangely happy feeling. In a world of worry, Paladin walks without fear, in search of new smells, or familiar ones that have brought him pleasure. (Paladin neither consumes nor expels food, he is truly the cheapest of dates.) 

He does whirr a bit as he walks, for he’s a warforged. Which is like a golem, except, as Paladin puts it, he doesn’t just murder things. It does make it a bit jarring when he smiles, or gets giggly about butterflies. Well, anything, really. The giggle of a warforged has broken many an evildoer’s courage. The upshot though, is that even the thought of giving Paladin a bad time causes either fear or guilt in even the coldest of hearts, (or cavities that once held hearts.) There’s a lich near Waterdeep who has given Paladin a standing invitation for chess lessons whenever he has the time. People just like Paladin.

People do not just like Monk. People (sometimes) tolerate Monk, people (regularly) hate Monk, people (constantly) want to do awful things to Monk, (especially Storm Silverhand), and would except for the fact that Monk is well, a monk, and a very good one. It doesn’t help that he moves as though he is at the center of the world and it moves around him. Half-buried rocks don’t have the balance Monk has, and the most accomplished dancer in Waterdeep became almost suicidal after observing him rise from his seat to applaud her performance. Monk is very pretty, Monk is beyond graceful, and upon first glance, it is very difficult to understand why people hate Monk so.

Then he opens his mouth. 

Someone once asked Elminster about the hate Monk creates, and Elminster replied, “That child is a being of angelic grace and beauty, with a mouth worse than the foulest middens on three worlds.” Monk is aware of this, but stopped caring some years, perhaps centuries ago. No one is sure how old Monk is, they’re too busy trying to make him go away. Storm Silverhand commented that if you want proof that Paladin is made of purest kindness and mercy, the fact he has not tried to kill Monk is all the proof anyone should need. Storm dreams of turning Monk inside out.

Regularly.

When asked about his effect on people, the most detailed remark Monk ever provided was “Some people think about other people. Their feelings. Their cares. I haven’t seen people as anything more than a collection of places to be hit in longer than I care to remember. You see a butcher, I see someone who I would avoid hitting in the ribs because of the extra suet butchers seem afflicted with.” Somewhere along the way, Monk became rather disassociated from everyone else. If that bothers him, no one can tell. 

He is however, as much as he can be, solicitous towards Paladin. “Just look at the boy, he’s the most innocent thing ever. I mean, he’s a living battering ram incapable of being hurt, but even beholders think he’s cute. It would be an act of pure chaos to be unkind at Paladin.”

Monk, everyone agrees, is totally not chaotic. They do wish his definition of “good” was more “makes other people smile” and less “makes me giggle.” But he will relentlessly follow any and all rules. He just doesn’t always tell others which rules he happens to be following at any given moment.

The upside for Monk is that simply being him makes people think twice about talking to him, much less giving him a hard time. This works out well for them, since Monk can collapse a minotaur’s skull with less effort than a leaf uses to float on the wind.

Sometimes, there have been groups that have braved Monk’s “go away” aura and Paladin’s “Everything is beautiful” aura to give them a hard time. They’re buried in small boxes around Toril.

Ever since Monk and Paladin went through Yulash a week or so ago, even those groups give them a wide berth. Well, not so much Monk or Paladin. They give Barbarian a wide berth. Beholders give Barbarian a wide berth. It is rumored that on its last rampage, the Tarrasque was stopped by Barbarian. She didn’t kill it, she gave it a bad look. Barbarian inspires fear the way Monk inspires hate. Only worse. 

Barbarian has not been a part of the group for very long, but she knows two things: first, she knows that Paladin is both someone who cannot be hurt and someone who she will protect from even the slightest attempt with every fiber of her being and every inch of her axe. Halfway between Yulash and Voonlar, a bird attempted to relieve itself on Paladin. Barbarian didn’t kill the bird as much as she erased its existence. Paladin doesn’t know it, but he is the safest being in existence. Ever. (She is much of the reason why the Voonlarian prejudice towards non-humans is curiously missing when it comes to Paladin.)

The second thing she knows is that Monk stirs feelings in her that make it hard to not kill things even more than she normally does. There is something in the complete and utter discipline surrounding Monk that sets her insides on fire, and she plans on breaking a lot of beds to see if he’s any good at quenching the fire. Or making it worse, she’s not fussy. The entire trip from Yulash, she’s been splitting things with her axe to keep from possibly shocking Paladin with what she’s thinking of doing to Monk.

Trees. Rocks. Random ancient adamantine pillars that survived at least two battles between major deities. Stone bridges. Four bandit companies. That sort of thing.

Barbarian is a human female, six feet tall, with the pinkest hair Monk has ever seen. Monk is well aware of how Barbarian feels about him, he feels much the same about her. In fact, in the week since meeting her, he has tripped three times. Monk has not tripped at all in decades, perhaps centuries. They haven’t discussed it yet, but Monk is fine with seeing if they can break a bed. Or an entire inn, in this instance, he’s not fussy. Monk may be perfectly lawful, but Monk is not an ascetic. Monk likes his beds soft, his coffee hot and Barbarian. He would never admit it, but he actually likes Barbarian more than coffee.

Barbarian is clad in armor which is covered in spikes. Spikes which have spikes, and disturbing stains. “I got the idea from the battlerager company I asked to stop bothering me. Those spikes are proper dwarven craftsmanship.” She smells a bit like the back of a butcher’s shop. Well, her armor does. No one really knows what Barbarian herself smells like, although Paladin has an idea. Paladin is a connoisseur of smells, he thinks Barbarian smells very pretty under all the armor. 

Paladin would never state this out loud, it might hurt Barbarian’s feelings. Paladin likes Barbarian, he thinks she is very nice. Barbarian would say that Paladin is just darling except she doesn’t know that word. At all. She’s caught herself starting to use the word “sweetie” when addressing Paladin, which is quite disturbing since prior to meeting Paladin, she didn’t know that word either.

Barbarian’s weapon of choice is a large double-bladed axe. It may be magical in nature, but the encrusted gore makes it hard to tell. No one wants to get close enough to tell in any case. After dealing with what she called a “minor problem” in Phlan’s main graveyard, (she called it a “minor problem”. The people of Phlan called it “a legion of undead bent on killing everyone in the city.” Perspective, it’s a thing), the mayor of Phlan emptied the city’s treasury into her sack. When asked why he overpaid to that extent, his answer was “I have seen things in the dungeons of Zhentil Keep that came not close to what that woman did to a vampire.” He then waddled off to change his clothing, as the memory of her had caused him to soil himself. 

Thoroughly.

When it comes to killing people, Barbarian is an artist. A gruesome, terrifying artist. Her and Monk are opposites in almost every way, and if they do not get some private time, and soon, they may just break a town.

As neither Monk nor Barbarian are particularly fussy about where they have dinner, they allow Paladin to choose. He initially thought the Sign of the Shield had nice smells, but the lack of a proper dining room puts him off. “I don’t like to smell food by myself, there is no one there to eat it when I am done, and the servants never believe that I didn’t do something to it. I feel bad about wasting food.” Monk and Barbarian note the very private room setup, and resolve to spend the night here. The building seems solid, it should survive.

Paladin nixes the Swords Meet immediately. Aside from his disdain for over-spicing food, (”If  all I wanted to smell was spices, I’d be a caravan guard in Sembia”), the fact the inn is basically a local gathering place for Zhents means that instead of smelling food, he’d be watching Monk and Barbarian slay Zhents. That doesn’t particularly bother him, but it’s been a long walk from Yulash, he really wants to smell some nice, properly-cooked food, and he doesn’t want to have to deal with the smell of dead Zhents. 

They all agree on the Three Elves. It has unlimited food for only five silvers (Barbarian approves), plenty of coffee, (Monk approves) and there is no wall between the kitchen and the dining rooms, so not only can Paladin smell his food, he can smell the cooking, and that is an uncommon joy for Paladin. 

The three sit down and fork over their money. Barbarian pays, she lost a bet with Monk in Yulash. Haundrae, one of the four owners of the in starts to look askance at the money, (understandable given the stains on the gauntlet that drops it into his hand), but sees that it’s attached to Barbarian and decides that well, silver washes just fine. The owners, also the cooks, are soon busy as can be cooking the vast amount of food the trio requests. Barbarian can out-eat a small company, Monk doesn’t eat as much, but he does adore food, and Paladin orders one of everything so he can smell it. 

They’re seated near the kitchen area, and soon the cooks are beaming in the light of the joy emanating from Paladin at the plethora of smells he is bathed in. (Literally. Paladin gets a bit glowy when he’s this happy.) Well, the smells from the food and the kitchen. The smells coming from Monk and Barbarian are not as joyful to him. Fortunately, the food and the kitchen smells outweigh them. Paladin resolves to spend the night in this inn. Hopefully near the kitchen. 

The other three owner-cooks of the inn are a trio of large women, in all dimensions, two are sisters. They’re fantastic cooks, possessed of bubbly flirtatious natures. They are not however, flirting with Monk. This is less due to his personality than the fury they see on Barbarian’s face if they become too familiar with Monk. Monk would normally not be okay with this level of possessiveness, but he’s too enthralled by both Barbarian’s hair and her oft-demonstrated artistry with dismemberment and mayhem. He has found his soulmate. She has found what she hopes is the first man who can keep up with her. Regardless, she makes it clear any extraneous touching of Monk may result in the sprouting of bloody stumps on the toucher. She does this by calmly licking the blade of her axe while glaring.

Perhaps “calmly” isn’t the best word. But the growling is barely audible and her teeth only chatter a little.

The meal is served and devoured with no unnecessary bleeding, so it all works out. This is helped by the large tip Barbarian leaves. (She’s a very good tipper. It’s why she’s welcome in almost every tavern in Toril. Especially the ones she’s destroyed.) As dessert and the empty third keg of Brown Nut Ale are cleared, Paladin says “I like this place, it smells nice. I think I’d like to stay here tonight, what do…” He never finishes the sentence, Monk and Barbarian are already out the door heading for the Sign of the Shield. Fortunately, Monk is slightly faster than Barbarian, so the door to the inn remains intact. Monk only breaks down doors when required, totally not chaotic.

Paladin hears the door to the Shield open and slam shut, then something that sounds like an innkeeper (Mester) starting to refuse to rent a room to Barbarian and Monk followed by…well, imagine the sound pure fury makes as it shoves a handful of platinum into an uncomfortable place and I don’t mean the back of a ffolkewagon. Paladin and everyone in the Three Elves all decide that everything is fine, no need whatsoever to check on the innkeeper over at the Shield. Mester will be fine. Probably. It can absolutely wait until morning.

A few minutes later, there’s the sound of what might have been some of the Shield Trading Company’s veteran guards running into the inn to deal with unruly guests, being tied in a knot and flung into the street through the front door. But everyone who heard the clanging and the thudding and the soft sobbing decided the best course of action was to Mind Their Own Business, and let the clerics at the House of Holy Light know they may want to do something about the guards, the sobbing was somewhat off-putting. Also, no one should be left in the shape of a square knot for too long, it’s a bit hard on the back.

To this day, no one is precisely sure what actually happened to the Sign of the Shield, the other guests, along with the remaining un-knotted staff had fled within minutes of Monk and Barbarian going into their room. None of them would ever speak of what they saw or heard. It took three days before anyone could walk near, much less into the building without instantly sprouting hair all over their bodies. 

This was particularly disturbing to the elves in town. They’re not used to needing depilatory magic. 

One of the minstrels from the Flying Stag was asked by the Bron’s men to describe the noises coming from the Shield that night and responded with “Have you ever heard the sound of a peryton being violated by an orthon while six random demons all sing Rashomeni opera in perfect harmony? No? Neither have I, but I now know exactly what that sounds like, and if it’s all the same to you, I plan on drinking until I can no longer remember it. Or anything else.” In an act of desperation, the Bron sent a letter to Storm Silverhand asking for her help, along with a description of Monk and Barbarian. Her only response was “You let them in, you deal with it.”

The building itself survived after a fashion. The outer walls were mostly intact, the inner structures were almost a total loss. All of the bricks in the second-floor ceiling had to be replaced, they looked like someone had managed to use them as handholds in several places and, somehow, footholds in several others. The tack and other gear in the stables were either found destroyed or so defiled that they had to be burned. At least two rooms required the services of every cleric in the town to get the stones in the floor to stop whimpering. 

There was some thought to mustering up a posse to arrest the trio, but firstly, no one in the town was even slightly willing to take part. The un-knotted members of the Shield Trading Company all lined up at the dismemberment crosses when ordered to ride after them under pain of slow death, stating “this will hurt less.”  

The second discouraging factor was the very large mound of platinum found in one of the bathing rooms, (when counted, enough to buy a new inn and half of Voonlar), the only undamaged room in the building. On top of the platinum was a note in precise, perfect script that read “Thank you so much for your hospitality and professionalism during our stay. We hope this payment will cover any accidental damages we may have caused.” Underneath were three words in less neat script, quite possibly using some form of blood for ink which read: “This. Never. Happened.”

The entire town agreed on that.

How It Happened That Monk And Paladin Met Barbarian

Six Feet of Violence in both hair color and interaction with the world

Monk and Paladin are just outside of Yulash. This isn’t a scenic area with trees and squirrels. Yulash is a pit, little more than a battleground between Hillsfar and Zhentil Keep with the occasional escaping slime god. At this point, the only real difference between the factions is the color of their helmet brushes. That, and the Zhents don’t have helmet brushes, they’ve always won the style war on Toril. Completely evil, but fabulous on the runway.

Monk and Paladin are standing outside of what would be an open road into Yulash were it not for the barricades. And the slime. Yulash generates slime the way Monk generates hate.

Monk: “Paladin, I can’t remember, are those mercenaries Hillsfarian or Zhents?

Paladin: “Zhents. They don’t have the silly helmets”

Monk: “Right, I always forget about that. Do they look like they have any pet beholders then? The Zhents love those for some reason.”

Paladin: “Well, they do make winning fights easier, but I don’t see any, it’s hard to hide a beholder.”

Monk: “Good point. Still, it will be a fight, and…”

Just then, the largest woman either Monk or Paladin have ever seen walks up. She’s about as tall as Monk, but where he’s lithe, she’s built like…well, a brick shithouse. She is also carrying an axe of considerable size and sharpness, decorated with what looks like years’ and entire towns’ worth of dried blood. She also has pink hair. Very pink hair. Lathanderites weep in jealous rage over how pink Barbarian’s hair is. This is important to Monk, he has a thing for pink.

Barbarian: “Are these Zhents causing you trouble?”

Monk: “Not as such. They might try in a few minutes, we’re trying to decide if Yulash is worth the trouble of walking through it, or just avoiding the entire mess.”

Barbarian: “Yulash is never worth it, it’s a pit of a pit. Latrines smell better. The only reason people go through Yulash is walking around Yulash takes longer and it smells so bad even Otyughs stay away. But, since they are Zhents and they might possibly get in my way or otherwise vex me…”

With that, Barbarian dons the rather impressive helmet she’d been wearing on her hip, unshoulders her axe, and with a loud and rather profane battlecry, runs towards the barricade, intent on bisecting Zhents.

Paladin: “Monk, I have never seen a helmet like that. Even the spikes have spikes.”

Monk: “Yes…isn’t she dreamy?”

Paladin: “What?”

Monk: “Um, nothing, I said nothing. Come on, let’s see how she does. This could be fun if she’s any good.”

Barbarian hits the Zhent’s barriers at full speed. That’s less impressive than the fact she doesn’t seem to actually notice the barriers. They notice her, in a “turning to flying scrap” kind of way.

Monk: “Paladin, you have a decent memory. Do you ever remember seeing people killed by someone by running into a wooden barrier so hard, they were impaled by the scraps?”

Paladin: “There was that dragon just south of Anuroch that did that to a bunch of Purple Dragon Knights.”

Monk: “Does that really count? I mean, he flattened a town with one swing of his tale, I think that’s accidental. Look, she hit that second barrier just right to put the scraps into that crossbow-type in the shape of a “Z”. That’s either artistry or showing off.”

Paladin: “You asked if we’d ever seen that before. If you want a different answer, you have to ask a different question.”

Monk: “Fair. Oh my, a beheading that kills the guy behind the decapitee with the flying head. See Paladin, you just don’t see artistry like that any more. Nowadays it’s all hack, hack, slash, slash. Style. that’s what we are missing, style.”

Barbarian: “Are either of you two going to help or just provide bad commentary?”

Monk: “Our commentary is not bad, it is witty and wise. Besides, you need help less than any army I’ve ever seen. The Tarrasque needs help more than you do. Oh wait, you have a scratch on your arm. Here, let me heal that.”

Monk walks over to where Barbarian is doing something very rude to a wizard with the handle of her greataxe and heals a cut that is maybe an inch long.

Monk: “There, I have helped…hm, I never thought about cleaning weapon hilts with arterial spray. That is a neat trick, I’ll have to remember it.”

Barbarian stops mutilating the now quite dead wizard, and stares at Monk with the normal response to his version of “humor”, that is, exasperation and barely-masked annoyance.

Barbarian: “I should let you handle the rest of this and make funny comments of my own.”

Monk: “Will you buy me dinner if I can handle the rest of this lot in under a minute without moving my feet?”

Barbarian gives Monk the once-over.

Barbarian: “if you can do it in under forty-five seconds, you might just get more than dinner, you’re more pretty than your mouth is big. Besides, they’re kind of boring.”

Monk doesn’t waste time agreeing, he simply bends down, grabs an armful of kindling that used to be part of a barrier and turns to Barbarian.

Monk: “The clock starts once you walk back over to where Paladin is standing. You’re blocking part of my view.”

Barbarian gives Monk a wry smile, puts her axe over her shoulder and walks over to Paladin. Some of the Zhents act like they were thinking about using their crossbows on her, then they look at the wizard she’s turned into some kind of very wrong sponge art with the haft of the greataxe and decide that Monk would be a better target.

Barbarian: “Okay, ready…GO”

Monk, without moving his feet, because that’s the bet, and keeping the terms of a bet is totally not chaotic, does a pivot that shouldn’t be possible for creatures with a spine. The crossbowmen who made the decision to shoot at him realize they decided poorly as he catches their bolts with one hand and returns them. At high speeds. Into rude places, and we don’t mean the back of a Ffolkwagon. The remaining wizard casts various things at him, none of which work.

Paladin: “Hi, lady with the very large ax, are you our new friend?”

Barbarian looks at Paladin for a minute. She’s never seen a warforged, much less one as smilely as Paladin. It would look creepy, but he reeks of sincerity, goodness, and a less-than-bright view of life she, and everyone who is not evil find charming. (To be honest, even the evil lot like Paladin. They’d like it if he didn’t cause them so many problems, but it’s really hard to genuinely hate Paladin. That, they reserve for Monk. There’s a town just outside of Neverwinter that has a yearly hate parade in dedication to Monk.)

Barbarian: “Well, I’m definitely yours, I like you, you’re nice. Him, we’ll see.”

Paladin: “We get that a lot…oh, they shouldn’t use magic on Monk.”

Barbarian: “It doesn’t seem to work well.”

Paladin: “It also makes him itchy. He hates that.”

Barbarian: “Understandable.”

As the other two talk, Monk bounces the kindling in his hands a few times, then with a sweep of both arms, launches it at the remaining Zhents. Every one of them goes down with a piece of wood in the throat. Monk looks around at the now-twitching corpses, shaking his head.

Monk: “The Zhents just hate throat guards. I’ll never understand why.”

Barbarian: “They like choking, and I don’t mean in combat. It’s a thing with them.”

Monk rolls his eyes at that.

Monk: “Zhents. Anyway, you owe me dinner.”

Barbarian: “I do indeed, but not in Yulash.”

Monk: “No, eating here is awful. Even Otyughs know that. This town gets slime on everything somehow. Even sealed ale barrels somehow have globs of slime. It’d be an impressive trick if it wasn’t making the food so rancid.”

Barbarian: “Hmm…not Shadowdale, they annoy me.”

Monk: “Ditto, someone there thinks he knows everything, and never shuts up about it.”

Barbarian: “And how. How about you my new…whatever you are friend?”

Paladin: “I’m a warforged. I’m like a golem, but I’m a person and I don’t just murder people at someone’s command. I’m a paladin because I like being good. But I don’t eat, I just like to smell things.”

Barbarian: “You are truly the cheapest of dates, and possibly quite handy in preventing awkward social faux pas. Okay my fine whirring friend, where is your favorite place to smell food.”

Paladin thinks about this. Fortunately, smelling food is one of his favorite things, and he can actually think about that well. Otherwise, they might grow old waiting for an answer.

Paladin: “Voonlar is nice. Ashabenford is better, but we have to go through Shadowdale, and it’s full of people who know everything and like to tell me about it. Constantly. That much talking makes it hard to smell my dinner. Also, Storm Silverhand threatened to turn Monk inside-out if she ever saw him again.”

Barbarian: “Why am I not surprised. Voonlar it is then, dinner’s on me.”

Monk: “I certainly hope so.”

Barbarian: “What was that?”

Monk: “Um nothing, I said nothing. Let us be off to Voonlar then.”

Monk and Paladin And The Barista Who Did Not Know Better

Monk and Paladin walk into a decently sized town near the Calim Desert. Think Suzail, but without all the dead bodies in the alleys.

Monk: Paladin, do I smell coffee?

Paladin: I don’t know Monk. I smell coffee, well I think I do, I’m never really sure, but how would I know what you smell?

Monk: That was…never mind. Yes, I do smell coffee, and there is the shop it is coming from.

Paladin: Can I have coffee too?

Monk: You don’t drink coffee. Or anything else. It’s one reason why I like you, you neither consume nor expel food. You are the cheapest of dates.

Paladin: I like the smell.

They walk into the shop, oblivious to what their argument sounds like.

Monk: You can smell coffee from anywhere in this building, they make it here.

Paladin: That’s other people’s smells. I want my own smell.

Monk: You mean besides oil and dirt?

Paladin: Huh?

Monk: Never mind. Yes, you can have your own coffee to smell.

Paladin: YAY!

They walk up to the counter in the shop, waiting calmly in line. They are lawful after all. When you are lawful, you follow the rules.

Shopkeep: Can I help you?

Monk: Two coffees please

Shopkeep: What kind?

Monk: The kind that’s already made and able to be poured into the largest mugs you have the fastest. I’m not picky unless what’s made tastes like a beholder’s taint.

Shopkeep: None of our coffee tastes like that, it is all imported directly from Calminshan…

Monk interrupts the shopkeep.

Monk: Kid, I’m sure that story is fascinating, however, I don’t even care enough to argue over the price markup that story gets you. Just give me coffee. Better yet, give my friend here the coffee, I’m going to sit over there and pretend I didn’t have this conversation.

Shopkeep: That will be ten coppers

Monk puts the money on the counter and walks away. The shopkeep commences to making the coffee, and hands both mugs to Paladin. Paladin is puzzled at one of the mugs but doesn’t think about it much. In truth, Paladin doesn’t think about anything much.

Paladin: Here you go monk, your coffee

Monk takes a sip and gets the kind of look a small child gets when you promise them a pony and give them a goat. He is betrayed.

Monk: Paladin, this is not coffee. This is tea.

Paladin: The man said “here’s your coffee” and that is what he handed me. Maybe it’s special coffee.

Monk: It is special in that it is tea. Someone gave me tea instead of coffee.

Paladin gets a worried look on his face. he’s not bright, but he does recognize certain dangers. People messing with Monk’s coffee is high on that list. Monk gets up to go talk to the shopkeep.

Shopkeep: Is there a problem?

Monk: This is tea.

Shopkeep: Yes it is, our special house blend.

Monk: I ordered coffee. I got tea. Can we fix this.

Shopkeep: But you’re one of those monks, aren’t you?

Monk raises an eyebrow at this. Paladin can see his friend starting to get tense in what he calls his “beatin’ arm” and decides that he needs to pay full attention to the aroma of his coffee. In truth, it does smell rather nice.

Monk: Yes, but I fail to see…

Shopkeep: Well, everyone knows monks drink tea. You look like you’ve been walking a while, clearly, in your fatigue, you misspoke.

Monk: No, I didn’t. I want coffee. Cof. Fee. Coffee. Comes from a bean. Keeps you awake. Keeps me from getting headaches that make me all murdery. Coffee. One word, two syllables. Right behind you on the stove. Dump this shit out, pour some coffee in the cup. Hand the cup to me.

Shopkeep: Our tea is most certainly not shit good sir. I’m insulted that you would even implrrrk!

The shopkeep suddenly finds talking to to be a bit of a chore, what with Monk grabbing the shopkeep’s tongue between his index finger and thumb in a painfully tight grip.

Monk: Paladin?

Paladin: Yes Monk?

Monk: I believe I saw a butterfly outside. You should go play with it.

Paladin: Monk, this is a more arid climate than butterflies…

Monk: <STARE>

Paladin: Oh look, a rare desert butterfly! Come here butterfly, we can smell my coffee together.

Paladin quickly leaves the shop. He has a good idea what is about to happen and not seeing it will be very helpful in him keeping his vows intact and his docent on his chest and not in an inconvenient place, and he doesn’t mean the back of a ffolkewagon.

Monk: Allow me to demonstrate the ramifications of your error in judgement.

Sounds come out of the shop. Sounds that would not be out of place if made by someone with a full mug of tea inserted into their colon at high speeds while their limbs are bent into the shape of a coffee pot and the lid of a coffeepot fused into their skull. All done in a very methodical, well-planned fashion. Totally not chaotic.

Passers by try to ask Paladin what’s going on, but Paladin ignores them while running around yelling “COME BACK BUTTERFLY, THERE IS MORE COFFEE TO SMELL” in a slightly hysterical tone. The passers by are not sure who is more terrifying, but they all remember sudden business they have. In Zhentil Keep. Where it is safe.

Monk walks out of the shop and sits at one of the tables with a fresh mug of coffee. He takes a long sip, sighs deeply and smiles.

Monk: Ah, sweet, wonderful, coffee. How I love you.

Paladin looks like he’s thinking about going back into the shop, but Monk catches his eye and says “No no my friend. Let us stay outside today.” Paladin is in full agreement with that sentiment.

The coffeeshop keep never did get rid of that limp.

Paladin Is The Biggest Shuriken

<Monk and Paladin walk…oh you get the idea.>

Monk: You look like you’re in charge here

General <Looking not happy about being interrupted>: That would be my good fortune. However did you guess, aside from the banners and people calling me “General”?

Paladin: “See, I told you he was the general!”

General: “Is there a point to you two aside from bad comedy?”

Paladin: “We’re here to help!”

General: “…just…how do you plan to do that?”

Paladin: “Monk hits real good and I get hit real good”

General: “Anything else?”

Monk: “Hmm…nope. He feels no pain, and I dish it out in interesting ways, that about covers it.”

General: “Well, as you may notice if you look overhead, our problem is a bit long distance and airborne, so unless you have some distance weapons, you’re kind of useless”

Paladin: “Monk could throw me! He can throw anything”

General: “…really now.”

Monk: “Well, yes, I probably could, but then he’d be rather far away, and he doesn’t deal a lot of damage on his own. And he runs faster than an Otyugh. Barely. So it would take him forever to get back here.”

General: “Not a lot of damage? even with that sword?”

Monk: “Not unless the dragon runs onto it several times of its own accord. Paladin only carries it because that’s what Paladins have. They have swords. He is a Paladin, he has a sword. His real value centers on nothing being able to possibly hit him hard enough to hurt him, much less actually damage him.”

General: “I get all the winners. Well, how about you?”

Monk: “I have shuriken. They’re returning, very nice, but face it, the dragon would die of old age before I killed him with a small circle of metal, even a magical returning one.”

General: “Too bad you can’t stick it into his armor, then you might be useful. Oh well. If you happen to know where I can get some…what are you doing?”

Lots and lots of hammering noises, with Paladin giggling. As Paladin is a warforged, it’s a rather disconcerting sound. Especially as he is face down in the mud while Monk is straddling him while doing what looks like punching him in the back over and over.

Paladin: “MONK! THAT TICKLES! YOU SAID YOU’D NEVER TICKLE ME IN FRONT OF OTHER PEOPLE!”

Monk: “I’m” PUNCH “Not” PUNCH “Tickling” PUNCH “You!” PUNCHPUNCHPUNCH. “There.” He hops off of Paladin. “Okay Paladin, stand up”

Paladin stands up, and shows the now largeish group clustered around the latest addition to his armor: the shuriken that has been beaten into his back plates.

Paladin: “Monk, what did you do?”

Monk: “Well, I can throw you, and I can throw shuriken, and you don’t return, well not quickly, but shuriken do return quickly…oh good, I didn’t use the acid one.”

Paladin: “I’m a shuriken?”

Monk: “Yes, you are now the world’s biggest shuriken.”

Paladin: “YAAAAAY! I AM THE BIGGEST SHURIKEN!!!!”

Monk: “General, you and your men better give me some room here”

General: “I have no idea what is going on, two loonies are beating each other up, and there’s still the dragon. Sure. Men, give the nutter room”

Monk bends over and grabs paladin by the feet. “Hold your shield over your head!” he says, then yanks Paladin off his feet and commences to spinning him around. The soldiers are giving him ALL THE ROOM. With a grunt, he lets go. As Paladin flies at the dragon, complete with fading “WHEEE!!! I’M A SHURIKEN! WHEEEE!!!”, Monk stands there and waits, with one ear cocked. In a few seconds a loud, albeit faint “KLONNNNG” followed by a very surprised and painful dragon roar echoes across the battlefield. not long after, Paladin’s “WHEEEE!!!” can still be heard, only getting louder. Quickly. As if he was flying back at Monk. Which he is.

Monk: “you should probably all get out of his way. Those things move fast on the way back”

At this point, the soldiers are diving out of the way, expecting Paladin to paste Monk, given the size differences. Monk doesn’t even try to get out of the way. All the soldiers duck and wince as Paladin come sailing back at Monk’s outstretched hand and…nothing. No screams, no impact, just Paladin madly giggling and yelling “DO IT AGAIN! DO IT AGAIN!”. The general looks up to see Monk’s hand in the middle of Paladin’s back, balancing him there effortlessly.

General: “Bu..wha…HOW?”

Monk: “Well, if I can catch a razor sharp throwing star that bursts into flame on impact or acid or whatever and it doesn’t do that when I catch it, then logically, that should apply even if it’s nailed into Paladin’s back. One second…”

Monk flings Paladin at the dragon again. WHEE! KLONG! ROAR! followed by ever-increasing streams of dragonese profanity.

Monk: “Well, it’s a good thing he’s already evil. Such language.”

General: <Just stares, slackjawed. As are the other soldiers. Because…wtf.>

Eventually, after 4–5 throws, the Dragon flies off, a bit limpy in the wings, muttering angrily to itself. Something about:

“Screw this, I’m going to take that gig as a spelljammer tow truck my cousin offered me. Illithids aren’t as fucked up as whatever the hell that giggling…nope, nope, nope.”

General: “I don’t want to know how that worked. Ever. I don’t want to talk to either of you ever again. For once, I sympathize with the dragon. I’m going to go home, get really drunk, then retire and do something more sane. Like raising Beholders.”

Monk: “Um…I hate to raise the point, but those shuriken aren’t cheap…”

General: “Payroll wagon’s that one that used to have guards around it. whatever’s in it is yours. Just go away and never let me see either of you two again.

Monk & Paladin: “YAY!!!!”

Monk And Paladin And The Very Sorry Giant

(yes, I know I said these would stay on tumblr. Tumblr’s srch is pure shit, so they are also going to be here, along with some other bits. Thank god I linked to them on Facebook. At least Facebook’s search works.)

What happens when Intelligence is a dump stat

So some background. I have a son, yes I know, seems impossible, but true nonetheless, and he is almost 25, an age where his sense of humor is finally catching up to his mouth. We play D&D, and have played a lot of D&D Online. He has a Paladin he plays, a warforged, and I primarily play as a monk. This is the outgrowth of a long-running series of comedy bits we do when we play. It may get updated as I feel like it.

As I ponder it, this may also what happens when you read too much Robert Asprin. There’s a certain amount of “Myth Inc.” at play here.

Villager: “Save us, oh save us from the evil giant!”

<Monk and Paladin walk up and see what is happening.>

Paladin: “YAY! TIME TO PLAY KLONG!!!!”

Villager: (to Monk): “What’s ‘Klong’?”

Monk: “It’s his favorite game. He runs up to the giant and the giant smashes his fist into him”

Villager: (aghast): “But that will kill him, surely!”

Monk: “Now why would it be his favorite game if it killed him?”

Off in the distance, Paladin finally finishes running up to the giant. It took a while. Paladin runs faster than an Otyugh. Barely. The giant notices Paladin “jumping” (he jumps higher than an Otyugh can. Barely) to get the giant’s attention. “GRAAAAAGH” says the giant, hauls back his fist and takes a mighty swing at Paladin.

“KLONNNNNNG” goes Paladin

“CRACKPOPSNAP” goes the Giant’s fist

“AAAAAAGH” goes the Giant.

The giant walks off, holding his severely broken hand very gingerly, crying a bit.

Villager: “He…defeated the Giant by breaking its hand on his face?”

Monk: “Yep.”

Villager: “Doesn’t that hurt?”

Monk: “It might if he thought about it more. He’s not a thinker.”

Villager: “How can we ever thank you!”

Monk: “Platinum, usually.”

Villager: “Um…we’re not a rich village”

Monk: “Have you seen his other favorite game, ‘Smashhouse’?”

Villager: “…I thought you lot had to be good”

Monk: “Technically, I just have to be lawful. Good and Evil are really minor considerations for my lot. And I am. Lawful that is. I have a specific procedure I follow for everything. This is the “We just saved you from being pasted by a giant and now you want to be cheap about it” procedure. See? Totally not chaotic!”

Villager: “How is this good?”

Monk: “Are you getting wiped off the bottom of a giant’s boot? Paladin may have even gotten a scratch from a callous on the Giant’s fist. He risked a fresh polish for your village! I’ll have to fix that if he did. You ever polish a ticklish Warforged? No? Well, it’s not easy.

Also, you’re not all dead. I may have mentioned that already, but it’s worth repeating.”

Villager: “…I see your point. How much platinum will you need?”

Monk: <hands him a decently-sized sack> “This much”

Villager: “That’s…right, not giant’s toe jam…quite reasonable.”

Monk: “I knew you’d agree!”

Am I Being Punked?

The title is what I was saying to myself as I built a couple of scripts for a twitterfriend. Guy had asked about printing to n-up PDF from Keynote via AppleScript. I happened to have Pages running so I started poking about.

First, you have to print to do n-up PDFs. The export to PDF function in any iWork app is incapable of doing that. Okay, that’s a pain in the ass, but sure, I can justify that, n-up is traditionally the realm of printing. But, at least with the basic “print” command, you can get most of the way there:

tell application "Pages"
	set theDoc to the first item of every document
	--the "ignoring is needed so the script doesn't stall at the dialog
	ignoring application responses
		print theDoc with properties {pages across:3, pages down:2} with print dialog
	end ignoring
end tell

This is pretty straightforward. The only odd bit is the “ignoring” part. That’s in there because otherwise, the script will pause forever on the print sheet.

Now, if you have a PDF printer already set up, and it’s your default, then you redo the print statement to not display the print dialog, et voila, you have a PDF, (depending on how said printer handles saving.)

If you don’t have a PDF printer set up, then we have to do a bit of UI scripting. This is tedious for a few reasons that I’ll get into after the code.

--System Events manages ALL UI scripting
tell application "System Events"
     --target  pages
     tell its application process "Pages"
          --obviously for your needs, 
	  --you'd have to manage window targeting
          --since you have to do it by name
	  tell its window "johnwelch.pages"
	       --talk to the existing print sheet from 
	       --the tell keynote/pages block
	       tell its sheet 1
	            set theMenuButton to its menu button "PDF"
	            --expand the button
		    click theMenuButton
		    --go down twice
		    key code 125
		    key code 125
		    --hit return which brings up 
		    --another sheet 1
		    key code 36
		    --gives the sheet time to display
		    delay 5
				
		    tell its sheet 1
		         --this saves. I have no way to 
			 --deal with overwriting files 
			 --without doing more targeting.
			 --this is so messed up.
			 tell its button "Save" to click
		    end tell
	       end tell
	  end tell
     end tell
end tell

It’s fairly straightforward. There’s a document (*.pages) with print sheet (sheet 1). This is the first issue. Give this a better name. “Print Sheet” maybe? Because as we’ll see, this sheet can have a sheet and what is its name? Right, sheet 1.

Minor fail there. It would be better for the name to be descriptive. Then we tell UI scripting to click on the menu button “PDF”. This is the second failure, but only a partial one. Depending on the machine, this menu can have a number of different items, but there are some that are static, namely:

  1. Open In Preview
  2. Save as PDF
  3. Save as PostScript

I should be able to directly access those. (Honestly, the menu isn’t that dynamic. It would be pretty easy to determine the number of items before it opens. As it stands now, until you click on it, it has…zero items. So we have to do two down arrows (key code 125) and a return (key code 36) to select the right option. Being able to directly click a menu item by name is much better, and would make this much more simple.

If I could do more in the print command, like have a property that was “Save as: PDF” with an element that took an alias or fURL, that would be even better, because then the entire UI scripting block would literally not be needed. But it doesn’t, so it is, and why not just make things easier? This would also probably be a help for accessibility, something of minor importance to Apple, or so I hear.

Now, we’ve “clicked” on “Save as PDF” which gives us a sheet for sheet 1 named? Right, “sheet 1”. Begin to see why I think that name is a bad idea? Like maybe name this one “Save as PDF”. I dunno where I’ve seen that before, but it seems logical. But I’m sure “sheet 1 of sheet 1” is better. I eagerly await the explanation of how.

Note, this does nothing to handle “a file with that name already exists.” I’m sure you can handle that via UI Scripting, but as we’ll see in the Keynote section, I just don’t feel like doing the extra work.

So I get done with this, and I’m excited, because Keynote should be about the same. Minor changes in terms of tell block and System Events targeting, Bob’s your Uncle.

Bob Is Not Your Uncle

In fact, Bob is so not your Uncle, he’s at someone else’s house being their uncle, and they are all laughing at you for you have no Bob to be your uncle.

Keynote’s accessibility is a shameful mess. I don’t say that lightly. Here’s the first part:

tell application "Keynote"
     set theDoc to the first item of every document
     ignoring application responses
          --the "ignoring is needed so the script
          --doesn't stall at the dialog
          --note that Keynote ignores the n-up 
          --properties because pound sand, that's why
	  print theDoc with properties {pages across:3, pages down:2} with print dialog
     end ignoring
end tell

Our first sign we’re in trouble is that Keynote ignores the n-up settings in the print command. Oh, it looks good in the UI, but if you save that to a PDF without taking further action, you do not get what the UI says you will. This is the first, cardinal, unforgiveable sin of development:

Never Lie To The Human

There’s no excuse for this. None. But Keynote lies to you here. Which is a shame, because you now have to undertake a journey of purest suck.

tell application "System Events"
     --target keynote
     tell its application process "Keynote"
          --obviously for your needs, you'd have 
	  --to manage window targeting
	  --since you have to do it by name
	  tell its window "Open House Preso.key"
	       --talk to the existing print sheet
	       --from the tell keynote/pages block
	            tell its sheet 1
		    --this is where you select a 
		    --grid layout. No, it has no
		    --goddamned name.
		    --no, i don't know why.
		         tell its checkbox 2 to click
		         --oh, you thought the "how 
			 --many slides per page" popup 
			 --had a name? LOL
			 --it's pop up button 1 of group 3
			 --because THAT'S NOT FRAGILE
			 tell its group 3
			      tell its pop up button 1
			      --expand the button
			      click
			      --go down one option
			      key code 125
			      --hit return
			      key code 36
			 end tell
		    end tell
		    set theMenuButton to its menu button "PDF"
		    --expand the button
		    click theMenuButton
		    --go down twice
		    key code 125
		    key code 125
		    --hit return which brings up 
		    --another sheet 1
		    key code 36
		    --gives the sheet time to display
		    delay 5
				
		    tell its sheet 1
		         --this saves. I have no way 
		         --to deal with overwriting files 
			 --without doing
			 --more targeting. this is so messed up.
			 tell its button "Save" to click
		    end tell
	       end tell
	  end tell
     end tell
end tell

SIGH…

Where oh where do I start?

Well, what the hell, when you’re in a swamp, it doesn’t matter which way you walk, you’re getting gunk in your shoes. So to click on “Grid” which is the only way to get n-up printing, even though, as you recall, we had told Keynote to print n-up and it looks like it will, it is again lying to us. So we have to do this.

According to System Events, “Grid” is checkbox 2 of sheet 1. Now, let us be clear on what we’re talking about here…

That is a mighty strange checkbox

I have seen stupid and I have been stupid and I have never seen a checkbox that looks like that. This is a checkbox:

Look! Checkboxes!

Yes, I know, you can have pictures, but come on. First, everything in that grouping is mutually exclusive. I can’t select slide AND grid or grid AND outline. So even allowing for pictures, those aren’t checkboxes, they’re flibbertygribbin’ radio buttons. So again, again, Keynote’s UI is lying. But even worse, want to know what the name of the “Grid” “checkbox” is? Checkbox 2. No, really, that’s the name.

Accessibility fail, and you don’t have to take my word for it, here, from the accessibility inspector:

HAH! IT’S NOT JUST MEEE-EE

Apple’s. Own. Accessibility. Inspector. is pointing out this problem. So it’s not only not a checkbox, it’s badly done accessibility-wise, and it makes scripting it fragile, because what if something changes and it’s no longer checkbox 2, it’s now pop up button elebenty? (I mean, if you’re going to lie about what something is, go big.) Oh look, you have to rewrite. ]

But wait, it gets better. So along with an accessibility audit fail, what does the actual inspector tool think this is? Well, let’s see…

Oh well, that makes sense, according to the Accessibility Inspector it’s a toggle button with a role of AXCheckBox that behaves like a radio button, that’s totally logicalAAAAAAAAAAAAAGAHWHAT IS GOING ON HERE, WERE YOU ALL HIGH?

Like, I’m trying to be nice here, but this is just awful. This is just a single control that has two different type values, no name and a role that makes no sense, and IF YOU WOULD JUST GIVE IT A LABEL, A TITLE, AND SOME HELP TEXT I WOULDN’T HAVE LOST TEN YEARS OFF MY LIFE SPAN NOT PUTTING MY HAND THROUGH THE SCREEN OF MY LAPTOP.

How does this get approved? I mean, Apple cares about accessibility, they’re hiring loads of accessibility people and this passes muster? Mind you, there’s four controls in this group.

we’re not done

Since we have now managed to select grid via equal amounts of magic and luck, we have a pop up that lets us select how many images per page. The default is four. Surely that has a name we can use, I mean it’s part of the “Grid Layout:” group, right?

Right?

Please?

Oh gods.

Nope. It’s pop up 1 of group 3. I mean, it’s not like it has a real name:

Saved from a life of sloth

Yeah. So…yeah. I mean, the accessibility audit is polite about it but even it is throwing up its hands at it all:

Bob will never be your uncle

Once you get to where you’ve “clicked” on pop up 1 of group 3 (such an intuitive name, I shall remember it always), then it’s generic up/down arrow keystrokes and the enter keystroke and you’re out of this grotty hell and “clicking” away on the PDF menu item button tra-la-la, time to get ragingly drunk so as to forget this ever happened.

There’s no excuse for this…mess. I am not a coder. I can beat on ASOC/Python/Bash to get things done, and I’m attempting to learn Swift (on macOS, so we all know I’m doomed, because heaven forfend the gods of coding education stoop to making tutorials for the Mac.) But I am not a coder/dev/whatever by any means. Which means this issue is so obvious, so pronounced that you do not need terribly special skills to spot it. By “spot it” I mean get thoroughly Bog’d.

I just wanted to write a script to do a fairly simple thing and found…this. I don’t even know where to begin to report the bugs on this, there are no less than eleven separate accessibiity bugs in the print dialog alone, along with the print script command bug and the feature requests that would make this all go away.

Where, exactly, do I begin? Because I do have things to do. Like not be found dead at my laptop with the feedback assistant waiting patiently for the next item in the list.

Look, clearly the iWork team needs some QA people for their UI accessibility stuff. And scripting stuff. Y’all should maybe give me a call, send me an email, I appear to have skills you desperately need. We can fix this, it is totally fixable, fixing it is necessary. So let’s do this?

Hey…it’s Dad

So this started as a bit of a lark, based on a Questionable Content strip. But the response was interesting, and I bought the domain, dadnd.com. Not just to have it, but I dig the concept. Aside from the strip, it’s also somewhat based on Chloe Condon’s boyfriend bot. While honestly, and sadly, I can see a use for a service that, if needed, has a grizzled old grumpy, yet affectionate guy show up to check in on his child because they just happened to be in the same place, there’s other uses.

You’ve seen the response to “free mom/dad hugs” signs at Pride events. Be nice if that wasn’t the only time you could get them. Hearing someone say “Hey…you’re kinda dumb sometimes, but I love you” feels good. Yeah, I know, it’s a service, you’re paying for it, but man, there’s times when regardless of source, hearing that drags you back from the edge a bit. Gives you a little distance from the precipice so that instead of looking over the edge, it’s a bit easier to look up at the stars.

Or for the events where you just want to look at “your” side and see people there smiling and cheering for you, making silly faces. Maybe walking you down an aisle. Doing stupid dances. Making awful jokes. Taking pictures at a graduation. Being family, even if it’s just for a few hours.

Or just when you need, so badly to hear a friendly voice on the phone because the day has just sucked, and you feel beat down, and you need someone to call Dad and have them call you Scooter, and that the people who made you feel bad are dumbasses and you’re really awesome.

I can’t even begin to imagine how to build that. The screening, boith background and empathic would be intense, although I know a few people who would do well there. That would be hard, along with the actual, you know, programming and infrastructure. I’m only good at one of those. And lord knows, I ain’t got squat for moola.

But I think it could be cool. And if one is going to even think about building something in a world that seems to delight in making people miserable in search of profit, why not have it help people feel good?