The wall

Ever play with legos?  It’s totally cool, and completely freeform, and you just reach into your bin, pull out some blocks, and start snapping them together.  Cool, right?

The legos manufacturer also sells kits, with detailed instructions.  Have you ever built one of those kits?  I haven’t, but I get that they can be fun.

But imagine that, EVERY time you want to play with your legos, BEFORE you get to the freeform part, you MUST carefully complete a detailed lego model EXACTLY according to the instructions.  Only then may you start building what YOU want to build.

Would you still want to play with your legos?  Would others?

This is what modern day game development is like.

————–

I’ve been researching ways to set up a C# game development environment for my nephew.  The Visual Studio IDE is still the king, being free and very powerful.  But the XNA library, which used to be the Windows code you need to draw art and play sounds for games, has been shut down by Microsoft.

SlimDX and SharpDX have sprung up to replace XNA in this space, with an array of higher-level developer libs on top of them.

Any way I go, I MUST load exactly correct sets of files into the exactly proper places on my dev machine, and hook them up with opaque incantations.  Then I must also use exact incantations to get these software tools to setup Windows, so that (finally) my code can actually get to the business of making the game I wanted to make in the first place.  Legos it ain’t!

Why do we tolerate this?  Well, of course, computers and operating systems and video cards are all very complex under the hood, and under the hood is where we program.  But nobody likes to get tripped up in (metaphorical) wire bundles, so we organize and compartmentalize our code.  We programmers recognize the utility of keeping things simple and clean.

But I also think that programming can be a priesthood, and having to know and correctly use bizarre incantations is how a priesthood maintains its exclusive status.  I’ve seen it many times. “If you can’t handle it, you don’t belong here.”  It’s toxic and exclusionary.

————–

But I guess I’m frustrated because I feel like a dinosaur.  It’s only been a few years since I explored new dev tools and libs.  But there’s so much that’s new, and different ways of doing things (that I don’t like)

Retained-mode, message-passing architectures are just as popular as ever (Windows, Unity, etc), though I find them gross.  WYSIWYG dev tools (Game Maker) are just as popular, though I find them limiting.  And complex WYSIWYG GUI design tools (Flash, Window Builder, Glade) are very useful in large and distributed teams, but unwanted complexity for my lone-wolf style.

Whatever happened to turn the computer on, and start typing code?  Okay, I know that hasn’t happened since the C-64/Apple 2 days. /old man rant

But even the Raspberry Pi, which was billed as a return to those days, requires the same complicated setup as every other modern dev environment.

Microsoft has actually worked hard (for years) to make life as easy as possible, FOR enterprise coders.  Game coders are expected to join the priesthood.

————–

I’m sure I can put together a dev environment for my nephew.  And I’m sure I can lead him though the minefield of incantations necessary to get him started.  I just wish there were a better way.

 

New Blog, same (content) as the old blog

For some reason, my old blog simply failed a couple months ago.  Now that it’s a new year, I set to fixing it.

It was a Geeklog CMS, and I wanted to move to WordPress, for familiarity.  And it didn’t even work; I had to export the raw DB of old stories.

And then I was left with an Excel spreadsheet of cells that contained posts I’d made going back to 2007, and no clear way to bulk-add them to my new blog.

So after several false starts, I found

This plugin

which loaded my data and added it to the story DB of my new blog, AFTER much data massaging.

But that’s done, and the data is (almost all) brought over!  Yay!

Backstory, and what it’s good for?

Here’s a fun, in-depth article that assembles and organizes all of the backstory for Destiny, the FPS game from Bungie.
http://www.gameinformer.com/b/features/archive/2015/08/24/what-s-going-on-in-destiny-s-story-anyway.aspx

I played for a few days at the beginning, and stopped when I felt I’d done enough shooting aliens.

But what fascinates me about this is…the varied responses to the article. Some love what gameinformer wrote, some bash Bungie, and some ask Why?

