Categories
Geek / Technical Linux Game Development

Distributing Binaries: G++, libstdc++, and Static Linking

I’ve been asking certain Gnu/Linux-using friends to test out Oracle’s Eye while I work on it. I’ve already found that I need to specify SDL_image as a requirement because of such testing; however, I don’t want to have to send an 8MB source package that contains mostly useless-for-the-tester code or binary data. Asking someone to get such a huge download and build a project themselves just to check it out or test it is asking too much, I think.

Since they don’t need the source to test it, I can just put together the binary files I need and send them together in a tar.gz or zip file. Or so I thought.

I stumbled upon one of the things that developers face when they are new to Gnu/Linux: shared libraries that prevent distribution of your binary files. When you distribute the source and expect people to build it usually isn’t a problem, but I don’t anticipate all of my end users being proud geeks who wouldn’t mind spending hours getting my game to work again when it was working perfectly fine previously.

I have two Gnu/Linux systems, one which runs Debian Testing, with a 2.6 kernel and GCC 4.0.2, and the other which runs Debian Stable, a 2.4 kernel, and GCC 3.3. I don’t update the latter often because I use it as a backup machine. I don’t want to accidentally introduce incompatibilities that would prevent it from working properly.

When I brought my “release” over to the other machine and tried to run it, I got the following:

./oracleseye: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory

Let me just say that searching for solutions to this issue is difficult. You get a lot of results that aren’t relevant. Or I did, anyway. And I knew it had to be possible. Quake 3 Arena works fine, and I’ve upgraded libstdc++ a number of times, so why can’t my own code work so nicely?

So I asked on IRC, but people who leave their clients running all day even if they aren’t there are not too helpful. I searched some more, posted a question gamedev.net, but then found the possible solution immediately after the post.

Linking libstdc++ Statically by Johan Petersson talks about the exact problem I am having and offers a solution that is easy and seems elegant.

Basically, you need to statically link to both libstdc++ AND libgcc. GCC won’t let you do one without the other. And so far it seems to work.

I managed to get my code to run on my main system, my backup system, and my work system, and I no longer have to recompile on each. It only adds 0.5MB to my download, and I may even get better results once I stop using the debug build options. I’m not sure if there is a “better” solution, but I’m pretty happy for now. Thanks, Johan!

Categories
Game Development Linux Game Development

Oracle’s Eye Development: Graphical Enhancements

To continue with the improvements necessary for Oracle’s Eye, I decided I would focus on simple and quick things. On my list:

  • Shrink the Ball images to half size.
  • Create an actual sprite for the Player.

No coding for tonight, mostly. And there really isn’t too much to describe for the Ball, either.

The Ball

I just took the Ball image and scaled it so that it was 32×32 instead of 64×64. The tough part was rotating it 45 degrees at a time and putting it in the graphics collection for the Kyra Encoder. I could use the Kyra Sprite Editor to create the animation, but I found it much easier to manually edit the XML file. I already had the larger Ball, so I just changed the numbers. It was really easy, and I only had to fix a problem once. When I ran the game, the top of the Ball was cropped so it looked flat on top.

I even added some more Walls to the level. Eventually I’ll be able to dynamically load the level from a file so I don’t need to recompile for each change. For now I’m still working on the mechanics. The new Walls actually make the level a slight challenge. You can’t just kick the Ball three times and win anymore, although it isn’t all that more difficult either. Still, it is definitely a nice improvement. What is especially nice is that the Ball only spins if it is moving now. Once it stops, it stops spinning as well. Eventually I’ll change the rotation depending on which way it goes, which means more frames of animation to handle movement up and down.

I also decided to change the movement of the Ball. Instead of bouncing perpetually between the Walls, it now stops upon collision. I think handling the Ball movement will be more interesting this way, and levels can be created that take advantage of the fact that the Ball stops once it hits a Wall. We’ll see how it works out. It’s actually more of a puzzle now, so I think it might stick.

The Player

Next, I wanted to change the image of the Player. A white stick figure isn’t all that exciting. A non-animating stick figure is even more so. If he can’t move between two Walls, that would be a problem. I needed to provide a better Player.

I didn’t exactly want hyper-realistic graphics, but I realized that I hadn’t thought of an art style to use. I was thinking about making it simple for now and using a cartoon blob, but I felt it would be cheap and would make it look too much like Lolo. I wanted something that showed character but was also mine. I still wanted a cartoon feel to it, but I thought I would do well to make up a nifty character. Beetles? Snails? Pigeons?

