Friday, November 5, 2010

Quest Line

I'm finding myself in a somewhat positive situation now. Well, it has the possibility to be positive, in spite of the fact that it very well may change the trajectory that I'm on. Or it may be positive for exactly that reason. I'm trying not to get all worked up over it though. It's a little sad in some way that cynicism has found a home in my otherwise perpetually bright-sided brain, but I guess it comes with the territory.
In any event, with this given opportunity I was told to create a quest (hence today's title), but the quest has some severe limitations placed on it, regarding length, and who it was for, and how many people it would involve. After getting this, and staring at it, and then staring some more, I decided that staring at it blankly wasn't really going to do me any favours. In fact, I find that I do some of my very worse thinking in the cold glow of a computer screen. So I closed up the laptop (the requirements burned into my retinas at that point), grabbed some snacks and sat down to watch a recorded Manchester United game. Although it's completely off topic, no, I'm not British.
Well, sort of watched. Soccer is like Baseball, you can half pay attention and look up when the crowd is making a noise. In any event, the kernel appeared right in my mind. A core conceit that only needed some fleshing out. So I was off to the World of Warcraft wiki to look some stuff up. After looking about for a bit I was able to add the final pieces that would make my concept work from a story and mechanical level.
The stupid thing is, I seriously doubt that my quest design will ever appear anywhere. On the other hand, I wonder what kind of information the NDA specifies, since it's pretty vague (although less vague than I'm trying to be), but I assume that it would prevent me from posting that particular quest up. If and when I find out, I probably will.
There was a point to this whole bit of nothing once. The thing is, in spite of my last post and the worries it contained regarding atrophy and my creative juicy mojo, there seemed to be nothing of the sort. Quite the opposite. Once I had the goal and my ideas, I turned on the spigot and pure, glossy creativity poured right on through. Focused even. I didn't have to reign it in, pull it back, try to divert it. Hours passed that felt like minutes, writing came fully crafted to the page, new ideas would come out and fit into the overall structure fully formed and ready for installation. My brain just went like a train (rhyme!) in a single direction, with a single destination and an inevitability that it would get there with the passengers all quite pleased with the experience.
After these long months, it felt awesome to just let it loose like that. To unleash it at a task and see where the train would take me.
Yeah, yeah yeah, I know, that whole thing seems like a stupid nonsense, and writing about it seems self congratulatory at best. But after a while, it is possible to forget why I love doing this so much. It's something to say, "I like designing because it makes me happy," and finding that after the 4th hour of actually working there is a smile on my face that I don't remember putting there. Please don't mind my self indulgence, I'm just happy, and it makes me glad to say.

-On another topic, I was thinking recently about The Star Frog EP, mostly because it's something I can think about on a purely abstract level (unlike say, Paper Zeppelin or TTT, which have code which musses up the abstraction). I starting thinking about telling a story or making a point via mechanics. I mean, there are a few ways to tell a story in a game. You can always write a wall of text, or show a movie, or have talking. Those are the easy ones. The harder ones are things like using items in the game, or doing something with the art direction and style, or setting up a scenario that the player may find themselves in or notice in the background. I suppose that these can be classified as Direct and Indirect respectively. So an example of Direct is having a character tell you that the Wizard has stolen a Princess. An Indirect example would be to find the Wizard's Tower and see a Princess weeping in the tower. The Indirect method gives you a bunch of clues and asks you to figure it out. Braid does that. SqueEnix does 7 discs worth of movies and text. Games tend to want to use Indirect storytelling, so that the player figures it out.
If you still with me, I started this chunk by talking about Mechanical Storytelling. This one is kind of weird. I mean, it's an Indirect method, but not in the way you would expect. You see, the story in a game is the story about the characters in that game. The player deals with constants regarding the mechanics and uses them to progress throughout the story. I was thinking however, that Mechanical Storytelling affects the Player's Story.
What the hell am I talking about? Well, stick it out for a moment. You see, the Player's Story is the story of what happens to the player, and what they are experiencing. Generally, these are pretty small and deal with Id and emotions. So you have your joy, and your fun, and being scared and adrenaline and all of that. However, the biggest way to get something across to a player is to give them another way to perceive their interactivity with the world itself.
A good example is in the original Super Mario, when you get to the first water level. Suddenly, the mechanics are changed and you have to deal with swimming. I would bet that most people hate those levels, because the gameplay is altered. We can construe from the mechanics in the new area that, A) Mario is a terrible swimmer, and B) He should avoid water whenever possible. Now Mario doesn't emote. He doesn't say in his borderline racist Italian voice, "Mesa Hatesa Aqua," or whatever. All of that stuff that comes with it is from the player. They hate and fear the water. Their own story is about barely making it out alive.
GTA 4 does something else like it. In the game, you can get drunk, which effect the way the screen looks and how well Drunkle Nico is able to drive. These things change the player's ability to do them and further, it ties their inability to drive while the game is doing that to Nico's inability to drive because he tossed back 17 JaegerBombs.

-Speaking of drinking, I'm playing Fable III now. I'm finding it in most regards to be just like Fable II, which I think is a good thing. Only now you can use your own hero when playing multiplayer, which is nice. Although me and the wife argue a bit when I want to go clothes shopping. The biggest change, and this may be stupid, is that the simplified the combat. Well, except for swords, those still work in the same boring way. But now you can only use one spell at a time, and the shooting has become less interesting. Regarding the magic, it's not a big deal. In the last game the wife played the role of Sorceress, and she used the Fire based Inferno, and the Summon Creatures (or Darklings and they're known in our house) Spell. Although now the Darkling Summoning is a potion, and you can combine spells together to make new ones (try the Flaming Tornado or as I've dubbed it, The Fire Swirly), so it's kind of a push really.
The thing about it that makes me sad is that the shooting is simplified, which makes it boring. You see, in Fable II, once the gun was powered up you could pop of crack shots on a person and aim at specific body parts. My hero The Scarlett Sparrow would be able to rock his pistol and land shots on heads and nads with impunity. His son seems to lack Dad's skill with firearms, and all he can do it point and shoot like a DSLR. Not being able to aim takes something away, and doesn't replace it with anything useful. So now you can charge a shot for extra damage. So what, the aiming mechanic did the same thing and was a skill you could get good at. It was a kind of metagame in my house with II, could the Scarlett Sparrow shoot the bandits to death before the Wife's one two punch of Darklings and powered up Inferno?
It just seems a little less somehow. with II each of the methods of combat felt different. Swords were button mashy and kind of messy, guns were powerful but required skill to use really well, and the power up to charge nature of spells offered a high risk, high reward option. Now shooting feels like longer ranged close combat.
That's why my hero in this game uses magic almost exclusively - it's the most unique option for combat, although it is far easier than trying to play the whole game with a pistol. Then again, the combination of sorcerous fire and lightning would be.

Monday, October 11, 2010

Much Ado About Nothing

My dreams have become more vivid as of late. I wonder if it has anything to do with my creative juices sitting in the cupboard. I hope that I can keep it on a simmer, and that it A) doesn't atrophy, and B) doesn't explode into some kind of insanity. I used to be able to sleep fitfully, my brain having expelled its contents towards some kind of goal. The spark kindled into something useful, or at least interesting. Now it seems that my subconscious would rather let me know of its boredom via exceptionally vivid dreams casting me as a red bearded samurai or watching a show about a college based super hero that gets around by way of slip and slides. It's gotten to the point where I go to sleep and wonder what I'll watch tonight, and if I'll wake up amused or shaking.
Methinks that my Iron Lung needs to go away, else my spark ignites and consumes me with it. What worries me the most though, isn't the dreams, its the idea that given time they may just stop. I've taken to thinking of mechanics and concepts in my head. I've also started reading Making Magic, a column where the Lead Designer for Magic The Gathering (one of my favorite games of the last 15 years) talks about design and the principals of it. It's knocked Penny Arcade out of my go to first internet spot for Monday.

Since I haven't mentioned it yet, Star Frog Games has a new website. There was some stupidity involving hosting that I'm sure nobody cares about. The new site is template based and doesn't look like ass. I've taken to actually showing people it instead of just using for an email address. I'll probably figure out how to post all of this, there and then we can have a single website for everything. That would be cool I think. Also since it's based on a template I worked out a way to have the site have multiple templates. That means that when it's working we can have custom pages for The Thief's Tale and Paper Zeppelin and anything else we build. I'm already thinking of making the page art match the games themselves, so construction paper pages seem like a possibility at some point. Or I'll forget all about it.

