Categories
Personal Development

Facing Reality

As I said in my weekly Thousander Club update, I was worried about making a game for IGF 2007.

Last year, I posted about my decision to enter the competition. Rereading the post, I found I became angry at myself. In October, I said “I’ll obviously need to have a game to submit, but I have the rest of the year to make one.” Well, a year is almost up, and it’s been a year since I first started working on Oracle’s Eye, and I have nothing to show for it but an engine that doesn’t play a game yet. According to my records, I’ve worked over 170 hours on game development-related tasks. I have created a simplified text-based boardgame simulation, which helped to secure my current day job and teach me about component-based development, so I guess that counts, but I am upset with myself for not having better results.

Something prevented me from acknowledging this anger at first. I think the problem was that I didn’t realize it was self-directed. It’s easy to get angry at the world, other people, or inanimate objects when you aren’t aware that your current situation is the result of your own actions. Blaming others is easy, but when you realize that you can take responsibility for your own actions, you feel empowered.

I get that. I might have taken it too far, though. I was angry at myself, but as soon as I even felt a hint of anger or frustration, I would dismiss it. “There is no point in getting angry as it is your own fault you are in that situation.” Meanwhile, my subconscious was probably screaming, “YES, YOU BEAUTIFUL MORON!” and then became even more frustrated since I wasn’t paying attention.

Sure, being angry with yourself isn’t going to be fruitful by itself, but you need to realize that there is something to be angry about in order to do something about it.

Now that I know that I am angry, what can I do about it?

I can face reality.

Last year I said would make a game and submit it to IGF, even though I had no specific game in mind to create. Months into it, I was thinking that I would make a game after I finish Oracle’s Eye. Months ago, I thought that OE might be the game to submit because there wouldn’t be time to make another. These past few weeks, I was hoping to have anything completed by the due date. Now, I think I will need to give up on my goal.

Was it too much to think that I could create a single game in a year? I don’t think so. If Game in a Day is possible, and it is, then I should be able to come up with something over an entire year. Was my project too ambitious? Maybe, but I cut a lot of features and left it with some really basic gameplay. I couldn’t seem to pull it together anyway.

Part of my problem was that I didn’t have a single focus. First I was working on OE. I found that small changes would require a lot of rework. After some time I decided that I should create a new engine to make development easier. A component-based framework would make game development almost as easy as editing a configuration file. Of course, creating one is more difficult than to hack away at a single game. The work is still there. It’s just moved from one end of development to another. I also took a little over a month to complete the boardgame simulation. While it was a good experience, I shouldn’t have taken such a long break from OE.

The bottom line: I’m not satisfied with my performance for the past year.

I’ve been taking some time to think about what I am really trying to do and how I am going to do it. I will post at least some of my plans on this blog. I’m not sure how I am going to improve my situation, but I am going to find out, and then I am going to do it. Wish me luck!

Categories
Game Development Personal Development

Thousander Club Update: August 21st

For this week’s Thousander Club update:

Game Hours: 171.5 / 1000
Game Ideas: 432 / 1000

Target: 630

There are 19 days left until the deadline for entering a game in IGF 2007: Countdown to IGF 2007

I don’t have much to say in this update except that I went to Iowa this weekend and overtime at my day job needs to stop.

Categories
Game Development Personal Development

Thousander Club Update: August 14th

For this week’s Thousander Club update:

Game Hours: 166.5 / 1000
Game Ideas: 432 / 1000

Target: 609

There are 26 days left until the deadline for entering a game in IGF 2007: Countdown to IGF 2007

This past week was another one spent mostly at my day job, and so all of my development happened on Saturday and Sunday. I probably could have spent a few more hours in development, but I let distractions get to me, the least of which was the five to ten minutes being tempted to learn Klingon while playing chess online. Thanks, cliffski! B-)

As suggested by others and my own thoughts after writing about porting physics code, I’ve decided to stop worrying about generalizing my engine too much. I will focus on making a Pong clone. I set August 18th as the date that I hope to have it finished, and I spent this past weekend working on creating some simple sprites for the game and designing some classes I would need for it to work. I already knew that if I wrote up a configuration file the way I think I would want to use it, I could code to make it work. I just never think to create other assets. Creating the graphics first helped me to focus my efforts, which allowed me to be efficient with my limited development time.