I made a quick drawing of a corporate cubicle dweller. No reason, really. Yeah, this is all very temporary, but it is easier on the eyes, as you can see:

Image of updated Player and Ball

The Player still floats around the Room, but I figure that animating him would be premature. I would prefer something a bit more adorable than this guy. B-)

Downloads:

codenameOraclesEye-r97.tar.gz, 8.0 MB
codenameOraclesEye-r97.zip 8.5 MB

To build, you will need libsdl1.2 and libsdl_image. Go into source/kyra_2_1_1/kyra/engine/ and run ./make. Then, you go back to source/ and run ./make. To run, ./oracles-eye.

Only available for Gnu/Linux currently, but apparently it doesn’t take much to get it to run on Windows. Thanks, Scott!

Categories
Personal Development

Focus, Focus, Focus

Action wrote about Feeling Success, a phenomenon in which you can actually feel yourself succeeding. I think it sounded like being in The Zone. You can’t lose because you are in a mode that is beyond your normal capabilities. It’s a good read, especially the part about cultivating this feeling.

One of the drawbacks of “feeling success”…is that you get super-focused and put a lot of things aside. When I begin to “feel” the business….I am so focused that I have to stop a lot of other activities.

Can I “feel” the business, while still living a balanced life. Maybe. But I think hyperfocus is imperative.

I think the key to maintaining a balance is to apply your ability to focus on things other than your business. Being able to maintain focus on a single task or event is key to keeping from being overwhelmed. The best part is that it works for everything, not just your business.

Are you hanging out with friends? Stop worrying about the coding issues you’re having! If you come up with an idea, by all means write it down, but stop thinking about it and focus on being with friends.

Are you eating? Focus on your food. Taste it. Chew it. Swallow it. Enjoy the experience. Then go back to the business after you’re done.

Some people make it a point to work for an hour early in the morning, every day, without fail, no matter what. People can die, disasters can happen, but they will do whatever it is they dedicated themselves to doing at that early hour. Dan Kennedy writes, for example. The ability to focus on the task at hand is important in getting things accomplished and making progress on your goals.

Amazingly, I was just thinking about this very topic today. I realized that it can be very easy for me to be distracted from a task. I was writing down the somewhat-detailed action plan for my game development work tonight. Whenever I got stuck or paused for a moment to think, I realized that I mindlessly started browsing through my Active Bookmarks. I would read someone’s blog (in fact, two blogs at the same time! Yeesh!), then stop and work on my plans. I would check email. I managed to get the plans finished probably because they were so small. I could have finished them in minutes, but instead I let distractions get in the way. A little too easily, I think.

Maintaining focus is something I will need to improve. I’m able to accomplish quite a bit as it is, but if I could really focus on my tasks, I would be unstoppable.

Categories
Game Development

Oracle’s Eye Development: Kicking the Ball Some More

Working off of the list of improvements for Oracle’s Eye, I managed to improve the hit detection somewhat.

I was originally thinking about changing the movement code completely. Instead of freely moving about, the Player and Ball would move in a tile-based manner. I spent a bit of time thinking and writing about how I would go about implementing a tile-based game, and I still believe that it might make some things easier. I could also start adding different objects easily.

But when I sat down to code, I decided to continue to do what seems to work for me: mold the existing project until it works.

A major problem with the movement is that the Ball can get stuck in Walls. It can bounce back out normally, but if the Player is too close, it will get stuck in the Wall. Unfortunately, one of the ways I tried to avoid problems with movement causes a very annoying bug. If the Ball moves into the Wall, it is supposed to move back out at twice the distance. It looks like it bounces back out. But if the Player is touching the Ball, it stops moving. Well, if it stops moving, it won’t bounce back because the reverse of stationary doesn’t exist! The next update through, if the Player moves, the Ball wants to move with the Player; however, because it is stuck in the Wall, it “bounces back”. The result is that the Ball looks like it is going the exact opposite way that the Player would expect, which makes the game feel buggy. And not the good, on-purpose buggy, either.