I've been playing some games recently and I usually will comment on them as I play them, but I didn't want to put up stuff about nothing, so I;ll just go through them now.
The Forgotten Sands is the new Prince of Persia game. I liked it, the combat is still not terribly good and the story was kind of an excuse. I mean, you can't have character development when the character is already established in the bookend games. The platforming is still ducky though. Oddly, and this may be the radical view, I preferred the last one with the talkative Prince.
Okami was awesome, and very long. I played it on my Wii, and the brush just worked (more or less - stupid straight lines). It's like a Zelda, this is true, but without all the Zelda crap in it. Free of all of the tropes, it was free to do what every Zelda game since Ocarina has been trying to do. It's like Batman Begins in that way. Although I'm ripped apart by the sequel. On the one hand, I don't think it needs it since the story was tied up all nice. On the other, I so want a plush Chiburatsu, but I'm kind of a whore for merch.
Finally, I'm currently into Alan Wake. I usually don't play these kinds of games since the things that go bump in the night give me the creepies. I mean, games are usually power fantasies and making the player afraid of everything seems to defy my, "Make the player look cool,," game philosophy. Wake has these downright well designed mechanics. The flashlight is the first, mostly because it points where you point it with the stick. So when it's really dark and you're spazing out, the flashlight light spazzes too. Every shadow begins to look like something then. If there are enemies hiding in the darkness, the spastic movement of the flashlight (so you can see) actually makes you more screwed. I love that synergy. It's like the game is telling you to try to stay cool, and then doing everything it can to deny said cool. Oh, and the pages are ridiculous. They're hidden in the darkness and tell you what's going to happen, so you quickly become a junkie trying to find them, since the fear of the dark is the fear you know. The fear of the truly unknown is a different beast altogether.
After playing Alan Wake, my dreams always have a flashlight in them.

Yes, the thing that keeps me from doing anything cool is still hung around my neck like a monkey. I am trying to stay positive. I really am. I promise.

We are grateful for our iron lung...

Wednesday, August 18, 2010

Quisnam Partum Intentio?

Let's get this right out of the way, and then I'll get into my post (It seems that my absence hasn't taught me how to start one of these things correctly, oh well). The bit that is keeping me from laying down sweet, sensual Paper Zeppelin code is still in effect. Which burns my insides with a sickly fire.
Further, I have 2 things I want to talk about, but can't. The first is that maybe, I may be onto something approaching Exodus. If that makes no sense, it's a continued theme that I use when referring to a very specific circumstance. Read the other posts and come back. This one probably won't be going anywhere. Probably.
The second has to do with Thief. I've recently received an offer regarding certain aspects of the project. Mostly having to do with an unlikely amount of infused talents. I think terms like, "Full force," and "studio," may have been tossed around. The caveat is that these forces could not be mustered until November, which would torpedo IGF. It's an odd position to be in.

Alright then, the titles. It's Latin (duh) and means, "Who Creates the Designer?" I've been doing some talking recently with game types, and its an almost common thing to say, "Nobody does design." "Why is that?" I wondered. I mean, in my mind, who wouldn't want the Captain's Chair? So I got to thinking about it, and I was thinking that people don't want to be designers.

The reasons it seemed, are easy. A designer needs to understand everything. All aspects, all mechanics and how everything fits together just so. The other jobs have an easier time, they only need to understand their part of the game. An artist can focus on making sure that their art is the best that it can be. Sure they need to understand how what they are building will affect the theme of the world, but that's the extent of it. A programmer needs to understand how the code functions, and even how the entire codebase is structured, but that's all they need.
It is this view that leads many non-designers to argue that "Everybody is a designer." I hate that to death. I call it the Syndrome Argument. To paraphrase, "If everybody is a designer, nobody is." If you made a painting and had a dozen painters paint their own part the way that they wanted to, you would have a painting that made no sense at all. The designer is the person that makes all that work.
However, I don't go so far as to argue that a designer is an auteur. That's stupid. The designer is not an "Artiste" and they certainly shouldn't be a tyrant. Show me a game where the Designer-That-Would-Be-King ruled with an iron fist, and I'll show you a game with no features and magnified flaws. No, the role of the designer (and the reason that we need on in the first place) is to be a giant filter of ideas. Consider them a Blue Whale, swimming through the ocean of pop-culture, retro love, classical works, history and the millions of other ideas that float on by. Now imagine that they strain all of that zeitgeist through their massive baleen teeth thingies. Picking out the sweet sweet candied ideas and spitting out the Dorys. Considering how those new ideas could function and discarding them if they don't.

So it seems it takes a special kind of insanity to want to do that. I am beginning to understand people that say, "Oh I don't want to be a designer." What still makes me want to kick guts are the people that say something to the effect of, "Oh, being a game designer would be so cool! You know what would sell a billion copies? Make Halo, only add jetpacks and flamethrowers! Oh, and give it cool stuff like Call of Duty for multiplayer. Wow, game design is easy, I'm going to go sit by the pool and drink Mountain Dew." If raw loathing could be harnessed, I could provide power to the entire West Coast from one such conversation. Provided I didn't go all Nitro first.

Anyway, I seem to be getting off track. Here's the more difficult question then, why in the seven hells would anybody want to be a designer? For me, it's the same reason that so many specifically don't. I like it when confronted with a large interlocking system. I like it when the parts interact and adding something in just the right amounts can change that fundamentally. I like pushing buttons and doing thought experiments. I like constructing entire worlds starting from nothing. I love discovering an interaction that I didn't plan for. I adore that what I do is create fun.

I get knocked down, but I get up again, you're never gonna keep me down...

Saturday, June 26, 2010

IGDA

So I'm walking out to my car wearing the nicest casual shirt that I own while also rocking the hipster flippy floppies and socks (the kinds with the grey toe even) since my shoes were planning to rendezvous with me at the auto. I'm well onto my way to my first IGDA meeting. Previously I had been a member - I even have a card with my name and everything. I had joined thinking that I could meet new people that have jobs. I think I had mentioned in a previous post that something crazy like 80% of game jobs are not listed anywhere, so I was off into the wilds to see what I could see. Of course I had to drive across the county to see said, um, "see." Which is what I was doing once I had met up with the previously mentioned footwear.
Once they were again lovingly and securely wrapped around my feets, I was on my way at speed. This was ironically my first IGDA get together. When I was a member before I kept waiting for a meeting to come up, so I could meet new people and stuff like that. Well, an entire year passed before anything was even mentioned, and I let the membership, to the cool club that never met, lapse. Which is why this card carrying member of the International Game Developers Association, has a card that says both student, and 2009. I mean, when the whole point (in my eyes at least) is to be introduced to people that may know people that I too may like to know, and then you never get to meet anybody, there really isn't a point.
Either way, when I did finally arrive, it was a modest meeting. The San Diego Chapter of the IGDA was, for all intents and purposes, dead. I mean, flatlined like a Hacker that failed trying to crack black ICE. It started as a smallish group and then slowly grew into a moderately small group. The turnout was interesting.
Mostly, because as a self described "Indie Game Designer" I seemed to be the people that people wanted to meet. Odd considering. Lots of artists, background artists, modelers, people that refer to The Art Institute as "AI" (which is confusing to programmer types) were in attendance. Most of them knowing each other from their normal jobs that didn't have much to do with game development. It's a feeling that I can appreciate on a basic level. Lots of other types too, which seemed to do something tangentally related to gaming, but not. Several programmers in attendance, just happy to code whatever for a living, and not really wanting to throw themselves into the boiling pot that Game Programming is.
I did get to meet some people that I am now Facebook friends with, which is nice. Another, when asking about what I'm working on (which by the way, is the cool question to ask - "So, what kind of projects are you working on?" It's like at college, "What do you want to be when you grow up?") told me about a friend that does all kinds of 3D work and is looking to do stuff for their portfolio. Quality character driven stuff. Emails were exchanged, and I think that it may lead to good things. If nothing else, they know other people that work in small groups. Things may get around to happening, or maybe not. Either way, it's nice to be able to find out.

In development news, ahh, right. I know, I shouldn't, I promised, but all I really did was change the name of two files and play. That's it. I swear. I don't count that as really developing anything. No lines of code where typed. It doesn't count.
Anyhow, the Cliff music works. The Composer really came through on that one. He created 2 different versions of the same music - a somber, and a hectic Cliff Theme. Separate, they're pretty good, but when they are put together, it just works on such a fundamental level. It's really very pro. I haven't scripted the music cues yet, but just with my keyboard shortcuts, they're seamless. It's so nice to know that the level that gave me so much trouble is really coming around to being one of the best.

Monday, May 17, 2010

Defiance

