Houser: My question is, how do I get you to nap?

Beeble: Your question is tigers.

Houser: My question is not tigers. Maybe that's your question.

Beeble: Nooo. My question is leopards.

MORE
11/17 '14 6 Comments
What have I til you about lion to me?
Such a cheetah.
He'll never prosper.
Hello, Dalí, well, hello, Dalí, it's so nice to have you back where you belong.
That's an Ocelot of questions!
 

This is another post about Blindside, the text-only realtime RPG I'm working on. At the moment, I'm both looking at tools and options for building game maps, and implementing tools for the game's AI.

The game is intended to be large and complex enough that I am creating it in two pieces: "engine" and "content". Let me explain, if you're unfamiliar with these ideas. The engine is software, and it does all the housekeeping like keeping track of your location, stats, inventory and health, and also figuring out what you can see, who you can attack, where you can move, and so on. The content is the all the stuff the engine needs in order to tell a story. So there's maps, descriptions, dialogue, lists of NPCs and so on.

In a sense, the engine is like a video game console. It doesn't do anything until you add some content in the form of a game. And then it comes alive. (Oldbies will be familiar with game engines like SCUMM, used for the Lucas Games graphic adventures; and the Z-machine, used by Infocom for their text adventures.)

The great thing about splitting apart the engine from the content is that if you design the engine right, you won't have to change it once it's finished. You just start the engine up and point it at the content. And you can then spend the rest of your development time working on content, and even keep making more content even while the game is running.

Because I want the monsters and NPCs in the game to have very different responses to the player, have some decent agency, and to actually be difficult to beat in a fair fight, the AI system needs to be both powerful and flexible. And when you want to teach a computer to do things both powerfully and flexibly, inevitably you'll want to create a language to do that. And, traditionally, when a game engine has a language built into it, it's called a "scripting" language, because you're creating a script for the characters, locations and items in the game. 

So Blindside will have a scripting language of its very own.  But wait, I can hear the wailing of the nerds -- there are scripting languages out there already! Why invent a new one? You could be creating content or making your engine better, why waste time on making a new language too? There are often justifications for making a new language, especially when the use for that language is very specialized.

One problem with many modern computer languages is that they are so generic -- so applicable to any problem -- that while they can do almost anything, you have to be extremely verbose and specific about exactly what you want done. You might like to think of generic languages as a big pile of 2x4 lumber and a huge pail of nails. You can build almost anything from a doghouse to a four story apartment building with these components, but it's going to take a long time and you have to be very careful and precise. A custom language, gives you the equivalent of panels for a prefabricated house. While you can only build certain kinds of rectangular houses of certain sizes with these panels, they go together very quickly and they work very well.

In computer science more broadly these kinds of specialized languages for making "prefab" houses are Domain Specific Languages, or DSLs, in that they're languages specifically made for a particular domain/use.

The goals for the AI language are that it should be very easy to understand (so one can review it at a glance), very easy to write (so I can teach it to others), be both terse and obvious, and still be flexible enough to allow lots of different tactics. 

The language is still in flux but I thought I'd show you a bit of what it will look like. This little bit of code might be attached to an NPC that is part of a team of fighters, or maybe even a friend or companion to the player. 

See if you can figure out what this does just by reading it.

  first ally poisoned having health<25% order by health
    definitely cast remove poison order by speed
    possibly use remove poison having quantity>3


It should be pretty clear: If there are any allies who are poisoned and dangerously low on health, pick the one who has the least health and cast the fastest spell available to cure their poison and then end the turn, but if no such spell is available or we can't cast it, then if we have at least four items in our inventory that can cure poison then we might use one, but we'll also check for other things to do.

This is some pretty complex behaviour expressed in a fairly concise fashion.

And this code actually works, at least to a degree. What is happening right now is that the above three lines are converted by a compiler into about twenty lines of Javascript that do exactly what is described. (I'm not going to show it that because it's huge and ugly).