I’m a bit worried that I will miss the IGF 2007 submission date, but I believe that I can still make it with some serious effort. On the other hand, I haven’t finished a game since a Pac-man clone I did in QBasic in 1998. Is it unlikely that I can make even a slightly innovative game in less than a month?

Categories
Game Development Geek / Technical General Linux Game Development

Physics, Collision Detection, and Porting Code

As I develop Oracle’s Eye Prime using component-based methods, I have found myself thinking about how to implement features in a general way. For example, if I am trying to make Pong, I shouldn’t hardcode the Ball and Paddle and Walls. Instead, I should have a more general way to detect collisions. After all, even if I have a Ball entity bouncing off of a wall entity in Pong, I might want to do Space Invaders next and have bullet entities that destroy alien entities.

There are two aspects to collision detection with which I am grappling. The first problem is determining how to detect collisions between different, arbitrarily defined objects, which generally are represented by sprites on the screen, while still knowing where it collided. In Pong, I would like to know if the Ball hit the front or the sides of the Paddle since it would bounce differently. The second problem is figuring out what to do when a collision happens. If the Ball hits a Paddle, it should bounce off depending on the side it hit. If the Ball hits the goal, or goes out on one side, it should result in the score increasing for one of the players.

Metanet Software’s N Tutorials section helped me to figure out the solution to the first problem. While the code examples use ActionScript, the interactive example animations demonstrate the concepts and make them easy to grasp.

However, in the forums, there was a mention of Erin Catto’s GDC presentation on sequential impulses. Sequential impulses for “fast and easy” physics? It technically takes care of both problems? Count me in!

My first task: port the code.

It was originally written in Visual C++, but I am using an entirely different operating system and compiler. I obviously had to remove the #include for “windows.h”. The application used GLUT so I didn’t need to worry about WinMain or anything specific to VC++. On Windows, filenames are case-insensitive, so including <GL/glut.h> is the same as including <gl/glut.h> is the same as including <gL/Glut.H>. On Gnu/Linux, filenames are case-sensitive, so I had to determine which name was needed.

The next problem I encountered was a bit trickier. The code makes use of the class Arbiter, which basically regulates the collisions between different bodies. The World class has makes use of std::set to hold and sort through the Arbiters. The problem?


for (ArbIter arb = arbiters.begin(); arb != arbiters.end(); ++arb)
{
(*arb).PreStep(inv_dt);
}

g++ won’t compile the above code. It complains that it is modifying a const Arbiter, even though ArbIter is not a const iterator. VC++ will compile it just fine, obviously. Which one is correct?

It turns out that both are correct. At least, the standard library implementations are both correct. See, std::set’s keys must be ordered, and if a key can be modified, the ordering can’t be guaranteed. A set could be implemented so that std::set<T>::iterator is equivalent to const_iterator, which is how it is implemented for g++. If the key is only accessible through const methods, then there is no concern that the key can be changed in a way that would change the order. Other implementations can allow modification of a set’s keys so long as the parts relevant to ordering don’t change.

The problem is that the code as written wasn’t portable, and I didn’t like the idea of using const_cast or mutable to work around it.

Scott Meyers, author of “Effective C++” and “Effective STL”, provided the safe and portable solution.


ArbIter arb = arbiters.begin();
while (arb != arbiters.end())
{
// Erase key from set, modify it, then add it again.
Arbiter newArb((*arb).body1, (*arb).body2);
newArb.PreStep(inv_dt);
arbiters.erase(arb++);
arbiters.insert(newArb);
}

As the comment above states, you modify a copy of the key, erase the original, and then insert the copy. The above code should compile on any implementation, which means that it works with g++ on Gnu/Linux or VC++ on Windows.

Moments later, I was able to get the physics demos to run on Gnu/Linux.

The next step: integration with Oracle’s Eye Prime.

Categories
Marketing/Business

Where the Money Goes

Thanks to Pag on Games, I found this interesting wiki article called Where the Money Goes.

The article summarizes where the money comes from and goes to for a successful next-gen game. The assumptions are that the game will cost $20 million to develop, and if so, selling only 100,000 units will result in losing over $20 million. On the other hand, if you sell 2 million copies, you can stand to make a lot of money.

The interesting part: “carefully controlling the factors that affect profits can have a big effect on the profitability of a game.” The Dream Scenario demonstrates that adjusting certain costs can result in significant profit potential. While it is a dream scenario, the point is that a lot of money can be thrown away if care isn’t taken.

