Tag Archives: website design

State of the Vulture’s Nest

May 16, 2022

You might have noticed my publishing output has waned over the last couple years. My last major publication was a novel, Mage Tech Duet, a scifi/fantasy hybrid. That’s because I’ve been exploring other creative outlets, such as video game programming. My latest hobby has been Meta’s Horizon Worlds, a sandbox application for creating VR games and art.

Over the weekend, I published what’s called a hub world, “Vulture’s Nest,” to provide easy access to my VR creations and collaborations. This will be updated as time goes on, just like a website. Now, whenever I make a new game/art/whatever, I can drop just a single door into that world, linking back to this one, so visitors can explore other ones. Here’s a video of what it looks like:

I’m not sure where my publishing “career” is headed, if I even had one. I’ve been submitting stories for publication, performance, and production for over 30 years now, and I’m burnt-out. So I’ve decided it’s okay to have other creative pursuits. I have to do it for my psychological health. So I don’t know what’s next: another video game, a song, a piano performance, a dramatic performance, a painting, or more fiction. It depends on what tickles my fancy and what you ask for.

Look for a website redesign in 2022, plus more unpredictable creations and some minor publishing news. C’est la vie!

Horizon World Newbie Scripting Concepts for PHP & JavaScript Programmers

December 10, 2021

If you have a programming background and have just begun to code in Horizon Worlds for the Oculus virtual reality headset, I feel for you. Here’s the article I wish I’d read when I started there a few months ago.

When I received an invitation to beta test the Meta app then called Facebook Horizon, I had no prior experience programming in virtual reality. Horizon Worlds — which users simply refer to as “Horizon” and which is not to be confused with its sister app Horizon Workrooms — is a collaborative creation tool to make gaming “worlds.” It’s a competitor to Rec Room. The experience of building and styling virtual environments from simple shapes reminds me of watching my sons play Minecraft and Roblox. The whole experience is wonderful and addictive. I haven’t played with any of my other Oculus programs in the last three months.

As with website creation, its users tend either to design things, like my friend Jay Haynes, who can craft realistic-looking chess pieces and cars, or code. I’m in the latter category, being more comfortable scripting than sculpting. And like with website designers and programmers, Horizon creators frequently team up, as Jay (Sensei_Jay) and I (Vulture667) have done on projects like Chess Parlor. For a recent entry in a contest, for example, Jay made a beautiful gun and wormhole out of primitive shapes, and I programmed them to shoot and teleport things.

Scripting in Horizon can be difficult to understand at the beginning. It can be like approaching a new martial art: you learn by doing and by consulting mentors and not necessarily by following a step-by-step curriculum. I come from a PHP and JavaScript coding background, and despite the heroic efforts of the Vidyuu Tutorials YouTube channel, I was thoroughly confused by Horizon’s “script gizmo” object. Script gizmos are literal (but virtual) cubes you pull from your building tools menu. They contain a visual scripting editor similar to Blockly in which you drop colorful blobs of code into other coloful blobs of code, thereby programming your creations’ behaviors.

There’s no requirement to attach script gizmos — let’s just call them SGs — to objects. You can make flowers and rocks or whatever all day long. You can even animate those objects through their internal properties panels. But the use of SGs raises your Horizon world to the next level.

So, are you ready to get started, Mx. PHP/JavaScript programmer? Here’s a primer. Civilians should be warned the following discussion will get technical.

After much hemming and hawing, I admit Horizon’s coding concepts are similar to the object-oriented programming concepts of PHP classes. The distinction, however, is we’re not instantiating objects from a class like we do in this PHP snippet:


class Shape {
   // Properties
   public $quality = 'juicy';