——————————————–
I hate to be contradictory, but nothing is going on with Destiny’s story. There’s a hell of a lot too much going on with Destiny’s BACKstory, but I don’t give a crap about that. I don’t want to learn extensively about backstory unless (1). it’s an integral part of the plot of the current game, (2). it serves a purpose gameplay-wise, or (3). it is part of a larger franchise and harkens back to other entries in said franchise. Destiny’s backstory doesn’t meet any of these. The backstory doesn’t really affect what you are doing or why you are doing it (there are bad guys and you have to kill them), it doesn’t serve any purpose in the gameplay (collecting dead ghosts doesn’t give you glimmer or any other consumables, and the backstory doesn’t give you gameplay/combat tips), and Destiny is the first entry in it’s series. It isn’t part of any larger universe, and to be honest, I’m not invested in the at all in the universe. Maybe two or three entries down the line I will be, but stuffing all this backstory down gamers’ throats at launch – without any meaningful story in the present – just seems pointless. First let me save humanity, discover more on my own about the mysterious Nine, and scan a bunch of computers, and then I might show a little more interest in the pathological psychosis of the Vex and the former majesty of the Fallen. At least, if you’re going to shove all this backstory in my face, at least let me discover and study it in game, instead of off of some Destiny nerd’s blog.
——————————————–

This guy is wrong, in several ways (and he’s got issues about things being shoved in his face/down his throat). But his opinion isn’t unusual, and it’s enlightening.

I’ve talked for a while about the difference between narrative (the story the game tells you, while you cooperate as protagonist), and so-called ludo-narrative (the story you tell through your actions and choices). But these players point out that the narrative itself comes in at least two parts; the "back-story", describing why things exist as they do, and the narrative I just described.

I’m starting to wonder how many meaningful parts there can be to a game story…

http://www.gameinformer…

The Blue Dream

Metafilter has a set of links to a subject I’d known something about, but not all. Go read and check out the last video; I’ll wait.
http://www.metafilter.com/151949/The-most-beautiful-airplane-that-never-flew

The Bugatti 100p was really just a plane, but it was beautiful, elegant, and ahead of its time. And the man who designed it has a reputation that succeeds him to this day.

So what is the…
videogame version of the Bugatti 100p?

It would be just a videogame, but beautiful, elegant, and ahead of its time. Some would say (very arguably) that Super Metroid (SNES) fits that description. Some would say M.U.L.E. I’m sure there are other candidates out there, too.

And if one makes such a videogame, will that ensure one a reputation that succeeds him?
http://www.metafilter.c…

We Need Bruce!

There is a job in the videogame industry. A very important job, that has been critical to some of the greatest games in videogame history. But it has no name. It gets no repect. People don’t even imagine it exists.

I was listening to…a podcast by Soren Johnson. His guest was Bruce Shelley, a videogame veteran who "is best known for his work on Railroad Tycoon, Civilization, and the Age of Empires series".
http://www.designer-notes.com/?p=1011

In the podcast, Mr. Shelley details his working relationship to Sid Meier, during the time Sid was making Railroad Tycoon, Covert Action, and Civilization. Sid would offer him new builds of game prototypes almost every day; Bruce would play them and provide detailed feedback. Bruce came from a deep background in historical wargaming, but was also a natural, seat-of-the-pants gamer. His idea of a good game was "whatever I enjoy playing".

While listening, I was reminded of another podcast I’d heard a year ago.
http://www.roguelikeradio.com/

The interview was with a member of an indie dev team. The member discussed how he played the various builds of the game obsessively, and how he provided detailed, timely analysis to the other members of the team. At the time, I didn’t understand quite what I was listening to, but I knew I wanted someone like that to work with me.

I am also dimly aware of other dev teams that had such members, and I bet you know of some too.

———————————————————————————————————–
So I’ve had a revelation.

What Bruce Shelley (and the indie game member) were doing was filling a critical role that is not filled by testers, designers, or producers. The job they did is different, and needs a name.

I will call this job description a "Bruce".