I’m not a fan of guessing with my code. If X = X + 1 doesn’t seem to work, I don’t just automatically turn it into X = X – 1. I prefer to analyze my code and try to determine what exactly is going wrong. In this case, I found that each update, the Player moves, then the Ball moves. Then the Kyra engine’s tree is walked, which allows me to accurately handle collision detection. The next step is to check if the Player collided with a Wall. No problem there. I just reverse the direction of the Player, move him, then change his direction to STOPPED. Then I check if the Player collided with the Ball. If it does, then the Ball will take on the direction of the Player. It makes sense in most cases. If the Player touches a stationary Ball, the Ball should act as if it had been kicked in the same direction that the Player was moving.

When the Ball is near a Wall, however, the Player can kick a Ball, and the Ball can bounce off the Wall. Now the Player and the Ball overlap. Again, it is not a big problem. If the Player moves, the Ball follows the Player. The problem occurs when the two overlap AND the Ball is overlapping the Wall. The Player moves, makes the Ball move, but then the Ball wants to reverse itself.

I found that most of the Ball/Wall overlap can be avoided by changing the order of the collision checking code. The Ball will check for collisions first, then the Player will do the same. The Ball might still get stuck in the Wall, but I’ve found that it is a quite a bit more rare and not as dire a situation. It is a lot harder to reproduce the issue, but of course, right when I was about to say that the problem was completely solved, it occurred.

In any case, it was a quick fix and didn’t require any new code. I’ll probably continue to work on this same issue, but for now it has been vastly improved. I think I will also want to change the size of the Ball. The diameter of the Ball is the width of a Tile, which makes it very difficult to maneuver. If there is a single Tile opening between two Walls, a player might find it incredibly frustrating to try to get the Ball in between. It is part of the reason why I was thinking about using Tile based movement. I should eliminate this problem entirely. Of course, Duke Nukem Forever has had its engine gutted and replaced a number of times, and I would actually like to complete this game soon. B-)

Download files: EDIT: I decided to take down this set of downloads. For both tar.gz and .zip files, it comes to about 16.5MB, and I’m running out of space on my server apparently. This update doesn’t exactly merit its own release, so I will remove it and allow space for better uploads.

Categories
Game Design

Game Design Directions

Cliffski juxtaposes two theories about the direction new games should be developed.

On the one hand, technology is getting more complex. Everyone uses computers, everyone watches involving television shows, everyone has a cell phone that has more computing power than the first computers did. Why shouldn’t games also become more complex to keep up?

On the other hand, information overload is very real. People don’t understand that “their Microsoft” isn’t broken. There are too many channels to surf. Too many websites to look at. Life has become overwhelming, and games should become a safe haven. Make them simple, and people will enjoy them more. It isn’t fun if it feels like work just trying to get the game to start.

Cliffski leaves it at that, but I guess that’s where we’re expected to come in and talk about it. Diabolical!

Steven Johnson, author of “Everything Bad is Good For You: How Today’s Popular Culture Is Actually Making Us Smarter” would argue that the Sleeper Curve is at work. Popular entertainment is requiring more and more brains to “get it”. He compares classic shows such as Dragnet with 21 Jump Street, and he demonstrates how today’s shows, even “reality” shows, are just more complex. Dragnet was easy to watch. One event led to another. Everything was sequential. People would say the obvious as an aid to the audience. While watching it today might bring back some sense of nostalgia for some, you’ll quite frankly get frustrated at the simplicity of it. They hit you over the head with plot points and dialogue.

Today, even the “dumbed down” shows have more complexity than the brightest shows of the past. You just need to think more to understand television today.

Similarly, I think, with video games. A child today is able to work with a complex piece of equipment such as an XBox controller as if it was an extension of his/her body. Children look at older games with disgust. They make fun of Pong and Super Mario Bros. My cousin laughs at me for loving Pac-man instead of some new racing game that’s all the rage.

But what about people who don’t play video games? There is a learning curve involved, and for some games, that curve is incredibly steep. Casual games are meant to be simple to play, and it would be easy to say, “Complex games for those who can handle it, and casual for the rest”. But are these people relegated to playing casual games exclusively?

I don’t know how to play poker, but I don’t want to play Go Fish or solitaire all my life either. Won’t military history buffs want to play accurate war games? Games like Uncommon Valor, as great as they might be, might not be appropriate because they are just so darn complex! I bought this game thinking that it would be like Koei’s PTO II, which I had bought for the SNES. It turned out that it was incredibly detailed, and focused on a very specific part of the Pacific Theater of Operations. I tried to play a few turns, but it was hard to tell if I was doing anything important. Oh, to have hours a day to play games again…