Yep. It's been a month. Well, longer than that actually. A month and a couple of extra days since the the thing we'll just call the "shenanigans". Not too much has changed really, and this update is more to have something, anything really, to let out some of the steam just before I break down like an old boiler.
On a basic level, I've confined myself in a device of my own making. A device designed from the ground up (which is what I do) to make me as uncomfortable as possible while simultaneously making myself useful at every opportunity.
The more, astute readers (assuming that any are there, which I continue to doubt) could probably figure out exactly what my problem is at this point, but I still refuse to divulge the nasty bits. This is not the forum for self pity or anything even resembling it. Instead, as the last couple of hundred things would show, it's full to the brim with my own odd wit mixed in equal measure with the deep insights into the price of failures, and the staggering aura that success can bring. Set backs of any variety exist only as obstacles that get dashed, usually within 1-2 posts. It creates a kind of episodic nature to this particular diary that I continue to find endearing. but there I go again, getting all self important and assuming that my words have any value, to any one.
It's always a danger when you're talking - the thought that your words are important because they came out of you. Falling to that particular dark side is a sure fire way to be a terrible assed writer. I don't care who that writer thinks they are. Once they stop thinking that they have anything to prove, they've failed.
Anyway, it seems that once I step away and then return to our regularly scheduled programming, that I get all excited by the prospect of writing at all. So please excuse my hubris and my dust. I think I'm getting to my point (finally).
Anyway, back to the device. It works like this - creating games, brings me joy. Thinking about the way that they work, it makes me happy. Designing them is stimulating in ways that illicit substances could never be, since I am the driver of it, not a passenger. Programming, for all of my vocalized hate, is the means to my end. It also tends to make for the best short victories.
So, I am using my own nature, against me. Basically, until I get the new thing sorted out, I have forbidden myself from writing about, thinking about or working on any of my games. The only caveat, is that I still chat with my team members so they know that I'm not dead in the proverbial ditch.
Instead I fill my days with nothing, with nonsense. With a dozen little mindless things awaiting something, anything really, to happen. Acting as a fisherman and hoping, waiting, for a catch.
This is not a place where I complain. Nor is it a place where I tend to wallow in my own self pity. Usually. Today, I'll indulge myself with but a single sentence. It goes like this : I cannot remember a time where I have been more unhappy.

But here's the thing, and this is the important part, and the reason that I write this particular entry today, I've never had more of an understanding of exactly what it is that I want, and specifically, what it is that I am. I have created a space where I have denied myself something, the one thing that brings me the most joy so I can continue to live. To me, it's not just a thing, but the thing. It would be like if you banished a Chef from the kitchen, or told a Musician that they cannot play. I have taken from myself, if only temporarily, the thing that brings me both joy, and it seems, meaning. I keep saying that I need to do this, so I can get back to work. Everything becomes the means to that end.

So, now we're getting back to the titles you see. I've said it before, and I'll continue to say it for as long as I can speak.

I am a Game Designer. Nothing will ever take that from me.

Wednesday, April 14, 2010

IndieCade

First things first, that cool row loading thing that I talked up yesterday, well, it works now. Unfortunately for you dear reader (*scoff*) it went off without too much of a struggle, so I don't seem to have a colorfully worded story to go with that.
Actually check that, I'll make one up. Assume that none of the following things are true.

So I was sitting around my house watching The Life Aquatic when suddenly, the President of Mexico runs into my house. Frantic and sweating he pleads in surprisingly good English to help him. Apparently kidnappers are after him, like in Man On Fire, except these kidnappers (presidentnappers?) are also members of Al-Quaida. Big ones, since they have mug shots on those stupid novelty playing cards that were all the rage years ago when anybody gave a deuce.
Seeing that he's in trouble, I throw on my flippy floppies, turn in that slow way that both action heroes and strippers use to great effect, and say while tightening my bandanna, "Mr. President, come with me if you want to live. Afterwards, you can buy me taquitos."
I then flip up my couch revealing my giant hidden cache of heavy weapons and samurai swords. Naturally, I pick Daisy, my samurai sword with a machine gun in it. Oh, you see those all the time, so I won't bother you with the details of how it works or looks. Just know that it's not just the coolest weapon ever, but quite possibly the coolest object in the History of Stuff.
So out into the street I ran, flippy floppies making that great flip and the occasional flop noise. Of course, I didn't really hear to much since Daisy was busy turning terrorist kidnapper card Texas style Hold'em into a game of 52 card pickup. Except with blood, and awesome Wes Carpenter synth music, like what Snake Plisken kills to.
Soon, I find myself standing atop a heap of the misguided and the Lost, holding a smoking Daisy. Somehow a half naked woman appeared and kneels at my feet. It's very metal. All of the sudden, one of the terrorist kidnappers reaches up with his last breath and only working limb to shoot me, treacherously.
The President of Mexico looks on and I bleed out, and says, "Thank you for saving me! You are a national hero." Or something like that. I wasn't really paying attention, cause getting shot hurts like crap man.
When I awoke, I was in a dark place, surrounded by stone walls. Ramones flavoured Muzak was piped in from hidden speakers on the walls. Then, as if by some kind of magic, a Man in Black appeared.
"Am I in Space?" I ask.
"Nope," he replies. "I've just found that a black suit is more appropriate than a cloak. I could change."
"Nah," I reply casually, "It works. So, like do I get a challenge or something?"
"Shit. I hate The Seventh Seal. I hate it so hard. Do you have any idea how hard it is playing Twister in a robe?"
"That would explain the suit."
"Alright," he says, checking his watch. Oddly, it's digital; One of those cheap ones you can get at the fair. "I've got time. Well, more than you anyway. What'll it be?"
"Programming. I don't know if you read my blog, but I'm fuggin Li Mu Bai."
"First of all, nobody reads that self indulgent crap. Second, programming isn't a game."
"Deal with it. My choice, my mortality."
"Fine," he replies, and summons up a couple of computers. Death it seems, owns an iTablet. I always pegged him as a Linux man myself. In any event, he gets to coding on it and I get to coding on my laptop. When Death codes it looks like Matrix rain, except as done by emo kids, so it's all full of AFI logos and skelanimals. The ground shakes with his mighty coding prowess, probably like when John Carmack codes.
Soon he's done and holds up his design. He says, "I read your blog thing. Crap man, does everything need that much text? I mean, seriously you write twenty lines of code sometimes and then crank out 1000 words of soliloquy and self fellating nothingness. Anywho, I got your stupid text file reader thing to finally work. You're welcome. Now give me your soul."
I reply, "I but you haven't seen what I did."
"Fine," he sighs, "what dumbassed thing did you code?"
"I coded a way for Daisy to be remote controlled."
"Eh?" was the last thing he said before Daisy did that machine gun katana thing that it does so well. Again, we've all seen exactly what a remote controlled/AI katana machine gun does to a incarnation of mortality, so I'll spare the mundane details. Afterwards I stepped over the still warmish meats and copied Death's code to my flash drive.
I then left Death's domain and took the bus home.

-In something completely different. I've discovered IndieCade, another Independent game show. It has a deadline of the first of June, which gives me like 2 months to get a project done. I'd like to say I can have Thief done, but without steady animators, that's going to be kind of a trick. So unless I can think of something, I'm going to try to get Paper Zeppelin into a playable state for the event. The really cute thing about IndieCade, is that if you are in the final group, then they show your game at E3. I'll repeat that for emphasis. They have your game in their booth at E fuckin 3.
I'm of the mind that borders on the incredibly cool. I'll see what I can do with it.

- This post, is just a little weird. You see, I started writing it about 5 days ago, and never got around to posting it up. I could go into the specific details, but I won't bother here, because nobody cares and I certainly won't in few months when I get back to reading it. What I did do was write a different post, that I titled Call Me Ishmael, but that one will probably never see the light of day. Just know that it was full to the brim with self loathing and defiance in almost equal measure.
What is of note is the IndieCade thing I wrote right above. Even though I wrote it, and I fully intend(ed) to do that, I'm no longer sure if I'm in a position where it would even be possible. My hours suddenly taken up by far more pressing matters, mostly involving starvation and/or homelessness.
So before I get back to doing any kind of hard core (or even soft core for that matter) coding, I need to get something else that's not even tangentially related covered and working. Sooner, rather than later.

This is my serious face.

=|

Patience is just another word for getting old.

Monday, April 5, 2010

Solution Set