———————————————————————————————————–
A Bruce’s job is to test and provide feedback in a very tight loop, throughout the dev cycle. While a Bruce will find bugs to fix, her main job is to help the designer find the fun.

A "Bruce" needs a good grounding in games and videogames, an eagerness to educate herself about the subject matter, a willingness to play the HELL out of unfinished games, and the good communication skills to quickly and concisely tell the rest of the team what they think. Like any other team member, a Bruce is a full-time job.

A Bruce needs that near-OCD ability to play and replay a game long past the point that others grow tired of the game and move on. A Bruce WANTS to replay an entire game just to see how a small feature works.

A Bruce is not a programmer, but the designer she supports often is. A Bruce doesn’t need to be paired with a designer/programmer, though. The really critical aspect of a Bruce is iterative design. A Bruce has nothing to do, if you’re not doing iterative game design. If you’ve already got a clear idea of your perfect game, you need an AP, not a Bruce. But good game design IS iterative, so if you want to design a game from scratch, a Bruce is very useful.

———————————————————————————————————–
Why is a Bruce not just a designer, tester, or producer?

In AAA development, testers aren’t used for design. Hired at the end of the development cycle, paid little, working long hours, they’re told to find bugs, not offer suggestions. After the testing cycle is done, they are usually fired.

In indie development, testers are simply fans. As a group, they can provide lots of feedback, some of it great, but not in a focused or timely way.

Producers are also different from a Bruce. In my time in the AAA industry, I found that producers were responsible for getting the project done on time and on budget. They want the game to be good, but that’s not their first job. Bruce Shelley himself was an Assistant Producer at MicroProse before he became Meier’s "Bruce". He made maps, did research, produced game data, and kept his head down.

Finally, Bruces aren’t designers. I say that because a Bruce’s job is to SUPPORT the designer, but also because I’ve worked with too many designers who didn’t do the job of a "Bruce".

I believe you can find examples of testers , designers, or APs doing the work of a Bruce, which only reinforces my point; the Bruce is a unique job that needs respect and a job description.

———————————————————————————————————–
I’ve always wanted a Bruce, but didn’t exactly know what it was or how to get one. I envied the game devs who had gathered a small and effective team around them, and recognized that (as a videogame developer) needed art, sound, and bizdev, BUT I also needed the support of a Bruce.

If you have a Bruce on your team, shower them with love and respect, because they deserve it.

If you can get a Bruce on your team, do so.
http://www.designer-not…
http://www.roguelikerad…

Alas the Folly of Man

I’ve been working on a new game. Here’s a DL link to the Windows version.

http://www.eochu.com/dl/AlasTheFollyOfMan.zip

Inspired by a certain dinosaur movie, this game…
lets you create a theme park using monsters you capture on an island.

Right now it’s all programmer-art. I CAN make it pretty; I’m negotiating with artists right now for the work. But I’ve been building the functionality, and trying to find the fun.

I THINK I’ve begun to find it, but I could use your help and feedback. PLEASE let me know what you think.http://www.eochu.com/dl…

Algorithm: objects moving within graphs

Problem: How do I move objects around in a maze like Pac-man?


Theory:
A maze game (like pac-man) uses a maze. This maze looks like a 2D array of open and closed squares (and it is), but a better way to think about it is as a GRAPH. This isn’t a graph like the 2D plot of data:

In pure math terms, a directed graph is “a set of points connected by lines”. That simple. Just some points, and some lines that connect some of them. If you imagine the points in a pac-man maze are in the center of each square, then there are invisible lines connecting the points through the open hallways.

So moving objects around in a maze becomes “traversing the graph”, moving from point to point along a connecting line.

Theory:
When your objects live in a maze (or other type of GRAPH), they really have two positions; one in “grid-space” and one in “screen-space”. screen-space is in pixels, of course. Grid-space corresponds to the blocks of the maze you have. You’ll have to keep these two coordinate systems straight, in your head and in the code, or you’ll get very confused.