So while you can focus on making a game complex to keep up with the Sleeper Curve or making it simple to provide relaxation for the mind, I’d have to argue that some people might not appreciate the idea that you need to “dumb down” games for them. Sure, there are some people who will say, “I don’t want to think!” but other people WANT to be challenged. They don’t want to passively have fun. They want to be involved in the fun!

So I think I won’t be as quick to complain if someone takes an old game and remakes it with “more weapons ” and “better AI” anymore. It seems to be a natural step to take something and add complexity to it. Those kinds of games might not be all succesful (Tetrisphere comes to mind), but I don’t believe there is any law that dooms them all to fail.

But adding complexity doesn’t necessarily mean making it impossible to play. People figured out how to drive cars. Automatics were added to make it easier, but you don’t see labels like “casual driver” being thrown at those who use them. I think you can add complexity and the requisite brain power to play a game while simultaneously providing the player with the means to easily “get it”. You can also do so without upsetting the veteran game player who doesn’t need any hand holding. It’s a balance, and it might be tough to achieve, but hey, that’s what helps a great game appeal to such a wide audience, right?

Categories
Politics/Government

Illinois Video Game Ban Ruled Unconstitutional

Governor Blagojevich plans to appeal a ruling by U.S. District Court Judge Matthew Kennelly that deemed the Illinois restrictions on sales were unconstitutional.

“This battle is not over,” Blagojevich said in a statement. “Parents should be able to expect that their kids will not have access to excessively violent and sexually explicit video games without their permission.”

He also added excessively violent movie tickets, DVDs, books, magazines, and cable television would be added to the list.

No, wait. That would be logically consistent. I made that part up.

Anyway, my favorite part from the article:

“In this country, the state lacks the authority to ban protected speech on the ground that it affects the listener’s or observer’s thoughts and attitudes,” Kennelly wrote.

Of course, what impact will it have on banning indecent material, such as porn? Wasn’t the point of doing so to prevent children from “being led astray”? You know, by affecting their thoughts and attitudes?

I didn’t read the official ruling, but I would think that that statement alone might do more than expected. Was it careless? I’m not a lawyer, but I think it was.

At the same time, while I am not a parent, I am not sure that I would want my government dictating to me what my children should and shouldn’t be able to see, read, or hear. No porn? No violent content? Yeah, I’ll just ban it in my own home, thank you very much.

Of course, banning the sales of such games to minors wasn’t really going to have a huge effect. Most of the time the parents buy the games for them anyway, and according to some anecdotal reports, they buy them even if the clerk at GameStop asks, “Are you sure it’s appropriate?” So how does the law help parents be better parents?

It doesn’t.

So why am I upset about such a law? If it wouldn’t have a big effect anyway, why oppose it?

Because if this law is allowed, then what’s to prevent someone from going further the next time? Will the actual development of violent games be banned next because the previous was found to not be good enough? Will the government actually be able to accurately rate games as appropriate or not, or will it just use vague language to cause a lot of confusion, resulting in the banning of games like Super Smash Bros Melee along with Mortal Kombat and GTA?

The government has enough problems and issues to deal with. Parenting is a tough job, and the government is not going to be able to do it.

Categories
Game Design

Somewhat Interesting Game Idea: A Buggy Game

On the way home last night, I thought, “What if you can make a game that looks and feels buggy, but was purposely made to seem that way? A game that is fun because it seems buggy, but in reality it isn’t?”

It sounds weird. Or at least I think it sounds weird. I don’t know of anyone purposely making a game seem buggy, but if you do I would love to know about it. Software, and video games are no exception, is generally hard to keep bug-free. There is the idea that every program has a bug in it. It’s hard to completely and comprehensively debug a program. But that’s besides the point.

I’m talking about making a game where the “glitches” and “hiccups” are purposely created. You are walking down an alley, and a ninja comes out of nowhere. Except he seems to flicker and splits into two images of the same character. You know, like the Mouser bug in Super Mario Bros 2 (which is apparently not documented on the Interweb?). It was still one guy, and you only had to hit one guy to defeat him, but it had a bug where it move back and forth fairly quickly. Well what if you made the bug funny? Like, the ninja’s split image made faces at you, or looked like a clown?

Or how about that same ninja being able to run through walls? Or if you could run through walls? You know, when you’re temporarily invulnerable because you just got hit. What if it lets you walk through walls? Or what if you jumped at a wall and got stuck on the side of it, allowing you to climb up? I’ve survived pits in the original Super Mario Bros. or Bionic Commando because of bugs that allowed me to stand next to a wall without falling. Wouldn’t it be interesting if they were purposefully placed into a game?