   // Methods
   public function get_quality() {
      return $this->quality;

// Run time
$apple = new Shape();
echo $apple->get_quality(); // juicy


Instead, we create an object out of primitive shapes and attach an SG to it. You can only attach one SG to an object or to an object composed of a group of objects. However, the same SG can be separately attached to different objects, and in that sense, each object becomes an instance of a class defined by the SG.

Figure 1. The 'Shape' script gizmo has been attached to the apple object. The SG has a string quality with 'juicy' as its default.
Figure 1. The ‘Shape’ script gizmo has been attached to the apple object. The SG has a string quality with ‘juicy’ as its default.

Here are some things to know:

    • SG variables are like PHP class properties. SG event parameters are like PHP class method (function) arguments.
    • Most variables in an SG, whether accepted as input arguments or used internally, are declared on your SG’s “Variables” tab. I say “most” because input parameters to an “event” don’t have to be declared here (see below discussion of events).
    • Default values can be set on the Variables tab, but those defaults can be overridden within the object’s properties panel when the SG is attached to it, as in Figure 2 below. Overriding a default value is like adding $apple->quality = ‘rotten’; to your PHP runtime code or specifying an argument value in an ordinary function call in either PHP or JavaScript.

Figure 2. The 'Shape' script gizmo has been attached to the apple object. The apple has overridden quality's default value with 'rotten.'
Figure 2. The ‘Shape’ script gizmo has been attached to the apple object. The apple has overridden quality‘s default value with ‘rotten.’

  • Variables declared on the Variables tab are locally scoped to the SG.
  • There are no global variables for a game that all your SGs can reference unless you store them within another SG and call them through events sent between objects (see example below). There are, however, “player persistent variables” (PPVs), which are like cookies attached to a player’s ID and which survive game sessions; with these, you can record a player’s high score to be referenced in future sessions.
  • There are no game-persistent variables that can cross from one world to another. So if an RPG player has collected items into an inventory and then travels to a new game world — perhaps levels 1 and 2 are programmed in separate worlds — level 2 will not know what items were gathered in level 1. If level 2 could read level 1’s PPVs, that would be great, but PPVs only apply to the world in which they were created, like client-side cookies only apply to the website that issued them.
  • Arrays are called “lists” in Horizon. There are no associative arrays, just zero-based lists. Incrementors like – – and ++ are nice conveniences in other languages that don’t exist in Horizon, so to iterate over a list, you must set an incrementor variable to be equal to the length of the list and then decrement it via a command like “set incrementor to incrementor – 1″ during each passage through the loop, breaking out with a while command, e.g.:
while incrementor is > 0
set incrementor to incrementor - 1

Figure 3. Iterating through a list to print values to the debug console.
Figure 3. Iterating through a list to print values to the debug console.

Whenever you see a “when event is received” code block, that’s the equivalent of the get_quality() method in the PHP example above. It’s basically a function definition that lays out what things should happen whenever it’s called. There are no return lines, however, unless the event explicitly sends data back out. For instance, this PHP method:

   public function get_quality() {
      return $this->quality;

Would look like this in Horizon Worlds:

when get_quality is received with calling_object
send return_quality to calling_object with quality

Those commands would live within colorful, Blockly-like blobs, of course.

It’s worth noting here that the calling_object parameter is also a variable, but it’s a variable that’s local to this event block, whereas quality references a string variable declared on the SG’s Variables tab. In other words, calling_object is an input argument. This means that calls to the get_quality event must have a corresponding number of arguments:

send get_quality to receiving_object with self

And just like in JavaScript and PHP, the typecast of the input and receiving arguments — called parameters — must match, too.  So if the call sends in string, boolean, object, then the recipient listens for string, boolean, object, in that order.  You can send and receive up to three of them. You can’t send lists.

An event that returns some point of data isn’t a common use of event definitions, though — but I think it would be an awesome use of them. Most events act directly upon objects in the game world. For example:

when paint_yourself is received
Set self color to color_variable

Without getting into a discussion of whether Horizon scripting is async or sync — because inevitably I will confuse those definitions — I’ll just tell you how I believe it works.

An SG’s commands within a given event block are performed sequentially but so quickly that they’re practically simultaneous. Before the introduction of the else and else if commands a few weeks ago, all we had were while and if. Boolean switches were a pain. Consider this snippet:

when world is started
if booleanvalue
set booleanvalue to false
if not (booleanvalue)
set booleanvalue to true

In my naiveté, I thought that was a great way to toggle booleanvalue until I realized that if the first if statement set a boolean to false, the second if statement would fire as well. This meant that (again, before the advent of else), toggling booleanvalue required firing events back to self on a delay:

when world is started
if booleanvalue
send togglefalse to self after #1 seconds
if not (booleanvalue)
send toggletrue to self after #1 seconds
when togglefalse is received
set booleanvalue to false
when toggletrue is received
set booleanvalue to true

In other words, if booleanvalue were true when the script began, the “if not (booleanvalue)” line within the when world is started block needed the command parser to move past it so it wouldn’t fire as well; so that’s why the togglefalse event was fired on a delay slower than the parser. Wow, what a pain, huh? So thank God they came out with else so we can simply write:

when world is started
if booleanvalue
set booleanvalue to false
set booleanvalue to true

Why is this so important, other than simplifying our code? I’m glad you asked.

Horizon allows us to send events to self or other objects on a delay. This is critical when doing things like rotating objects:

when world is started
send rotateme to self
when rotateme is received
send rotateme to self after #1 seconds
rotate self by 90.0.0 over #1 sec

Two things are happening here you need to notice. The first is the event listener you saw earlier, when world is started, which causes an event (rotateme) to fire. There are lots of event listeners to play with concerning things like collisions and grabs and button pushes, and you’ll have fun with those.

The second thing to note is what I’m talking about here regarding the near-simultaneity of the parser. Within the rotateme event, the “send rotateme to self after #1 seconds” command and the “rotate self by 90.0.0 over #1 sec” command basically occur at the same time. The send line is like saying in JavaScript: setTimeout(function(){ rotateme(); }, 1000);. So if you ever loop your events on a delay, like we’re doing here, then make sure your motion-over-time seconds parameter and your event-on-delay seconds parameter match, or you’ll get some crazy rhythm.

This fact made my brain explode. Let’s say you have a gun. If you’re me, it’s just an object group consisting of two perpendicular rectangles (for the handle and barrel) and one projectile launcher at the muzzle. If you’re my partner Jay, it’s a highly realistic looking sculpture to make you weep at its beauty.

The way you build this is to lay everything out, select them all, and then group them together and name them “gun” or something. You can then impart properties to the group such as physics, gravity, and grabbability, via its properties panel.

To make it fire, you attach an SG called “Fire Gun” to the gun. It says that when the player pulls the trigger on their controller to fire a projectile from the projectile launcher. The projectile launcher, being an object within the gun object group, is referenced locally within the SG’s Variables tab but passed into the script through the gun’s “Attached Script” panel.

Figure 4. One damn ugly gun shape with attached script to make its projectile launcher fire.
Figure 4. One damn ugly gun shape with attached script to make its projectile launcher fire.

This causes the projectile launcher to fire a pretty little sphere. If you want those spheres to do something, however, you have to attach a separate SG to the projectile launcher itself.

The parent gun object can be referenced within the projectile launcher’s SG if you like. Maybe upon projectile impact, you want the player to drop the gun for some reason.

Figure 5. Script attached to the projectile launcher, which is inside the gun object. Its script references the gun object to make the player drop the gun upon projectile impact.
Figure 5. Script attached to the projectile launcher, which is inside the gun object. Its script references the gun object to make the player drop the gun upon projectile impact.

This is just one example, but it’s an important concept for you to know if you want to impart your complex objects with complex behaviors.

Since an object can only have one SG attached to it, I find that comparing the SG to a brain is a useful analogy. Perhaps this is body-over-brain bias at work, but this comparison reminds me that the SG is an optional attachment to the object and that the object is not really an instance of the SG. The SG is only a set of instructions, and if separate objects use the same SG, then fine; they won’t necessarily think the same thoughts. The SG is nothing without the object; you hear me? Nothing!

Philosophy aside, I hope this primer helps break the ice between your programming brain and Horizon Worlds. If you have anything to add, please leave me a comment or holler at me on Facebook. I overly ambitiously intend to keep this article updated with new Horizon code releases.

Collaborate with Artificial Intelligence

June 13, 2021

I’ve programmed a new online game, the Collaborative Story Generator, that allows you to trade sentences or words with a computer to write a story. The game uses the text generation API at DeepAI, described as follows:

The text generation API is backed by a large-scale unsupervised language model that can generate paragraphs of text. This transformer-based language model, based on the GPT-2 model by OpenAI, intakes a sentence or partial sentence and predicts subsequent text from that input.

DeepAI is a fascinating website normally used by researchers to mine data. It was fun to adapt one of its tools for this.

Here’s the transcript of a recent game I played:

Mode Selected: Trade sentences

You: I just programmed a game in which you can collaborate on a story with an artificial intelligence.


I think that's great in any way.

You: It works by talking to deepai.org.


I don't know if it works by talking to humans, and maybe it shouldn't.

You: Well, at the beginning, humans programmed it, but I’m confident they are not controlling the interactions at this point.


I am just curious if you can convince them that artificial intelligence is a better solution than I believe there should be.

You: Some people are resistant of the idea of it, but maybe games like this will encourage them to think otherwise.


A quick disclaimer here.

You: Computers are not sentient.


But if they are so, they are intelligent.

You: Some people confuse sentience with intelligence, and I think they are two distinct concepts.


A little background information:

You: I like to program things for fun, and that’s why I made this game.


I have found that interacting with computers is interesting and often helpful.

You: When they work well, the results can be spooky.


I don't make any money from people that send me "games.

You: And why should I?


The idea of games with smart algorithms and intelligent gameplay is all too popular with children right now.

Juhyo Update

March 7, 2021

It’s taken nearly five months, but I now have a bug-free (I think!), responsively designed game you can play against three computer opponents. They’re very stupid opponents because they randomly make their decisions, but at least they follow the rules. The next programming phase I’m beginning should be the fun one: how to make the computer smarter. This is the part that should scare all sci-fi writers, because obviously I am just one boolean function call away from creating an apocalyptical computer sentience.

No update yet on when Juhyo will be available for the general public. As always, stay tuned!


Up to My Elbows

November 10, 2020

Just a quick update. I am up to my elbows in the programming of a new online game. This one is an adaptation of the card game Deena and my boys created, Juhyo. The printed card game, which is in very limited circulation right now with a select group of players, is a trick-taking game about snowmen in the guises of various monsters. A website will launch soon with more details.

One of the Juhyo website’s features will be the online demo. It’s entirely in JavaScript (and if I do it right, responsive to your mobile phone), so it won’t require any special software or app players to access, just a standard web browser. Making something of this scope is a slow, exacting process that will take me into 2021.

While you’re waiting, I hope you’ll give “Tombs & Mummies” a spin over at the IFComp2020 archives. If you rate fives games there before November 29, your votes will help determine the contest winners.


Upcoming Appearances

January 23, 2020

A couple of events to tell you about!

January 25 @ 3PM
Live with Sensei: Watch on YouTube
• Host Jay Haynes and I will kibitz about story craft.

February 14–16
Boskone 57
Westin Waterfront Boston Hotel
Boston, MA
More info
Deena Warner and I will be guests concerning online marketing for publishing industry in the “Great Website Designs & Boskone Reveal” panel. I’ll also be giving a reading from Empire of the Goddess and participating in other panel discussions on self promotion and the business of writing.

February 19 @ 8AM
Rotary Club meeting
Cold Harbor Restaurant
Mechanicsville, VA
• The Rotary Club of Mechanicsville will host me as a guest speaker during their breakfast meeting.

What the Heckfire I’ve Been Doing

September 18, 2017

It’s been a while since I posted anything here, but rest assured my little elves are hard at work on goodies for you. Here’s an update.

The Organ Donor
The 15th anniversary edition of my first novel, The Organ Donor, is on track for a November release from Bloodshot Books. I went all self-indulgent with this one, penning a 6,000-word afterword for the new edition, laying out the whole sordid story about my real-life encounter with Chinese organ trafficking. The publisher hired the estimable Deena Warner to do the cover art and design, which I hope to show you soon. I’m again working with filmmaker John Johnson to foolishly spend any royalties I earn from this edition on a fun book trailer. (Watch past book trailers at this link.) More information about The Organ Donor.

The Dagger of God
The what?! What ‘chu talkin’ about, Willis? That’s right; there’s another novel in the sausage-making factory. This one is a trunk novel, a ghost story about the Civil War, Ku Klux Klan, and ugly racial violence. As if that’s topical. I enjoy reading/performing stories, so I’m trying something new: recording my own audio book. It’s been a fun experiment so far but fraught with frustrations as my basement office isn’t exactly a sound booth (chugga-chugga laundry machines behind me, and idiot felines scratching on my window screen), and my microphone picks up every breath pop, inhalation, and squishy lip parting that I make. Probably the most successful aspect of this venture will be the blooper reel. There’s also the challenge of keeping character voices distinct. My main character is a Southern belle who alternately sounds like Scarlett O’Hara or Matt-Warner-forgetting-his-character’s-voice. But when it’s done, I nevertheless intend to release it on the Amazon ACX platform and possibly on Youtube. If successful, it will make one long car trip bearable for you. Listening to an audiobook really is the best way to travel.

And on the personal front . . .
The website design business keeps the “busy” in business. I mean, day-um. Deena Warner Design continues to be in high demand for author websites. I’m also spending a significant portion of time working for First Arriving, a marketing firm in high demand for fire department websites. My writing career currently occupies the 530-630am hour most weekdays, and these two firms occupy everything else — that is, everything not taken up by my high-energy 6- and 8-year-old boys, who are scary smart.

On top of all that, I’ve become ever more entrenched in Total Defense Martial Arts, which provides boxing and Brazilian jiu-jitsu instruction to the Staunton area. Starting in January, I’ll assume primary responsibility for teaching BJJ to kids between 6 and 16. I’m also in talks with Staunton Montessori School to volunteer for two months as a self-defense instructor to 7-9th graders, teaching them the joys of escaping headlocks, bear hugs, and chokes.

That’s about it. Please stay tuned for all the happenings this fall.

Halloween News

October 31, 2016

What, nothing about the election this time, Matt? That’s right, I’m here to make you happy! Three quick items.

  • I’m hard at work on a new project for White Noise Press, a “publisher of hand-crafted, limited edition unique fiction & art since 2006.” Editor Keith Minnion posted this comment on Facebook this morning:

    Next up from White Noise Press, releasing in the Spring of 2017, a new story by Matthew Warner. Here is what we asked from Matt:

    “What I would like is the most extreme, out there, outrageous story you have ever written, in whatever genre you choose, hopefully something that no other market in their right mind would touch with a ten-foot halberd. My only restrictions are: no child-in-peril or domestic/sexual abuse as a plot point. I would like to publish it in the March-April timeframe, but if it takes longer, no biggie.”

    We also are fortunate to be able to feature Matt’s better half, the multi-talented Deena Warner, who will be doing the cover art.

    On the way from White Noise Press!

    I was quite relieved to receive his message as I was concerned about the propriety of what I’m writing for him. But now, I am . . . unshackled. (Sorry, couldn’t resist an election reference.)

  • h2016-large

  • Deena’s collectible Halloween card is in the mail. It features a story by Monica J. O’Rourke as disturbing as Deena’s illustration. This has been an annual tradition for 15 years. Deena’s M.O. is to draw or paint something and then invite someone to write a story based on it. I wrote “Life Insurance” for her in 2005; you can read it in Dominoes in Time. The card is free; just sign up to get one next year.
  • Over at Deena Warner Design, we launched a major website for Richard Chizmar today. Another major website launches this week for another well-known author. I can’t say who it is except he strongly resembles Santa Claus. We have a special going on for economically priced websites, you authors and publishers out there.

Deena Warner Design’s new website

October 14, 2016

Alas, I do have a day job in addition to writing. Fortunately, it’s still in the publishing biz. If you’re also in the biz, please take a moment to visit our new company website.


Responsive Reckoning Day

April 14, 2015

This LinkedIn post says it all: “April 21, 2015 – Responsive Reckoning Day with Google . . . It’s official. Non-responsive sites will start ranking lower in Google mobile search.”


So I’ve just spent the past two days pulling my hair out reprogramming this website’s CSS file. The good news is Google’s Mobile Friendly Test says I now pass the grade. To experience the awesomeness for yourself, just grab the right side of your browser window and slowly make it narrower.

Consider this your PSA to get your website affairs in order by April 21! I have visions of Google secret police breaking into houses everywhere, cackling maniacally, as they scream about CSS armageddon. Yeah, it could happen, you know.