Paper Zeppelin continues making progress. I spent some time over the weekend getting the rest of the level loading system to work and learning about how to both look and and update table information in C#. It's an interesting thing really. The idea is to have each "row" in the table represent a "row" of objects in the level. That way I'll be able to calculate out starting positions based on what row in the table the information is in. So, say there is a plane icon on the first row of the table. When the system gets to reading it, it'll see that there's a plane on the first row, so it'll spawn the little beastie right at the top of the screen. I think it's adorable, and will allow me to make very fast level changes when I need them.
I'll keep at it, since the next step after this is gameplay testing. Then I'll be able to see if my carefully crafted design holds up, or folds like an origami crane. Excitement abounds.

- In other random crap, I've figured out a solution to the problem from the last post. The issue was, given that both the levels will modify themselves on the fly (given clever use of the characters) based on the number of players and I want to branch levels based on performance, how do I allow drop in and out gameplay without somehow screwing the progress that the players had made? I mean, if 1 player played a level and did well and another player jumped in at the end, the 2 players would have success equal to 1 player's worth of skill - which would be a failure.
The solution, has to do with the total number of spawned versus destroyed enemies. So when an enemy is spawned the game will add up a counter for the Total Number enemies. When an enemy leaves the screen the system will euthanise it (so it doesn't take up memory while being lost in space). When it gives the off screen enemy the final mercy, it'll add to a different counter for Escaped enemies. At the end of the level it will calculate the ratio of spawned enemies to escaped enemies, which will indirectly tell me how many enemies were destroyed by the player/s. I could even stick this ratio in the corner to let players know in real time that they're doing well.
The clever bit (I think) is that if players join the game, the level will dynamically update the number of enemies spawned. If they leave, it'll also dynamically adjust. Further, if 1 player is to the end of the level and another player joins, it has zero affect on the progress made. So the players would then be able to continue to the more difficult branch of levels.

- Speaking of dynamic levels, the design document mentions it, but doesn't go into how it works. I'll fix that for those of you at home. Basically, different characters in my level data will load the same enemies. Take this example:

"......11....22...33...44"

The periods are there to represent empty air. I could use spaces, but that's a lot harder to read and line up than you would think. In any event, if only 1 player is active, the game will only spawn the enemies for the 1 characters. If there are 2 players, then the 2's will activate too. So if 4 players are playing, then it'll activate all of them. The enemies that come up will all be the same, but I'll have fine control over them. The best thing I like about it is that it allows me to do stuff with the single player. So in the doc it says that having the Bomb affects your shooting and speed. So if I have fast dive bombers come in, that's kind of cheap. So I can set the single player to not have those right after the bomb is picked up.
In multiplayer, I very likely would want those enemies to require the players to work together to protect the bomb carrier.
In either case, I could probably use the same thing to create difficulty settings, but I think that's missing the point. I plan the use the extra settings not to make the game harder, but to make it different on a fundamental level.

Thursday, April 1, 2010

The Word

Boy was I up late last night. I was chasing the ability to read letters in a word, and I was so close for so long that I kept on hounding it. Now, I have it. It's not all the way built yet, but enough parts are dancing that I can get the code to summon up an enemy based on what the letter (or character) is.
Still haven't figured out how to load the thrice damned things from a separate text file, but I've got it handled well enough to move on and start prototyping. Basically, each level will be made up of several lines of text, great big words that'll summon up everything in the game. A short sample may look like this :

"......<..<..<....@"

See, that doesn't look like anything. But the computer knows better. So after a set period of time I'll ask the computer, "What's the next character in the Word?"
"It's a '.'" it'll reply.
"So what do we do with periods?"
"Nothing, cause they are empty sky."
Then I'll congratulate the computer and give it a cookie.

Eventually I'll ask and it'll say, "There's a '<' thingy. So we should make a plane enemy right?"

So over the course of the level the system will do this a couple of hundred times if not more. Always move to the right and propagate the levels will all kinds of Class Based wonderment. If I add a little thing that makes all the "stationary" stuff go to the left slowly, I've created a scrolling environment. It's a very good thing.


- I'm discovering that knowing enough about C# to be dangerous is only half the story, if not less. For some time the system kept telling me that files aren't where I said they were, and I told the system that it was a liar. Other software that I look at for guidance (and the occasional reverse engineering) referenced the files the same way I was. The system, was simply wrong.
Turns out, I wasn't being polite. Or rather, I was making some kind of formal / informal faux pas. There's some little command that I could add to a file set, that would allow me to reference stuff relatively. So instead of C:/ProgramFiles/CSharp/Loot/stuff.text I could just say Loot/stuff.text. If I went through the right hoops. It also gave me rage when it demanded that I do something special so it wouldn't get confused by the '/'s.
The thing is, this comedy of manners only exists because the things are too basic to ever talk about. It's assumed that if you are a programmer, you should just know these things. It creates a certain kind of unease. I mean I add things, small things, and compile the code just so I know I didn't make a mistake. It makes for slow going.
Eventually, I'll be fluent if not at least conversational.

Wednesday, March 31, 2010

Super String Theory

Right off the proverbial bat, I still can't get the C# compiler to notice that I have a text file that lives among the code. It won't do it. I spent the better half of an hour researching importers and loaders to no real avail (although now I know the theory behind adding 3D models and meshes to a game). In an odd kind of seething fury, I hacked the loading functions right out of the code and assigned a string of letters to be looked at. Then, it almost worked.
So basically, I skipped a step. Before I tried loading a text file, taking the contents of that file and making them a string of letters/numbers and then I tried reading that string. No, I just told it what the letters are supposed to be and had the computer read that.
That breakthrough however came just as the promised drowsiness of Tylenol PM kicked my brain into lizard mode . So I have an idea of how, but now I still need to apply. Provided I can remember of course. Either way, it's part of the larger goal of reading from text. So if that works, I could add a bit later to fetch the data from someplace else. If it doesn't, I could always just assign the variables in the code itself, which is also text. That's a win regardless.


Usually I don't post half finished theories on the diary, and today is really no different. The real reasons are:

1) Look at the site! It's so clean now, and uses pages even.

2) If you look at the little box that I've called "Re-Sources" you'll see a lot of the stuff from before. (although by the time anybody reads this, I may have changed my mind and called it something else)

3) You'll notice that the design document for Paper Zeppelin is up, or at least the parts I have done.


Couple things to notice if I could direct your eyes yonder. There is no Break Point listed. It seems odd that I would wax philisophically about it and then not include it. I got hung up on an issue before I could add it. Issues, I will add comments for in purple. Right now I'm having a design issue regarding player progress and how I can combine a drop in and out style of multiplayer gameplay with a merit based system of level advancement. That will make no sense unless you read the thing.
Next you'll notice that it's really quite short. The Thief enemy defense AI was longer than this. That's because PZ uses very few mechanics, but they're integrated in a way to cascade the mechanics together. The pieces all link together somehow, so my short design and limited ingredients is set up to create an assortment of emergent gameplay. At least, I hope that it will.
Finally, there's no numbers in it. Everything is described (at this point) in relative terms. Numbers are the most variable of variables, so there's no point in trying to make them concrete, especially at this early stage.

Someone out there, assuming that they read this (which I doubt, seriously) may be asking, "Why would you put your work up for someone to steal it?" The answer is simple - it's worthless. That's not quite right, it should say - it's fuggin Worthless. Ideas are crap. Garbage. Even basic designs and documents aren't worth the digital paper they may or may not be written on.
"No," the people cry, "ideas are powerful and wonderful and rare!" I'm sorry to burst the bubble, but they're not. For some people, they may have a good idea once or twice and hoard it like the Gnomes of Zurich.
Others, get ideas all the time. I have lots of ideas. They float on through and sometimes they get caught by my brain. Others float right through and are discarded. But I'm not most people. I'm a designer of systems and a prolific writer of prose. I decide a dozen ideas are crap before I leave my house in the morning.
But it does lead to the point, the only thing worth anything is doing. If Founders just had an idea for a Declaration of Independence it doesn't mean anything. They have to do something with it. Further, it's the act of doing that will shape the outcome. A single idea can be taken and made into different things based on who does it. So like, The Thief's Tale is based on the idea of the original Prince of Persia (oddly, a game I had never played). Obviously Jordan Mechner based his game off the same idea. Our games are quite different because of the people making them.

To wit, here's a list of ideas for games I have cooking in my head at this very moment. Some I may have mentioned here, others have never been and probably never will again. They are, in no particular order.