The cool thing about a compiling the AI code right into the same language that the engine is written in is that the AI code runs just as quickly as the engine itself. This is kind of unusual for DSLs and scripting languages in general -- usually they're interpreted step by step by the main engine program, or by a helper program called a library. 

But making this a compiler is great news for Blindside -- it means the AI can be quite complex and still not bog down the system even if there's a few thousand creatures roaming around with their own little agendas. It also means my job creating the engine is somewhat harder, but that's a good trade-off. As a programmer, my job is to make computers useful and helpful.

And if by putting a little more effort into my work makes the work of others much easier, then that is what I like to call design leverage. If I spend an extra hour, or week, or month, in making something better so that all of the dozens or thousands or millions of people who use it can get an extra second, or minute, or hour of time back or make their use of my project more enjoyable, or at least suck less, then that is time very well bargained.

And now we're at risk of veering into my whole philosophy of engineering so I think I'll wrap this up now. Thanks for reading, if you made it this far, and thanks for trying, if you didn't.

MORE
11/16 '14 8 Comments
Although I wonder if you are actually using SQL on the back end, since it reads like that flavor of language.
I've adopted a few SQL-like idioms, but not for technical reasons. There's also a AppleScript feel in the simple declaratory English verbs, and the use of prepositions instead of punctuation.
Nice! Just to play devil's advocate, you could say this not too much more verbosely if you wrote it in JavaScript using lodash... Well, you'd have to type "function" a lot. You could target that with your computer for output that is easier for you to follow perhaps.
With your compiler rather.
It indeed uses map, filter and sort functions to do some of the heavy lifting, but there's also some context management and dereferencing going on which bloats it up.
Something to consider is to try and get a minimal viable product in place, and to open it up to a small set of people to start to play with. Are you going to allow community to help create content?
Indeed, the short-term goal is to get a full stack engine with basic content up as soon as possible. Realistically it will probably be a few months even to that point because I don't want to be changing things too much once the world begins to connect to it.

I am still on the fence regarding community content. On one hand, yes I'd like to be able to flesh the world out quickly and with many varied experiences, but on the other hand I very much want the user experience to be consistent and progression-driven, which is tricky even in a tightly-knit group of developers.

The answer may lie in an approach such as that offered by e.g. Little Big Planet, where there's a main story that's tightly architected, and then user content that lives in its own shards and puts the player completely at the mercy of those who construct it. I used a similar approach in the early 90s in a somewhat similar multi-user environment called Universe, and it was effective enough but did have the problem of too many cooks creating too much tepid soup, and not enough customers willing to taste their way through the menu.
Glad to hear you are at least considering community content. I agree that a lot of community content is of questionable value, although there is often a rare contribution or two that can even outshine the primary source.
 

I attended Barcamp Philly today.

"What the heck is a barcamp?" you cry. A barcamp is an unconference.

"What's an unconference?" you ask. An unconference is a DIY conference. People who want to speak show up bright and early, write their name and the title of their talk on an index card, and slap it up on a grid of times and conference rooms. The board fills up, aaaand... that's the conference! Attend whatever talks strike your fancy.

"Why's it called barcamp?" you inquire. Because O'Reilly Associates, the people who publish those technical books with the animals on the covers, sponsors an annual conference you're not invited to called foocamp. And programmers like variables named "foo" and "bar." (Plus: "Friends Of O'Reilly.") Thus the joke.

"Why foo and bar?" you persist. The generic term "foo" dates to the 1930s and was popularized by a Smokey Stover cartoon, according to Internet RFC 3092, "Etymology of Foo." It was likely derived from the Chinese character "Fu." During World War II, GIs popularized the phrase FUBAR (F****d Up Beyond All Recognition). Thus after the war it was natural to think of "bar" as what comes after "foo."

"What talks did you attend?" I went to "You Are Not the User" by Shawn Berven, who covered a table with diabetes test gear and then explained what it takes to design products that are right for actual people... people who are not you.