But what does it mean for an indie developer selling games online? What can an indie do with this information to improve the chances of being successful?

There is no such thing as Markdown Reserve or Wholesale Price, or at least they should be quite negligible. There are other costs, of course, but there is no need to worry about manufacturing the right number of units or liquidating unsold copies, and negotiating royalty rates for consoles isn’t likely to be a possibility for those developers that have a deal with console manufacturers in the first place. Perhaps the cost for using game portals could be substituted for the cost of having a publisher.

Obviously marketing can get quite a bit more focus, and it should. Without retail deals, customers need to find out about your game before they can even think to buy it. If your game was available at the store, you might benefit from impulse purchases, as well as the advertising for just having a box with the game’s name on it on a shelf. Since an indie will most likely sell everything online, there needs to be a way to get in front of more eyeballs.

We can drop the development costs from millions to possibly hundreds or thousands. My own expenses probably won’t exceed a few thousand needed to outsource art and sound to actual artists and composers.

100,000 copies sold would no longer be a catastrophe with those kinds of numbers. In fact, one hundred wouldn’t be too bad either. Also, lifetime sales can actually mean a lifetime as opposed to the months before a game hits the bargain bin and disappears. When talking about copies sold, we’d need to limit the scope to a specific time range, such as a month or a year. Otherwise, it can be difficult to keep things in perspective.

100 units sold over the course of a month would be great for many indies. Over the course of a year, not so much. We’ll use the term catastrophe if those sales were made over the course of an actual lifetime, but even then that game could bring in potential customers for the developer’s next project, which we can hope will take into account the lessons learned from the previous project.

When you think about the numbers in this way, what’s the risk for an indie? I suppose the biggest risk is the time investment. If an indie spends three months on a game that doesn’t sell well, it isn’t as bad as the developer who spent two years. If lost time in development is such a big risk, then I suppose the next biggest focus for an indie are development practices.

Since time is money, we can still ask the money where it is going when talking about what a developer does. How focused is the project? Does the developer spend every waking hour working towards completion of the project, or does he/she manage to work a couple of hours every other month? Is there an opportunity cost for not working on the project, delaying its release and potential sales revenue? Are there development practices that might make the developer more effective? Spending 40 hours making a significant component of a game is fine, but if you can do so in five hours, you can finish the game faster.

Marketing can get the resulting game in front of more potential customers, but an indie may want to invest in learning how to do things more efficiently. The more important the skill, the better the benefit you would receive for improving it.

Categories
Marketing/Business

What Service? Perception Matters

If I happen to turn on the television early in the morning, I will see an infomercial for Total Gym. Chuck Norris and Christie Brinkley endorse it, as well as Wesley Snipes. It sounds like a great compact setup, and with space in my apartment, I would need to be able to put it away under the bed or in a closet, just as the commercial says. It was one of the features hyped in the infomercial, and it was a selling point I cared about as a potential customer. If I didn’t care about having a huge system of gym equipment out in the middle of my bedroom floor, Total Gym wouldn’t have appealed to me any more than Bowflex or some other system.

I’ve never bought any infomercial product before, let alone exercise equipment, and I’ve learned my lesson about buying something without researching it, so I did some quick searches. I immediately found a summary of all of the reviews out there for home gym systems, and it helped me make my decision not to get the Total Gym, at least not until I determine it really is the best value. I think it sounded too expensive compared to similar systems, and I should be able to find something else. While looking for more opinions, I found a section for Total Gym at infomercialscams.com.

There are only five complaints, and apparently the last two are from October of last year. Generally the complaints are that storage isn’t as easy as the commercial claims. I also didn’t like reading about one customer’s experience with customer service. Then I checked the Defenses. It was there that I read something that made me want to post about it.

From a business point of view, Total Gym has some fanatic supporters. I thought some of them were jerks, making fun of the people who would complain about things like getting hit in the head or almost getting their fingers cut off while putting it away. Seriously! Someone actually loves the system enough to say that you can get badly hurt, but you can get badly hurt doing other things, too. Someone else referred to the complainers in derogatory terms. Tear down those who would dare to complain against this great product! It’s like listening to talk radio!

But guess who ruins it? Guess who ruins any kind of good opinion I can have about the company? Jeremy.