The Thief's Tale - We know about this one. You can play it over there =>
Silver Knight - Side Scroller Action Hell with inside out storytelling
AeroKnight - Tactical RTS featuring fantasy airships.
Legend - A cycle of games featuring downloadable content. 3D action with destructible environments and physics.
SHADOW - A stealth spy game featuring characters with different skill sets, set in a Renaissance world.
The SHADOW TCG - A TCG based on the above property.
Thrae - 3D shooter focusing on Action Movie tropes and basing the mechanics off of them.
Sword of the Slayer - 3D weapons based fighting game (cancelled)
Paper Zeppelin - 2D sidecrolling multiplayer shooter.
The Star Frog EP - The first "Game Album" - mechanics based on Time, Loss and Failure
- Track 1 : Inevitability
- Track 2 : Time
- Track 3 : Entropy
- Track 4 : Fatalism
SF : Learning to Smile Again - The second "Game Album" - based on Love, Hope and Freedom
Psi-Kye - Metroidvania with psionics, physics and multiplayer.
The Adventures of FlyBoy - 3D flying game featuring a would be superhero.

These are just things that I happen to have written about. Some (like SHADOW) have extensive background that I've worked on. In the case of SHADOW, it's also a comic book script I've developed.
One of them hurts a little, but I'm happy for it. When I was young I played a lot of Street Fighter 2, and thought that the game would be better if I had weapons. Oh, and it should be 3D. Virtua Fighter was 3D, and it was so smooth and pretty. I called it Sword of the Slayer and I designed a dozen characters, wrote out move sets and drew a ton of pictures (I was like, 12 so I had lots of time). I even had the idea of making the female character the "heavy" - slow and powerful.
I set it aside and got thinking about other stuff. One day I was at the local arcade and they had Soul Calibur just sitting there. It was almost exactly the same idea that I had, and executed so perfectly that it brought joy. I then realized that my game, would never be this good. The idea executed too well. Namco had simplified and streamlined, balanced, perfected it. So instead, I played the hell out of SC.
My idea was good, but the doing was the important bit. I'll always remember that, and then get back to coding.
So yes, I share all of my ideas in one way or another. I mean, seriously, how many thousands of words have I thrown at internet describing my ideas? So here's an idea - take anything I've written above, and make it. I'll do the same. We'll see how different those seeds will grow.

- I had once regaled with the tale of chatting with the dudes from PAX. I think it's here. I came across something this morning, and had the weirdest feeling. At PAX East, they had an indie area. Not just the PAX 10, but an indie area with booths and stuff.
I'm not saying that I had really anything to do with that, but maybe just maybe, the meme got inserted and rattled around a bit. Maybe when planning the thing it rattled back to the fore.
Else maybe I was one of a legion of indie developers that have posited that same question. One more straw onto that particular camel.
This year, I'll tell them that their booth should have cookies...and blackjack.

Tuesday, March 30, 2010

Dead Letter Society

Nope. The title doesn't make any sense today, and it probably never will. I'm pretty sure that nothing I'm about to write will get us there in the round-a-bout way that I frequently use either. It seemed like a good idea at the time (which was about 35 second ago). The less said about it, the better. Let's move on.
Music is all installed in Thief now. Well, not all installed, but everything I have is in. The music plays when you start, when you play a level and stuff. It gets quiet when you pause (which is pretty cute really). It also pauses and restarts when you die, with the adorable little, "Ah, I bet that hurt dinit?" doom music in the middle. Finally, the little dolls also trigger a similar, yet happy jingle to play to let you know that you've done something right. Now that it's finally working, I'm rather quite happy with it.
What I want to rip like a TPS Report is the other thing. I'll call it that for now because I have both Fear and Loathing for it. Like I mentioned before, the basic class structure of the thing that will one day be Paper Zeppelin is all finished. It works, and the parts of the design that should interact, do. At this point, it's quite easy to add things to that structure. I could use my time and make what would seem to be "good" progress by filling out the rest of that structure and then making the load engine work. I used quotation marks around "good" because I mean "stupid." The loading engine will be the thing that conjures up the different class things. They require it, and they'll rely on it for the game to work as anything that resembles fun.
So, I could go through and add the rest of the little dudes and add 4 player support and all of that, but unless I can get the game to read my levels, it amounts to about zero. So, I felt an experiment was in order.
I set up a quick new program (having learned from The Thief's Tale that doing experiments in the main code is a bad idea if you can avoid it). It this program, I created a text file with some numbers in it. I then researched (which is plagiarizing from lots of people instead of just one) the function that will read a text file and can assign bits to variables. Then I told the screen to change colors based on what that number was. The theory says that if it's working right, it should sparkle in many colors like Josephs coat. Ah, wait, I hate bible references. I mean to say, "Like Saruman of Many Colours' Robe." That's better.
Either way, it didn't work. The color changing thing works cause I tested it all by itself. The biggest problem that I'm struggling with is that it could not find the text file that I had added to the rest of the program files. It would simply say, "I don't know what you are talking about, because you are stupid." So I went to an example and set up my program exactly the same way and got the same answer, which is stupid because to my eye, the are exactly the fuggin same. Yet the other one works without issue.
Finally, I got a new error, which is a kind of progress really. It said that there wasn't anything that could interpret the text file. I'm not sure what the hells this means though. But if I'm ever going to get this working I'd better get started figuring it out.

- I had mentioned in a previous lamentation a somewhat lofty goal of producing a game in a matter of a month or so. The intent there was that if i could do such a thing and do it consistently, then I could conceivably do just that for a living, and make games full time. There's a odd mix of unease and glorious freedom there. However, since I don't have the requisite 10 hours a day to invest yet, a goal for this project was to see how many hours it would take for me to put Paper Zeppelin together.
Obviously, it's taking a long time. Although I kind of expected it, and I'm no longer sure that it'd ever be a good model anyway.
The first reason is the biggest - I didn't know anything about C# when I started working. I've made some staggering progress since I've started, but I not yet ready to call myself a programmer yet. I know that I'd be far quicker if I knew more about the ins and occasional outs of the language on a higher level. I'm even considering taking a formal class on the subject now.
The second, makes more sense the longer I do this. Classes, by their nature, are portable. This will make all of the later projects go much faster because I will already have the basic block to work with. For example, in the next project, the EP, out of 4 games 3 of them are shooters of some kind. Collision detection, bullets, enemy AI structures, all of that can start with what's already in Paper Zeppelin. I'll be able to get a working thing that I can iterate on very fast. I'm talking in a manner of days if not hours. I'll give you an example. Once I got the basic enemy in PZ working, I was able to copy most of it wholesale, make some small modifications and get bullets working. That was in the game in about 10 minutes, and I could do it faster now. Making them work correctly is a different matter entirely, but the theory holds.
So basically PZ is taking longer than I would thing most of these projects would take, but I'm still convinced this is both do-able and positive.

- Finally, for those of you chomping at the bit (Readers? HA!) to get your hands on some Design Document, it's still in the works. The biggest issue it that I could sit and write with my limited hours, or I could code. Right now, the coding seems like a better use of my time when I'm home. So the design document (and the development diary) get written when I have time at a machine that isn't in my Fortress of Solitude. I'll add it soon-ish. I'll probably also use that opportunity to spruce up the blog a little, and add some more pages. Less stuff running down the side that way.

Wednesday, March 24, 2010

Mix Master

If I could hate things to death I think I would, probably way too frequently. Could my evil eye increase in potency enough to cause harm to things? That would be good.
Actually, that would be bad. My laptop would have a 40 caliber glare hole through it by now. A smoking void that would probably increase the air flow through it. Yeah, it's probably best that I can't hate stare something to harm.
In any event, I figured out the stupidity of the program yesterday. The loop only wanted to work if I put graphics up. I don't know why really, but once it functioned I was able to make progress. I discovered that I can have Sounds and I can have Channels. Channels are made up of sounds, and exist in a 1-1 ratio, so I thought that they were interchangeable. It turns out that they aren't. I don't have finer control over channels, just different control over them. So I can pause a channel, I can only stop and restart a sound. I can alter the volume of both, but the volume knob on sounds seems to be broken. I can also pan both, and again, only channel panning works worth a damn.
So now, all the music is a channel. 2 channels actually. The normal music and the other is a different tune. So I set these up with some music and assigned a little switch, so if I make The Thief duck, it changes the channel playing. So I can switch back and forth between them on a whim (using something other than ducking obviously).
This new knowledge of something that works will also allow me to add working functionality for positional stereo sound. My new tricks will make the game that much more Pro. I'm happy with them, although I fear that the new ability to change music dynamically, or mix songs together may be giving The Composer some worry.

Tuesday, March 23, 2010

DJ Zero

Well I wasted an hour yesterday. I had but a simple goal, to install a crossfader into the sound code for Thief. Instead I got to bang my head bone on the wall for 60+ minutes and have nothing to show for it but a headache and the evaporation of a couple of brain cells.
The idea was basic enough. I was thinking about how to make the music work really well in The Cliff level (see the last post), and I remembered playing DJ Hero, a game I suck at by the way. In it, the player uses a little switch to set the volume of the right and left records into the speaker. So move the little knob to the left and you hear more of the left record and less of the right. So if the musics line up, you can combine them into a different thing altogether. A "Mix" if you would.
So I thought, "Hey, let's play 2 music tracks at the same time and let's make the volume of each a function (used in the mathematical term here) of some other variable. So let's have one be that, and the other be the inverse." The thinking was, if that number was between 1 and 0, then having the variable be set to 0 would be all of one track and none of the other, like pushing the little knob all the way to the left on a DJ Board. The 1, would be all the way to the right and anything in between would be a mix of the two.
Having done some tests on it, it worked out pretty well. At least in theory. I don't have musics that match, but I could get 2 things to play at once.

Then the whole thing was shit.

You see, I then tried to make the twice damned thing controllable. So I installed a little bit into my control code that would allow me to modify that Crossfader variable, and...nothing. It didn't work. So I told the computer to tell me when it was running the code I had just installed. The conversation went like this:

"Hey, computer, are you running that code?"
"What code?"
"The code I just wrote. It's right next to that other code you just ran."
"No it's not."
"No, really, it is. Could you look again?"
"Why?"
"Because I asked?"
"Wait, what are we talking about?"
"The code. Remember?"
"I like kittys."

That's exactly how I remember it anyway. So, like a good little code monkey I copied the whole thing over to a new program. Thief has like, 12000 lines of code, so maybe, just maybe, something else was screwing the pooch. I hit the "Go" button and:

"Hey, no problem now right? I'll push the key for you."
"..."
"Computer, did you see that key?"
"No?"
"Are you asking me?"
"Nooo?"
"So you don't think a key is being pressed?"
"No."
"Really? You're doing this to me? Now?"
"MMmmm...panda cookies."

So I cut the sound code out of the code I was writing. Now we were reduced to just loops - the basic building blocks of almost everything in a computer system. The Bread and Butter that keeps a coder coding, although less oily. So with that done, I mashed the keys, hoping for any sign of intelligence or life. Instead the loop just ran, oblivious to the outside world until I gave opened my razor and gave it the Sweeny.
I'm not sure yet exactly what happened, but I managed to swear a whole lot before I went to bed in a hazy anger, a kind of half hearted digital blood lust.
I'll try again later. Although now I have a crazy jones for those chocolate panda cookies, you know, the ones with the little pandas (or koalas, if you're into that) doing different jobs. I wonder if there is a Code Panda, they'd be the ones with the laptop and the furious eyes.