I went to "Come On... It's in the Requirements" by Sloan Miller and Abby Fretz, who discussed the concept of the HIPPPO... the HIghest Paid, most imPortant Person in the room... who is guaranteed to be ill-informed and have strong feelings about everything.

I went to "Urban Exploration," by phillystomp, who showed us what she found when she snuck into abandoned Philadelphia public schools.

I missed an awesome talk by an eight year old girl about how to use iMovie because I was giving a talk of my own.

I went to "Web 0.9," where Greg McGee told us about headspinny new toys like WebGL and WebRTC.

And I wrapped up my day with "Geek Theater," an improv experiment by Lauren Galanter and friends. This turned into a panel discussion between an eight-year-old boy, an angry Philly cyclist, and Neil deGrasse Tyson. Hilarity ensued.

"Hey wait up! Did you say you spoke today?" Why yes, I did. My talk was entitled "javascript games, a HOWTO: thanks, Obama!"

"Why 'thanks, Obama?'" Because my friend turned 40. My friend sells health insurance, and his career got going as Obamacare was gearing up. I happen to think Obamacare has helped millions of people. It's also been an administrative clusterf***, no question. That created opportunities for people like my friend. So for his birthday, I whipped up a video game in which he must intercept as many potential customers as possible without running into any Tea Partiers. Because that makes Obama sad, you see.

This morning, I realized the game was just a talk waiting to happen, so I made a few changes to respect his privacy and "Willy Loman Sells Obamacare" was born.

"Why JavaScript?" It's the language of the web browser. And lately, the webserver too, but that's off topic. Everything can browse the web at this point, and it's a very easy language to code in, so if you want to whip up a game in a hurry that's your ticket.

"So you spent 45 minutes explaining a simple video game?" Well yeah, because details matter. But it was also a trojan horse for my favorite geeky rant, "this" considered harmful, in which I tell JavaScript programmers to stop stuntin' and frontin' and doin' things that are hard and save their best energies for the actual problem they are trying to solve.

"So how was it?" Oh, it was a blast, straight up. I've attended barcamps before, but it's been a while since I spoke at one, and I'd forgotten how good they can be. I attended JSFest in San Francisco this year— which required I get on airplanes— and honestly I got just as much out of barcamp today in many ways. I just love the vibe. I like the technical stuff, but I think I like the nontechnical stuff even more. You should absolutely attend the next barcamp in your area.


MORE
11/15 '14 5 Comments
Fantastic! I'm gonna send "Willy Loman" a link to your post.
I actually never knew the origin of the name.

Also? Super glad you gave a talk. Just wish I could have been there.

Also also? I bet "Willy Loman" loved it.
I really like how much the people on your post feel the need to tell you that, once you became a decent JS programmer, you wouldn't need this crutch.

When I stopped trying to pretend there was any chance I could learn C++, I took a moment to be grumpy at all the people who told me that all I needed was time. "No, you *$!(&), what I needed was the language's inheritance model to make sense, or for there to be a workaround."
Indeed. My ability to handle it is not in question. Everybody else's grasp of time management is.
This sounds like a Really Good Time.
 

Warning: I'm about to get verbose. At least verbose by most social media standards. You've been warned.

We're going to start doing a new thing at work. They're trying to reduce vehicle down time. One means to do this is to have people rotate through the different vehicles when people go on break. Person A moves into Van B when person B goes on break. When person B comes back from break they move into Van C and so on...

I'm reserving my judgement of the process for when we've had a chance to really try it out and work through things.

First