It would make the gameplay interesting because part of the fun is figuring out what weird thing you could do next. What inconsistency would you be able to leverage to progress through the game? Would you be able to use water to put out a fire but find that the water itself burns because, you know, “fire burns everything”? Could you use that? What if you could punch a firepit? Or swim both in the water and in the air? What if you could kill your ally, but your ally comes back for a cut-scene? Original War had a bug similar to this one. Generally people in your army talked, and an image of the person speaking would appear. Once in a great while, the image and/or the voice would not match the person who should be speaking. So what if your ally returned, bloodied and bitter, but due to obligations in the game, HAD to come back to make a speech?

So maybe it isn’t necessarily a “buggy” feel so much as a “this-is-not-the-universe-you-think-it-should-be” kind of game. The point would be that reasonable expectations are thrown out in favor of surprising the player with odd behavior and unexpected reactions. It might be tough to develop such a game. After all, keeping track of real bugs, the difference between actual results and expectated results, would be a chore. But it would also be different enough that it might confuse players more than anything. Who would find it fun? I know I like to explore the boundaries of a game. I once jumped over the flagpole in Super Mario Bros. I’ve fallen off the edge of the screen in Super Mario World while spinning. Side note: are Nintendo games that much more buggy, or is it just me? B-)

NOTE: If you are somehow reading this post without the comments, I would strongly suggest you read them, too. Some good discussion is coming out of this post, and you’ll miss it!

Categories
Marketing/Business

Shareware Development Takes Patience

Tom Warfield had a number of articles written years ago that I’ve never read, and he’s been updating his blog by reposting them. The latest such article is How Long Does Great Shareware Take?, which he originally published in 2003.

Now, it is generally understood that you can’t go into indie game development and expect to become rich overnight. Steve Pavlina’s article on the difference between shareware amateurs and shareware professionals notes how important it is to realize that version 1.0 isn’t the latest version of your product. You release, fix, rerelease, update, rerelease, etc. Warfield mentions that most shareware products don’t do well initially, and his Pretty Good Solitaire actually took months to sell one copy and years before it was sufficient to live off of the sales.

Last month I found a thread on the old Dexterity forums about shareware games, and there was a discussion between Pavlina and Warfield likening their business models to rotating a flywheel. It’s harder to turn at first, and it might seem like you are putting a lot more effort into it than getting rewards out of it, but eventually it gets easier and easier to turn faster and faster.

But patience is required. If you aren’t satisfied with the immediate results and try to change them, you’ll constantly change and never let anything last long enough to actually work. If I kept restarting my own game development just because it took longer than a month, I would probably have four partially finished projects instead of one, er, much-more-completed project. And I’m just starting out! I’m just now getting feedback about the game from people, some of whom haven’t had a chance to actually see it in action.

If Joel Spolsky says that great software takes 10 years, and Warfield and Pavlina have said similar things for shareware games, then it would make sense to plan for the long haul for indie game development, especially when you are flying solo and aren’t able to lean on 10 employees of varying skills and talents.

Categories
General

My Hair Was So Stupid Back Then…

I am working on my business plan, and part of it entails figuring out which payment processors I would like to use. I know that the question crops up on the Indie Gamer forums a lot, and so I searched through the archives.

You know how people look back at high school photos and laugh at everyone’s hair? “Man, I can’t believe we thought we looked cool back then.” That sort of thing?

Well, going back over your year-old posts on old forums is kind of like that. Or at least it is for me.

Check out this thread about creating a sacrificial title. David York asked if it made sense to create a simple, easy to make game to gain the experience of making a game and selling one. Since hindsight is 20/20, why not make use of it before you make your serious game?

Now check out my response. It was posted July of last year, and I have definitely learned a lot since then.

I agree, though. Start small and work your way up. Gain experience, and then you can start to tackle the bigger projects.

Wow. Sage advice. Where the heck did I get off giving it back then, though? I am certainly no guru today, and a year ago I didn’t even really have any experience to speak of. Maybe it seems like obvious advice, but there are other examples where I was talking about theory as if it was practice.

I am sure Indie Gamer and GameDev.net and the Association of Shareware Professionals Members newsgroup abound with similar advice by yours truly.