Monday, March 22, 2010

P's and Cues

The Cliffs Level, I know that you're sick of hearing about the Cliff Level. Well, that statement is assuming that anybody reads this, or cares, or even remembers really. In any event, I got something finally working correctly. Recently, I've been getting a lot of very high quality music from our resident composer, and I've been putting it into the appropriate game places and it's really quite nice. With the art in various states of completion, having the music in and done really provides a kind of cohesiveness to the thing. However, the one piece of music that I've been very hesitant about it the music for the Cliffs Level.
If you look way back, you'll see that the design paradigm for that level was to make it tightly scripted, with a ton of invisible switches and deformable areas. It's easily the most complicated level in the game from an art, coding and music perspective. But now I've a solution.
The idea here, is to have different music cue up at different times. I could have a single song, but then I really do think it'll lose the impact that it should have. It could be upbeat and perilous, or somber and cerebral. I'd rather have both. For most of the areas I really do want to have soft, almost quiet music that ramps up into something more, um, robust when certain things are happening. The problem with that from a composing perpective is that none of that will happen at set times. I can't say, "Oh, and there's a boulder sequence at 1:15 seconds," because the player could play it at a different speed entirely.
Which is the issue I tackled yesterday like a roided bull. The solution as I see it, is to write 2 different pieces of music with the same timing that could be played at the same time. So they could match in most things, but one would have a lot more stuff going on, and louder, What I'll do is start both pieces at the same time, but have the loud one be turned off to start. The scripting will cross fade from one to the other as I need them. So like the boulder sequence will trigger the a volume increase on the loud music and a decrease/mute on the quiet one. Afterwards, it'll cross fade back. Using some test MP3s, it's working as a system so far. Although I get the impression that this may take far more effort than it has.

I also discovered something yesterday. Blitz Basic is very, very easy to code in. Especially if you've been wandering the C# desert for the last month or so. A little bashing and online command look up and I got the solution that I've been looking for since I started the Cliff Level working in about 5 minutes. It's as if I'm thinking of things a little differently, more abstracted.
I'm reading Snow Crash, and I came across something a little off putting. It posited that when you learn to code, or I assume learn a language, that your brain changes the way it thinks about things. The meat starts to change itself and create new pathways, which then facilitate the understanding of the task at hand (the book also says it would be possible to upload information, like a virus, into a properly configured meat, but that's beside the point).
It's an odd concept that I think holds some liquid. Once you begin thinking about something a certain way, it becomes easier to understand, so you make progress on a logarithmic scale, exponentially. It's a weird feeling though; considering that this thing I've been doing has very likely changed the way my brain functions on a basic level. Very weird.

You can never go back.

Tuesday, March 16, 2010

Members Only

So it turns out I was both correct and wrong in equal measure regarding the previous posts. First of all, it turns out that whether or not I can access information has nothing, nada, zero to do with whether or not the information I'm looking for is somehow abstract. It turns out, that I had done something stupid. You see, when I originally set up my Arch Sprite Class - the one that contains all the little details about how the sprites themselves will function - I had followed what online tutorials said I should, which is to mark the class variables as "Private."
I'll start over so we can all keep up. Classes, like I've mentioned before, are just like little robots. I can make a new on and it'll follow the instructions I gave it. The Sprite Class is a big Class that all the little Sprites are connected to. So the player pictures, and the enemies, and bullets and all of that are all sprites. Instead of giving all of them the specific instructions for how they are drawn and the logic that controls all of that, they instead are all the little childrens of the Sprite Class proper, and that Sprite Class controls all of their display logic and stuff for them.
That big Sprite Class also defines all the bits that the little Classes are made of. So their positions, and their speed, and what picture they use, and all of the other silly things (like how big their pictures are). Those are the variables that I'm talking about. They can be marked as either "Private" which means that only the Class that the variable belongs to can use (or access) that variable. "Public" means that anything can get the information as long as I can be specific enough. "Internal" means that the information can be shared inside the Class Family. So an internal variable could be seen by both the player class and the enemy class if I wanted it to be.
My problem, was that I had made the position of the different things a Private matter. I told the computer that it wasn't anybody else's business and they should stay out of it. Now I've told it that it's okay to gossip a little. Share the knowledge really.
Long story short, I can get to any of the data anywhere as long as it's a sprite. This new access to my own bullshit has allows progress to advance quickly. So after a fashion, like the start said, I was correct in a previous assumption - the data is all organized like a bunch of little tables, and I can get to it if I want.
What I don't understand, is why the ability to make a variable Private is event there in the first bloody place. Unless it's a variable that controls something inside a function I don't see why you wouldn't want to be access that information wherever it is convenient. It may be faster somehow when the program is running, but I'm finding the access is making things far easier to implement.
Ah right, what do I mean by "inside a function?" Say you want the computer to do something ten times. So you would create a counter inside a function. Every time the function does something, you'd increase that counter by one. When the counter is at 11, you would make the function stop. That counter would be "inside" the function. It's a made up number that doesn't exist anywhere else, because it doesn't need to. The next time the function comes around, we'll make a new counter number. Contrast that to say, the player's life total. That's important information that we would need to remember.
Yay! Technical!

Speaking of silly other crap, I went ahead an built a new way to see if things are touching. I already had a way, but it required that something be there. So I could see if bullets hit enemies or things were crashing into the player, but I had now way of knowing if something was touching an area with nothing it it. So I built a function that compares two sets of points. It checks to see if the first four points are inside the area of the other four. It works pretty well actually. Try as I might, I couldn't make it really perfect, but then I remembered I don't need to. These areas are really just for AI, and they work great in that capacity. So now I have enemies that dive on the player if the player happens to be in the target area below them.

In all, now my software works. There are no bugs that I can see, and the whole thing is spinning along nicely. The basic backbone of the thing is constructed, and now I can hang the rest of the elements on like little tree ornaments.