I headed up to Lebanon NH (where the office I'm based out of is located) and dropped off/disassembled the van that has been my home for the past year and a half. That was actually less emotional than you might expect.

Next

I bounced down/over to Oaklahoma City where I was picked up by a fellow driver. We were both a bit in the dark (as to the big picture plans and to each other's plans), so my flight into OKC could have been arranged a bit better. I drove him down to Dallas so he could catch a flight out on Monday, and then headed back up into OK to prep for work this week. I'm covering for him for a week while he's away on his break. Trying to keep vehicle down time reduced, remember?

Finally

I stopped in Atoka, Oklahoma and got a room for the night. This put me in the perfect spot to get started mapping right away the next morning (this morning). I won't bore you with details, but I couldn't start today and will start tomorrow. The good news is that this gave me today to walk around a little bit of Atoka. I prefer to walk once I'm stopped in a town. As Thomas was saying - you get so much more out of a town when you're walking than when you're driving through (he was talking about riding a bike, but the concept applies).

I'm staying in a 'not sexy but not gross' hotel. It's all but empty. Maybe a dozen cars in the lot late last night. Mid day, there are none but mine - looking a little lonely.

While I'm on the topic - the new vehicles that we're using for mapping? Sexy as hell. Back up camera. Digital displays with lots of technical data displayed in a comfortable fashion. Microsoft Sync. A very 'cockpit feel' to the driving space. Tight control of the vehicle and smooth exceleration. Brakes are tighter than I'm used to, but that too seems like a good thing when looked at together with the other elements of the vehicle.

I'm a fan of the newer Ford Escape.

I still haven't actually used it to map yet, but I suspect that won't be an issue.

Also - the wraps we have on the vehicle are far less... obnoxious. Still (as all wraps do) screams "LOOK AT ME!!!" - which I'm not a fan of - but not as bad as the old 'Ecto1' that I was driving around.

I walked up the street to the Wal-Mart. Mostly for something to do while stretching my legs. You can see how suave that experience was.

did find it interesting though. There's a layout that used to exist for Wal-Marts that I had forgotten. I haven't seen this particular layout of any store for decades. That's multiple decades. That is, of course, how this place was laid out.

For the record - yes, I prefer to shop just about anywhere over Wal-Marts as a rule. Alas, there aren't many options in Atoka, Oklahoma. 

After stopping at the big W-M, I was feeling a bit peckish. So when I encountered this little gem, I couldn't resist. Ladies and Gentlemen, may I introduce the Atoka Truck Stop Diner.

Hey - it's still a far cry better than Taco Bell which was my only other breakfast option at that point. Yeah. Let that sink in for a minute - Taco Bell serves breakfast. Oye.

In truth, it wasn't as bad as this pic makes it look. I had the breakfast burrito, and it was damn tasty. Coffee was decent too.

The thing I most enjoyed about the ATSD though was that it let me know just how deep into the South I was.

  • CMT was playing on the tv. Not any of that newfangled pop-country neither. Good ol' fashioned stuff. Dolly Parton. Kenny Rogers. That era.
  • There was a couple of old timers sitting together on the other side of the place. One was speaking loud enough for me to hear every word without trying. He was saying things like "I never did touch another drop o' tha booze. It makes yer suger jump up like whoah!" (Though you'll have to imagine the deep southern drawl.)
  • And lastly - I swear to you I'm not making this up - my waitress was wearing camoflage. As if she was going hunting the minute she got done with her shift.

There's a tiny Choctaw casino next door to my hotel (you can the sign for it in that previous pic with the hotel) but I haven't stopped in yet. I might have to - just so I can play around or two and say that I did.

Mix all that with a lot of southern twang and lots of cowboy hats and the cattle on the opposite side of the road, and you'll have a pretty good idea of what it feels like to hold up in Atoka Oklahoma for a day.

MORE
11/15 '14 6 Comments
"I never did touch another drop o' tha booze. It makes yer suger jump up like whoah!"

Haha! You know, using your heightened powers of observation to record regional dialogue produces very entertaining results.
I take that as high praise coming from a writer like you. :)

Of course, it's not that tough when the stuff just presents itself by (literally) screaming in your face.
Oh my god that's hilarious -- we have a Ford Escape in the driveway as a weekend rental for a few errands. I *hate* it. It's a pig; snout buried ears-deep in the gas tank, the turning radius of a cube van, driver ergonomics only slightly more confusing and poorly labeled than the control rooms in Chernobyl, and so rigid as to completely isolate me from the road. The car actively fights everything I try to do; if I want to accelerate, it wallows then lurches; feather the brakes, it threatens to skid; going in any direction other than straight is a challenge and most turns end up wider than they ought to be for who knows what reason. AND I can't see a god damn thing except straight ahead. Hands down it's the most unpleasant car I've driven in years.
Not that I'm saying you're wrong, by any means. It's just that my ideal vision of what a "car" should be is likely found on the opposite corner of any quadrant chart you want to plot this vehicle on.
If I hate it so much, why do I have it? Because it snowed yesterday.
And when it snows, the rental car places around here get socked in.
So when I went to pick up the Nissan Versa I had reserved, it was either the Escape.... or a king cab F-150.
Thanks for the opportunity to vent! Glad you're having fun on the road.
You make some interesting points. The labeling blows, and the turn radius is sub optimal. I was driving a Toyota Sienna minivan and the turn radius was much better.

I also kinda 'have to' like it. I'll be using one for a while, and don't have much say in that. ;)
You did a good job capturing the feel of Not Being In The Swing Of The Big City Things.
Thanks man. Interesting experience out here. Kinda dig it, but I couldn't stay here long term.
 

So this happened...

And they are giving me the worst headache. I was hoping to get less headaches, now I've got the funhouse effects, too.* What gives, glasses-wearing people?


*These are for astigmatism in my left eye, not age-related presbyopia. I'm supposed to wear them all day, yay!

MORE
11/15 '14 5 Comments
Not sure. Is it possible that the prescription is wrong? Or perhaps the frame is too tight or something?
They told me to wait two weeks before coming in for any of that. So I don't have a point of reference until my brain and eyes can agree on things.
my experience has been that every new pair of glasses comes with a FREE two-day headache.
on a positive note, it looks as if soon you will be able to confront your headache with hot toast and bagels!
Two days? Really? I can handle that. Today would be Full Day #1 if I can stick it out. I could only do a few hours the first day, and half of yesterday. These are my first glasses ever, and I can see fine with my right eye, so I get cranky at the end of the day, like "Do I even really need these if I'm still getting headaches?"
Do you know that it finally hit me now, at 2am, why you mentioned hot toast and bagels? D'oh.
 

This is... a neutral/positive story about phone service in Canada, oddly enough. In September and October, I took two trips to the US. I used some of my "Fido Dollars" - which have been accumulating for years - $40 was going to be enough for 200MB of US data-plan and more than enough voice/text than I would need on those two trips.

The September bill arrived when we were in Asia, and the October bill just arrived, so I took a look at both of them. They were both MUCH larger than expected, and my Fido Dollars balance didn't go down.

Oh oh.

I took a deep breath and called Fido, expecting an argument or "there's nothing we can do." It was a surreal and positive experience- from when a human picked up within ONE MINUTE of me calling, to the fact that this human (Morgan) was cheerful and socially aware- starting with "how can I help you today?" "I need to talk to someone in billing, please." "That's me! What can I do for you?" And concluding with her giving me a credit which translated in the end to me paying $40 in real dollars for the extra charges, instead of $40 of Fido Dollars. The entire call was 21 minutes, including her talking with her supervisor for about 10 of those minutes.

So something got messed up, either I didn't manage to complete the online order or their systems lost it. They have no record, I have a text saying I have to confirm the online order using a code. I had a personal note that I'd turned it on. Whatever. I'd be happier if I could've used the Fido Dollars, which continue to accumulate. But I'm happy enough, and especially grateful that I don't need to stress about it longer than the hour just past since I first discovered the bills.

So, perhaps the morale of this story is not procrastinating on the likely-frustrating phone-call, which is what I do often enough. And reiterating that people (and soulless systems, including telecom companies) can sometimes favourably surprise one.

MORE
11/15 '14
 

I've been writing since 3:45 AM. (I did also get my teeth cleaned, opened a checking account for Arden House Press and drove to Pendle Hill.)

All of the writing has been with Ulysses, and wow.

I don't know enough to recommend things to others, as a general rule.

I can say this, though, I've spent 100% of my writing time actually writing. No mouse, no navigating B.S., no style tinkering, no switching between documents, no saving, nothing.

I can't tell you how awesome that is. One thankful guy.


MORE
11/14 '14 7 Comments
I, too, just got my teeth cleaned. I keep rubbing the tip of my tongue along my front teeth. Ooh, smooooooove.
Does it make you write like Joyce? Because don't. :)
Oh, good, I'm glad you find it as useful as I do. It really does just get out of the way to let the words flow. Best editor ever.
VERSIONS!
It intelligently handles keeping track of all the past versions of everything, with a view for easy comparison, restoring of previous...
Happy Day!
You are near the top of my gratitude list tonight yourself, Tom Boutell.
Without OPW, I may have never heard of Ulysses or given it a try.
Also, for PNG file format.
I too am regularly thankful for the png format. Wish Ulysses was available for PC. Glad that it's working so well for you!
 

SHAVE ANOTHER DAY (2014) - James Bond (Ryan Gosling) pursues a hipster jewel thief through the streets of Red Hook, Brooklyn. When he finally catches up, the thief just hands him the jewels and says they "used to be cool." The Brooklyn scenes are credibly artisanal but Gosling's portrayal of "neckbond" is insufficiently ironic. B-

MORE
11/14 '14
 

So I'm really stuck on this whole boat metaphor.  (Too much reality tv?  Below Deck Marathons... anyone?)

Beyond the boat in the storm, I've been reflecting on my crew.  Bear with me as I break down this cheesy metaphor.

The captain of any ship needs a first mate and a solid crew.  These are the people that will help you chart a smooth course and survive the inevitable storms.  They're looking out for your best interest along the journey.

Here's the catch-

The best people for the job may not be the ones you've assigned to this role.

Mind blown.  Truly.

At 37 years old, I'm just beginning to grasp this concept.  There are so many people in our lives that we keep on as crew members and even first mates, who are no longer suited for the job.

Maybe they are there out of habit, or a sense of obligation.  We often let family members and old friends fill these roles, regardless of their effectiveness or interest in the job.  I'm here to tell you, they are taking up valuable space.  

I'm starting to see that it's impossible to chart your journey without an excellent first mate and crew.  Ones that you have mindfully selected, not just allowed to exist.

Here's the other thing-

They are often not who you thought they would be.  Maybe your partner is not your first mate.  Maybe your sister is not a member of your crew.  That's ok.  

Let them go from the role that you've assumed for them.  Let them go from the role that others expect them to play in your life. That's the powerful part of this process.  Letting go of assumptions and expectations. I have found it to be very challenging and important work.

Once you can let go, there is room for you to select your first mate and crew. To put your time and energy into a network of loving and supportive people who give that energy and love right back.

So, today I made a list.  I wrote down the names of my first mate and crew.  The go to people in my life.  Without thinking about it, I simply listed the first names that came to mind.  People I depend on.  People who take me 'as is'.  

At first, it was an odd little list.  And it was a short list. Many of the usual suspects were missing. It felt strange not to list family members or even some of my oldest friends.

Then I saw the common thread.  Every single person on this list energizes me. They make me laugh. They are honest and open, while being kind and respectful of my journey. These people truly shelter me from the storm, no questions asked.  Just seeing their names in print was comforting. They are my crew.



MORE
11/13 '14 2 Comments
Thanks so much, Sean!
A lovely and succinct way of expressing the notion. Thanks.