Jeremy makes it sound like he works for Total Gym, and while I can’t claim he DOES, it does NOT matter what I think as I write this post. What matters is that potential Total Gym customers might read what he has to say and assume that he DOES represent Total Gym. Perception matters, and Jeremy has basically made Total Gym out to be uncaring towards just those people who would most likely want to be customers.

there are low end retail versions for those of you too out of shape to pick up a 67 pound total gym.

you are the same type of people who sue mcdonalds for serving you fattening food or coffee that is too hot. stop blaming are quality construcion on your inability to safely follow directions in the first 10 minutes of the instructional video.The system practically walks itself out for your set up and folds up just as easily if you do it the right way.

What do we have to do? Come to your house and lift you onto the machine? Grow up and find a real problem with this produt before you try to degrade it for everyone else.

I can lift 67 lbs, but I wouldn’t claim that doing so is as easy as letting the weight walk itself. I don’t have anything to go by but what the users have said, and even the defenders will argue that it can be dangerous and isn’t as easy to put away as the infomercial would have you believe. One of the complaints was about the hassle the customer had when trying to get the money back after returning the equipment. Jeremy just makes it more believable that no one at the company cares about you past your wallet.

Who is Jeremy? He could be anyone. He could be a C-level employee, he could be in sales, he could be in support. It doesn’t matter. When he wrote what he did, it was the same as if Total Gym wrote it. at least as far as potential customers are concerned. Chuck Norris might have persuaded someone to want to buy the system, but whoever Jeremy is, he is making it difficult for someone to justify giving money to the company.

If your entire experience with Total Gym is learning that your friend had been hurt or complained about the weight of the “easy” system, the last thing you want to know is that Total Gym itself is blasting your friend for being lazy and whining. Perception matters.

It is why visiting certain fast food restaurants or grocery stores is always weird. There can be pictures of smiling employees somewhere on the wall, but if the actual employees are mindlessly going through the motions, asking the required-for-customer-service question “How are you today?” without caring about your answer, it’s weird. Who wants to go there? Who WANTS to go there? If you perceive that an employee doesn’t care about you, it’s as good as believing that the company doesn’t care about you. The management can be happy and the CEO can talk about great customer service, but if the front lines of the company aren’t acting like the representatives they should, who would want to give money to that company?

If your business interacts with customers in any way, you need to ensure that your business presents itself the way you want customers to see it. If you respond to an email from a customer, make the effort to ensure that the receiver will not have to wonder if you are professional enough to be sell anything. Does your website have misspellings and grammatical mistakes? Can someone find a Jeremy representing you out on other websites? Are YOU a Jeremy, sabotaging your own image? Drop your pride, stop trying to prove that you are right, and let your customers know that you care. If your customer doesn’t know you care, you might as well not.

Perception matters. Is there anything your company is doing that might be scaring customers away?

Categories
Game Development Linux Game Development Personal Development

Thousander Club Update: August 7th

For this week’s Thousander Club update:

Game Hours: 161 / 1000
Game Ideas: 432 / 1000

Target: 588

There are 33 days left until the deadline for entering a game in IGF 2007: Countdown to IGF 2007

There is a deadline for a project at my day job, and so I haven’t had as much time to work on my own projects.

On top of it all, I had upgraded to a new version of SDL, which broke compatibility with the Kyra Sprite Engine. I couldn’t compile Kyra because there was a compile error in a certain file that has not changed for a number of versions. I have no idea why it wouldn’t work, but I had to change a line in it to get it to compile.

Unfortunately, after I did the new build and built my project against it, I couldn’t run it. Something else was updated on my system which prevented me from running applications that aren’t installed, such as Oracle’s Eye Prime and the Professor Fizzwizzle demo. I decided to upgrade everything on my system, since I was spending as much time as I was just trying to get these things working.

The result: I am typing this post from my girlfriend’s computer while waiting for the kernel to recompile so that I can create new Nvidia kernel modules in order to use Xorg (as I was using XFree86 before). I was able to get some work done this weekend, but I lost a lot of productivity.

I need to look into setting up virtualization so that I can get a clean image of a Gnu/Linux build without needing to worry about breaking anything when upgrading.

Categories
Game Development Games

Indie Game Dev Podcast: Interview with Amaranth Games

Action posted a new Indie Game Developer’s Podcast featuring Amanda of Amaranth Games.

The intro was new and, er, interesting. You’d have to hear it to understand.