-Yes, I know. This is like, the 7th technical post in a row. If I got letters (from readers - HA!) they would probably say things like, "Um, you ramble too damn much and we don't know what you're talking about sometimes." Or "Get back to talking about design and making stuff fun." Maybe "Oh, and the kitten punting thing. You haven't mentioned that in like, forever."
Sorry boys and / or girls, but that's the second, cool part. I mean, you don't start off playing in front of thousands, you have to put the time in to learn power chords and rockstar slides first. Besides, you'd be surprised how much of game development is this.
Oh, and I feel smart sharing my victories. It's slightly better than ranting against my shortcomings, even if it's less interesting to read.

- Oh, and CID still doesn't condone the punting of kittens. Even if they deserve it. Little Brutes.

Thursday, March 11, 2010

Creationism

Yesterday I got the first type of Crasher enemy installed into the code that will eventually be Paper Zeppelin. In the Design Doc, which is I haven't posted yet cause it's not done yet, when enemies or players are destroyed instead of exploding they fall towards the ground. If they hit something else, a cascade of destruction will happen. This particular mechanic should also make multiplayer a little more communication oriented. I mean if the other players are destroying enemies all willie and/or nillie, it will probably put you in danger of their particular crap. It's a different way of thinking about a shooter.
Anyway, I got the Crasher type going down in a big ball of flames. However, it's not working yet. You see, when I hit an enemy will a bullet, they both get erased from time and space and a crasher is summoned. That's not quite right. Truthfully, the crasher is summoned right before I make with the erasing, so I still have variables to use. The issue is that I cannot get the crasher to appear where the enemy just was. The enemy position variables seem to be locked behind some kind of iron door. The stupid thing is that I can clearly use the damn numbers, since the drawing and collision functions clearly work. But as soon as I explicitly ask for them, it falls down. Further, unlike the work around I was able to cleave for the bullets, this particular information only exists in the abstract.
The really dumb thing is that, hypothetically, the different classes are really just a bunch of data in a table. The cells are full of different stuff, but basically, it's a table. They're numbered somehow, and the column means something. So, hypothetically, if I were to say, "Hey, you, get me the number from Row 7, Column 5," it shouldn't be a fuggin issue.
Instead it tells me that I don't have the correct access level. It's something I assume comes from the enemies having Public or Private numbers and attributes. I'm not exactly sure though, and it makes hate well right up from the deep recesses of my brain like a black oil.
So I guess what I'm saying is, "Good news everybody! I got another framework type of thing built and installed, and it almost works!"
I'll pound my cranium on this wall until one of us gives.

Tuesday, March 9, 2010

Collision Imminent

I've found the fourth piece. Yes I did. This "fouth piece" is the final bit needed for a game to work from a programming perspective. They are : Drawing Stuff, Controling Stuff, Updating Stuff and now, making stuff Collide.
It did take me the better part of an hour though. The main reason is that I never stopped to consider for a moment what it is the hells I'm trying to summon sometimes. I tried functions that would call for numbers that don't always exist. So on my first try, I went ahead and had the computer go float up the variables from the player bullets. Of course, I ran into an error message as soon as I compiled because no bullets existed. Other times the computer was nice enough to let me know as soon as I typed it out, "Hey, um, yeah, that doesn't work. Quit being stupid."
Floating variables for these particular types of objects is clearly different than floating up player variables. Players are clearly defined and have names. Everything else is just digital huddled masses, like the nameless hordes in Rambo movies that are granted existence only long enough to have it stripped from them forcefully.
So, if I write a function that asks, "Can I have the X and Y for a bullet please?" the answer is rightfully, "The bullet? I have no idea what you are talking about. You fail at life."
"So," I reasoned, "Maybe there must be another way to compare objects."

What I came upon, was buliding a second list. Actually, build several lists of objects. So now there is a list for players, one for player bullets and one for enemies. When I run the enemy update codes (basically the same as the SpriteList from before) I added another little loop inside that also asks, "Hey, while you're here, are you touching any of the player bullets?"
Consequently, it works. They touch and their short, and I have to assume - miserable, lives are wiped out by the raw power of an emerald Bullet Bill.
In any event, with the basic code of collision in place I can get that whole system dancing. My lists are flexible enough to do almost anything with them. Further, they're portable and abstract enough that I can use them in lots of things. Other things, strange things, EP-esque things. I'm quite a happy panda.

- In other news, the Team continues to work along buliding assets for The Thief's Tale. New stuff continues to come in. Sometimes in bursts, other times at a trickle. If you go back, say, 3 months, there was once a tentative Complete Date of the end of January. That didn't happen. Yet, I still continue to believe that a Complete Date will happen.
My belief is granted strength by the periodic infusion of justification.
I've also decided to give The Tester a chance to do some animation. He's been studying dilligently and has learned a good number of things at school, like how to rig up a model. I've found that learning by doing to be the best way (well learning by doing and then writing extensivley about it), and we have time. I'm positive about it.

Friday, March 5, 2010

Keeper of the House

I'm thinking that I've got a pretty goo handle on C# now. It's not quite yet enough for me to declare that "My Kung Fu is Strong," but certianly enough to do what I demand of it. I'm also beginning to think about ways to do other projects in the docket, specifically the incredibly esoteric EP (a project that I very well could code is Blitz, since I'm fuggin Li Mu Bai in that particular Matrix). In any event, I've got a fine competentcy in classes. I can summon them, serve them, update them, and most importantly, I can make them talk to each other. Also, when I write things they tend not to crash outright, and that's miles ahead of where I started. Far less swearing now - the key word there being "less."
So yesterday after diving into the code I starte putting together one of the most basic enemies to allow me to code collision and so on, and I could not find a decent way to insert them into the code as it was. I made a new class of objects, gave it a few things to do and then could not easily add a way to pull them from nothingness. On a longer term, I'm planning on basically stealing the code out of one of the code samples that came with the C# compiler. In it a string of character is translated into tiles. I'm going to expand that considerably to allow for scrolling, and then spawn ground, enemies, background elements and everthing else through this system. Then I'll be able to put together whole levels using a text editor. It'll save me a bunch on time building tools, since my computer came preinstalled with WordPad. Of course, adding these additional functions to the "borrowed" code will require that I have a far deeper understanding of the thing, so I don't consider it cheating.
Anyway, I haven't done that yet, but I still need to create the little buggers so I can build the rest of the engine. My easy work around is to create them on the screen through a press of a button (the big green A button in this case). But I couldn't, since all of my control functions were inside the spawning functions of players and bullets. It's a situation that, I've learned the hard way, needs avoiding.
So, even though I really wanted to make little planes doing little plane stuff, I instead found that I had to rewrite and reorganize not un-small chunkies of code. So the spawn functions were stripped of their controls and a new centralized Control Function was built. After some, let's say, dumbassery I got it doing a two step.
Along the way, I discovered the bestest thing ever (this week). By creating functions that only call constructors (little commands that make new instances of classes) I can deal with adding only the information that I give a steaming crap about. Let me try that again, from the beginning. Functions, as we know (if not, go back 2 years and read up to here {like anybody reads this}) are little bits of code that can be looked at and treated as little blocks of informations and instructions. So in Thief when I make the dude run, there's a "Run" function that has all the code that makes him run. I could write that out every time, or I could do it once and label the whole chunk Run(). Later, instead of typing it out again, I just have to put "Run()" and the computer will go find the code I already did. It allows me to make changes in one place and have it go everywhere. The little ( ) at the end let's me tell it stuff.
Constructors make instances. That sounds very complicated. The way I think about it is to say that the code for Classes are instructions for a robot. So all my Robot Chickens will follow the Chicken Class Code. When I call the constructor code for a Chicken, it makes a new Robot Chicken that will also follow that Chicken code. It's a cute thing. When you make a new Chicken (or any new instance, chicken or otherwise) you tell it starting information and most of that information is the same every time.
This is where the two meet in the middle. So let's say that there's a dozen bits of information for making a new Chicken, silly stuff like animation frame information and stuff like that. The only one we care about is which color the Chicken will be. So instead of writing out the whole thing with a dozen little bits, I can make a function with all of that already there and a variable for the color. Then just do this :

MakeAChicken(Red)

It's how bullets work now in the Prototype for Paper Zeppelin.