It can help to make two functions, ScreenToGrid() and GridToScreen(), to keep the translations straight. If your game supports scrolling and zooming of the display, these functions become critical.


Solution:
Each object should have x and y variables for where they are (this should not be a surprise) . But in this case, those variables should be for the POINT the object is moving to. There should also be x and y for the point the object is leaving, and there should be a float value for the percentage of the distance the object has traveled between the two points. Something like:

int nextX, nextY;
int prevX, prevY;
float percentMoved = 0;

Moving between the points is as simple as incrementing the percent variable:

percentMoved = percentMoved + speed;
if (percentMoved >= 1.0)
{
percentMoved = percentMoved - 1.0;

prevX = nextX;
prevY = nextY;

// make the decision about what point to move to here
// put the results of that decision into nextX and nextY
}

Now, how do we know exactly WHERE the object is? We can calculate that with:

float drawX, drawY;
drawX = (percentMoved) * nextX + (1-percentMoved) * prevX;
drawX = drawX * PIXELS_PER_GRID_SQUARE;
drawY = (percentMoved) * nextY + (1-percentMoved) * prevY;
drawY = drawY * PIXELS_PER_GRID_SQUARE;

Notice how (in the above pseudo-code) drawX is initially still in “grid-space”. We multiply by PIXELS_PER_GRID_SQUARE in order to translate the variable into screen-space.


Usage:
If you’re making a game even remotely like pac-man, you should use this algorithm. If you’re making a game with halls and corridors (in 2D or 3D), and you need enemies to move through them, you can make a “pathmap” from points connected by lines. This pathmap would be invisible to the player, but it’s a directed graph, which means objects can move along it using this algorithm.

Finished! (with caveats)

Here’s the final version of my 2015 7drl: http://www.eochu.com/dl/RL2015-final-2.zip

It was really a 2drl. I set a very…low bar for myself, to avoid failure. Then I crested that bar on the second day, and didn’t really do anything else for the rest of the contest.

I COULD have added a great deal of AV polish, but that’s not what a 7DRL is really about. I could also have kept adding features and functionality, but I wasn’t feeling it. What I imagined was a simple puzzle-positioning game, and I achieved that. Adding an inventory, or LOS, or more complex combat, I felt was superfluous. So I just stopped working on it.

Next time, perhaps I’ll set my goals higher, shooting for a more general-purpose RL expression. But for now, I’m happy simply to have participated.http://www.eochu.com/dl…

Items/Altars

The basic game works! Now what?

Good question. As it is, …it’s too simple to hold much interest for long. So I’ve thought about what to add?

One answer is, collect items into an inventory, combine them into spells, and blast the monsters. More work, but the fun is well-defined.

Another answer comes from the code, where I made the exit square from an "Item" base class. This makes it easier to add more "items", of different types, that do something when the player steps on them. As it happens, the Crawl artsheet I’ve been using has loads of cool "altars".

SO that’s what I’m doing next; adding altars to the game which trigger interesting effects when you step on them. Right now, my ideas are:
-a couple of altars you teleport between
-an altar that temporarily turns you into a monstrous killing machine
-an altar that destroys enemies that are near enough
-an altar that changes the dungeon map in some way

While in the bath, I came up with two features that could give depth to this system.

-a help dialog that would explain how the altar works, when you get within one square. I considered no help text at all, and I considered hover-text using the mouse. Both are still a possibility, but my hope is that the unique altar art + help text (when close enough) will feel good to the player. Keyboard players and mobile players both have issues with mouse-based UIs, so I THINK it’s a good choice.

-a powerup bar that fills when you "scrape" an enemy. Borrowed from bullet-hell shooters, the idea is that getting close to an enemy (something you normally don’t wish to do) can benefit you. The effects of some of the altars will be enhanced by the amount your "Rage" bar is charged. The closer the enemy (that is chasing you) the more gets added to the bar.

I’m also considering a "Restart" or "Resign" button.