Amanda is the creator of the game Aveyond, and in this interview she talks about how she started making games out of cardboard when she was eight years old. While she was in college she made her first computer game which was panned by critics as “too vanilla”. Her next project was Ahriman’s Prophecy, the success of which led her to attempt to commercialize Aveyond. She talks about the difference in development practices for each game as well what brings her inspiration.

She is also asking other indies to finish some RPGs so she can play them, so get to it!

Categories
Personal Development

Improve Your Memory

I forgot to post on this topic last week (…pause for laughter…), but this how-to on improving your memory seemed quite useful.

It’s bad enough when you feel that you have very little time to do the tasks you need to do. Why do things twice? Improving your memory means only having to learn things once, saving you time and making you both more efficient and more effective. The how-to has a warning that improving your ability to recall does not guarantee success in life. Maybe not, but it isn’t as if being forgetful has helped me any, either. I might as well improve this skill as it can only help.

Some of the tips in the how-to relate to mnemonics, which most memory articles and books advocate. I think that habits should be made out of physical and mental exercises. Poor health will make it more difficult to remember, so to keep sharp, you need to keep healthy. Repetition helps, and repetition helps.

Some of the tips seem to have generalizations that could be more useful:

Put black ink at the end of your palm to remember any important thing for the next day or for that day itself. Whenever you see the black dot, you’ll remember what to do.

Actually, I think the general idea of using reminders, as David Allen mentions in Getting Things Done, is more useful. Recently I wanted to motivate myself to wake up early. The night before, when I was programming but needed to go to sleep, I KNEW that I wanted to wake up early so that I would have time to continue programming before leaving for my day job; unfortunately, when the morning would come, I would have a hard time getting out of bed. So I took an index card and wrote out my morning schedule:

  • 5:30AM – 6:00AM — Shower and get dressed.
  • 6:00AM – 6:30AM — Eat breakfast and make lunch.
  • 6:30AM – 7:00AM — Brush teeth, shave, etc.

I rarely need an hour and a half to do all of those tasks, but I have cats. The idea is that by 7AM I should be ready to go no matter what, and if I get finished earlier, I can always work on Oracle’s Eye Prime for longer.

Anyway, I took the index card and placed it on top of my alarm, which was moved from my bed stand to a shelf. The next morning, when the alarm went off, I first realized that it wasn’t where it used to be. Then I realized that I couldn’t get to the alarm without touching this index card. I didn’t even need to read it as I immediately remembered why it was there in the first place. I tried it last week, and almost each day without fail I was up and ready to go. The only time it didn’t work was when I was feeling sick, and I gave myself permission to not work that day. Otherwise, I didn’t feel a need to go back to sleep because I reminded myself that I wanted to give more time to working on my project. By the end of the week, I didn’t even need to put the index card on top of the alarm as I had built the habit of waking up early.

So the reminder helped me to remember my motivation. If I can “improve my memory” with similar results, how can I not succeed?

Categories
Game Development Linux Game Development Personal Development

Thousander Club Update: July 31st

For this week’s Thousander Club update:

Game Hours: 154.5 / 1000
Game Ideas: 432 / 1000

Target: 567

There are 40 days left until the deadline for entering a game in IGF 2007: Countdown to IGF 2007

I was sick again at the beginning of this past week, but I still managed to log quite a few hours. A lot of it was spent researching physics code, but I finally found something I could use at the Game Physics blog. As I am using g++ as my compiler, code found online can result in compile-time errors that Visual C++ and other compilers might allow. I spent some time trying to figure out how to change the code so that it not only works correctly but also conforms to standard C++. I was figuring out how to work with std::set to change existing members while satisfying the compiler, but the book C++ In A Nutshell had the answer. The code at Game Physics updated the set’s contents directly, but a set’s members are supposed to be immutable. I guess VC++ was fine with it, but g++ was complaining. If you need to change a key in a set, you must first erase it from the set, then you can update the key and add it to the set again.

I went to a LAN party this weekend, and while I didn’t stay long, I did manage to play various sessions in Unreal Tournament 2004. I was already planning on getting the game someday since it has a Gnu/Linux client right out of the box, but now that I know that there is a map in which you can attack a space station using ships, it’s a must-have.

I am worried that I’ll be working a bunch of late nights at my day job this coming week due to a looming deadline. I doubt I will be able to work as many hours on Oracle’s Eye Prime as I did this past week. Still, I am making steady progress. It’s just a question of making a finished game by September 9th for IGF 2007.