- Oh, up towards the top you’ll notice I mentioned that I try to avoid spreading my control functions all over the place. There’re a couple of reasons for that. The first is that, hypothetically, if I wanted to change something I’d have to find every single instance of the controls being looked at and update them, which is stupid. I know this because it took me 2 days to add gamepad support to The Thief’s Tale. Those are days I’m not getting back.
The other reason is one of speed. You see, a piece of software runs in your computer; CPUs and GPUs and motherboards and a bunch of other technical sounding things. Imagine that the innards of your computer are a city like San Diego. Now imagine that all the little bits are scattered around in their own buildings. So the CPU is City Hall, and the Motherboard is the streets and PetCo Park (or whatever it’s named this week) is your hard drive. Now say that the CPU needs some info from the hard drive, so it sends a message via Bike Messenger.
Since PetCo is reasonably close to City Hall, it’s a pretty short trip and goes pretty fast.
A controller or keyboard or anything else, isn’t even in the same city. It’s not on the same streets even. So say, the CPU wants to look at something at the keyboard. It again sends a Bike Messenger, only this time, he has to pedal his little ass all the way to Los Angeles. That’s kind of slow. Now do that a couple of dozen times per cycle and we see why that’s something to dodge. If you need to do it, just once should be enough.

- Hmm, technical post today. It’s what happens when the Designer also does all the programming then feels the need to explain it. I’ll see if I can’t use even more tortured metaphors in the future.

Monday, March 1, 2010

Adatir of Gondor

Ah, much to talk about. Let's start with the stuff from the last post. The design document for Paper Zeppelin is coming along, just taking longer than I wanted. Important questions regarding the structure of things come up when you actually have to write them out instead of simply thinking about them in abstracted ways. The hard truth of some aspects becomes very apparent when it's literally black and white. It can also save a lot of time instead of getting right into prototyping.
For example, in PZ the point of each stage is to pick up a bomb and drop in onto an enemy base. Sounds easy, but what if they don't? So what? Now what do you do? You can't make a player redo an entire level because they screwed one aspect, yet I don't want to add convoluted systems that I will have to code into a language that I have a base familiarity with. Important questions. (By the way, the solution is branching level sequences).
So yeah, I'm into that. I do have the enemies and the basic engine concepted all out. Really, it's simply faking a scrolling environment. Everything in the game that isn't the players, like the ground tiles, enemies, background elements and so forth are all spawned on the right side of the screen. They then travel to the left side and are subsequently culled when they leave the screen. But if I make the ground and any ground based enemies go all the same speed then it appears to scroll on by, even though the player's really don't move around too much.
I also have the basic enemies sorted out, so I'll get to coding those up soon and maybe I'll get to my Break Point.
Ah, Capital Letters seems to imply a keyword there. It's an odd little quirk of my game designs. I figure out, if there is nothing else, at what point will I know if the basic concept and gameplay is sound and interesting. In other words, the Break Point is where I have done the least amount of work to get the idea of what the game will be like on a super basic level. From there I decide to either throw out the whole thing, keep on going, redesign parts or do something else if. So that Point is what I'm working on now. It's not pretty, I mean the BP for Thief was my Zero sprite moving around a blank screen with no platforms yet to see if the most basic of movements was interesting or not.
Of course, that's not to say that I don't prototype. I mean, read the other posts that start with, "I was thinking about..." and end with, "...but then I decided I hated it." But I find the best and fastest way to do that is with thorough thought experiments. Running the would be game a thousand times in my head trying to discern unseen interactions between game systems before I code a line. PZ though, is getting to the point where coding in the very next part.

- Speaking of a game that's past that Point, I've got a couple of more animators involved with Thief. So I'm going to get one of them involved in combat animations for The Knight character so I can have a full combat animation set. Then, finally, I'll be able to really have other people test it without needing a cheat sheet explaining what the deuce a yellow rectangle on the enemy means (high block, unless the enemy is moving, then it's a lunge {do you see what I mean now?})
Also, I continue to get smashing good musics into the game. Which I'm really very happy with. I love opening the mail in the morning and finding stuff.

- Finally, for the other site I'm involved with writing a review for The Lord of the Rings Online (or LotRO as the cool kids call it). I won the opportunity through happenstance, and the fact that my phone boops when I get an email. Anyway, I'll be writing several articles about that. The idea is that the game is simply way too big for a thousand snarky works to really do any kind of justice. I mean, whole systems should be worthy of critique, provided they have enough meat to chew. Add to that the fact that end of game stuff can take several (dozen) hours to get to and we find that a different approach is needed.
So I'm planning on writing a series of articles, each going into certain aspects of the game itself, from starting, the main quests, PvP, raiding and so on. To that end, I've built me up a character called Adatir of Gondor. The name, of course, is a stupid play on words that I simply must share (even though it's a little wanky and self indulgent). The name is two parts, "Ada" means "Again" and "Tir" means "To See, or to Look" like the Palantir that Saruman had. Put the words together and Adatir means, "So Look/See Again" or "Re-View."
In any event, I'm 5 levels into it, stabbing boars, wild dogs and creepy bandit types and finding myself having an unnaturally decent time with it. It's like I can see the underlying loot and abilities treadmill, the gears running just below the surface and I don't really care. I know I'm being manipulated on a super basic level, and yet I keep on going. I kill something with a spear (or a shield bash - I love those!) and get XP and loot. I sell said XP and loot to gain new weapons, which I want to play with. Playing with sharp, pointy things nets me more XP and loot and then I've gained a level and have new abilities. Of course, my session wouldn't be over until I've rocked out with my new Super Stab of Bree or whatever and the cycle continues. Now I'm supposed to go stab a giant boar of some kind. Not sure how that relates to the end of the Third Age, but I'm willing to have my puppet strings pulled enough to find out.
I could see that adding friends to this particular mix would create a very potent cocktail indeed.

- Ah, right, almost forgot. I'm still posting the Design Document for Paper Zeppelin....when it's ready. Maybe soon.

Monday, February 22, 2010

Bullet Catcher

I'm now back into C# and the hidden mysteries within. I'm discovering that using a class based language requires some advanced thinking before really siting down and getting to work. The issue is the way the different classes are structured controls how they talk to each other. I seem to have discovered this the hard way.
Things overall, are going very well. I'm learning the basic syntax of C# although I am finding it a little odd. Say for example, where in Odin's Crusty Beard is my fuggin "OR" conditional? I missing it obviously, because coding language couldn't be that stupid. It can't, can it?
I'm clearly on a tangent. Anyway, on structuring the code I tried a couple of different ways to organize how the Player Bullet Class will function. The first way was to think about it hierarchically. So thinking that Bullets come from the Player Sprite, they should be a sub-class of the Player Sprite. Turns out that was a stupid idea, because the code updates things based on a list. So when I add a new object (like a Bullet, or an Enemy) it adds it to the something I called the Sprite List. It's very similar to the Object Code that I built for Thief, but deep in the guts of the C# language. In any event, when I made the Bullets a subclass of the Player Sprite, it had no easy way to talk add any of those things to the list, because that list exists somewhere else.
Long story short, putting the bullet creation that far away from my Sprite Manager Class (where the List lives) made it very difficult to have it do anything useful.
So I reasoned, "Alright then, everything gets to start and end at the Sprite Manager, since it's the official Keeper of the List." So I reconfigured the code so that it could keep track of which way the player was facing, float that variable up into the air where it could be caught and bullets created. That, after a fashion, worked pretty well actually. Not initially of course as you'll notice from 3 posts ago, but I got it working yesterday. It's something that will come in handy later, since at least one of the mini projects in The Star Frog EP will create bullets that way. I threw it out though, since it has nothing to do with what I'm currently into - Paper Zeppelin.
When coded right, yes, I can float a value from a sub class and have other functions and classes do stuff with it. However, for my purposes here, I really need to create bullets based on vectors using the right stick. Yes, I know that right stick firing shooters are de riguer, but here it actually works in both context and mechanically.
To get that working, I just had the Sprite Manager have a peek at the sticks, figure out direction, and round off the vectors. So say, the stick is pointing up and to the right. That has a value of Y being less than 0 and of X being more than zero. Or in codish:


RightStick.Y < 0
RightStick.X > 0

So I rounded those off like this :

if (RightStick.Y < 0)
bulletDirection.Y = -bulletSpeed

if (RightStick.X > 0)
bulletDirection.X = bulletSpeed

That way, press a little or press a lot, the bullets all go the same speed in one of 8 cardinal directions. Then I make a bullet, add it to the List and booya, it dances like a drunk with neither pride nor rhythm. Which is to say, in a very entertaining way.

So, what have we learned here today? Well, I figured out how to create and update objects that just do their own little thing. I can use this to make enemies next. The difference will be in how they are created, either randomly (which I hate with a fury - being a design control freak) or by data tables (which I am very fond of). Then I be able to get collision detection working, which is the last piece of the game engine Triforce (Controls, AI, Collision Detection , which correspond to Courage, Power and Wisdom respectively).
Before any of that though, I need to figure out what enemies I need, how they act and how I'm going to going to generate them. So unlike Thief, I need a Design Document. I may even post it online - *gasp*!
Stuff inbound.