At one point I realized that I really shouldn’t talk like I knew what I was saying when I didn’t really know about the topic, but I soon discovered that prefacing everything I said with “Keep in mind that I’m not speaking from experience, but …” wasn’t any better. And at one point I started to wonder if the “Man, these forums are starting to get a high noise-to-information ratio” wasn’t directed at me. So I stopped posting as much as I did.

Which was good because I didn’t spend so much time on the forums and was able to direct my energies to more productive matters. I can’t get paid for being one of the top five posters on the board, and I definitely don’t have as much advice on the business-end of things as other people might to justify that many posts.

It was like finding an old email I had sent to root at the email server used by my college in my freshman year. I had asked how to setup a website on the server, and he wrote back explaining how to create the public_html directory and changing the permissions to allow everyone to view it. At the time I had no Unix or Gnu/Linux experience, and so I actually wrote back, “Thanks, but I think it needs a better user interface.” Reading that email four years later, after I’ve been using Gnu/Linux as my main OS and have a much better understanding of permissions and Unix in general, made me laugh.

Man, was my smiley funny-looking a year ago…

Categories
Personal Development

Action vs Waiting, Practice vs Talent

Action wrote Debugging Habits: “Wait and See” vs. “Act and Learn” in which he discusses the results he gets by taking action versus waiting around for things to happen or fall into place.

On a similar topic, David Seah wrote Building a Niche of One, in which he discusses leveling up abilities by orders of magnitude. He cites an article that claims talent isn’t the only thing. Practice is just as important.

Just like successful songwriters need to write hundreds of songs before they get their “overnight” hit, chess players need to play thousands of hours worth of games to become good at chess. Seah was nice enough to provide a graudated scale. 10,000 hours over the course of 10 years might make you a master, and it sounds daunting. Well, yeah. It is. That’s a lot of dedicated hours. But 1,000 hours is doable within a year if you work full time, and you can be an experienced expert. Already have something taking up your full time? 100 hours can be done on the side, and you can still be somewhat of an expert. 10 hours could be a dedicated weekend or spread over a few of them, and you’ll definitely learn enough to be dangerous. Even dedicating an hour to a task will give you practice with the basics.

I’ve never liked the idea that some people are just never going to have certain talents. It sounded too much like your lot in life is set before you, and you never had a chance to make a difference one way or another. “Some people just aren’t meant to be programmers” or “Some people just aren’t musically inclined”. I personally think that if they aren’t going to be able to do it, it is because they’ve decided that they won’t do it. It wasn’t due to any inability except to take action, any action. I’m sure talent is important, but I also believe that talent isn’t always inate. Left-handed people might be more creative initially, but I’m sure if I practice being creative enough, I’ll also get a +4 creativity roll. Or at least be much better than I am. No law says I must stagnate.

I can play chess, but I don’t have nearly as much experience as a friend of mine does, and he destroys me almost every time we play. Almost, because I’m slowly getting better. One game I almost won, and one time I managed to take his queen before he realized his mistake. B-) I also play as Terran in Starcraft, and while I know “how” to play, I am almost always struggling to survive by the end of a game. Almost, because there were a few games where I made a decisive strike that would have turned the tide of battle permanently in my favor if I had only paid attention to producing more units (Larry, I will defeat your Protoss!). When I first played Quake 3 Arena, I was the n00b that would stand on a platform and look around while rockets and machinegun fire found me like mosquitos on a hot summer day. Eventually I became the regular leader on the boards within my group of friends. Well, until they remembered how to play again (there was a long absence from the game for a lot of us). Even then, I was holding my own. I gained experience and was able to play more competitively. I became better, even though I stunk something fierce when I began.

Whether it is programming, meeting women, writing novels, juggling, brainstorming, or playing games, taking action and getting the experience of the attempt, whether you accomplish your goal or not, will always improve what you know. How can I possibly learn the best way to design a C++ class in my game project if I don’t get familiar with the problem domain? How will I learn how to write the next great American novel if I don’t try to write anything before taking it on?

I’ll make mistakes. I’ll make HUGE mistakes. I’ll probably look silly. But I’ll only have myself to blame if I don’t learn from it. I’ll take a variation of “Fool me once, shame on you. Fool me twice, shame on me” as “I stumble once, and that’s expected. I stumble again, and I should have marked the stupid rock on a map!!”

Perfect practice makes perfect. No one is perfect. You’re expected to make mistakes. Learn from them. Then do better. Then do better again. Take action, practice and learn.