Category: development

Gearing up for Ludum Dare 28

I’m getting myself ready for LD48-28, deciding my general approach to take to this project. I like to do this ahead of time so I can get certain design considerations of the way, impose creative constraints, and focus on a particular goal within the scope of my project, independent of the theme.

Tools

IDE

GameMaker Studio

As usual, I’ll be making use of GameMaker Studio for my development, and probably only targeting Windows .exe build for the initial release, with a possible HTML5 build eventually if feasible.

I don’t have any particular aim this time around to use any specific features of GameMaker, we’ll leave that up to the theme and game concept to drive those decisions this time.

Graphics

Paint.NET, and Pickle

I’ve given the new Pickle 2.0 a try and while it’s no longer free/donationware, I do think that I at least like it for its onion skin feature that enables easier animations. I can see a lot of potential improvement for Pickle, and to that end I’ve written up a number of feature requests and enhancements and sent them along to the developer. I’ll be really excited if any of them get picked up and implemented.

I am going to use my pixel art minimalism technique, and also I intend to use a tightly constrained color palette. Not sure yet how few colors I want, but maybe a 4-color monochrome palette a la classic GameBoy would be fun. In any case, I’ll be making an effort to use only the smallest number of colors necessary, and paying close attention to how color works in the graphics I develop. I am going to see if Paletton can help me make better palette selections, and if I can apply what I learned from this coloring tutorial that I recently came across thanks to Joe Peacock’s recommendation.

Audio

Bfxr

Bfxr, of course, for sound effects. Maybe also some recorded audio samples for stuff that I can’t do well in bfxr.

Famitracker (maybe)

It’s probably still ambitious for me to try to pick up and learn Famitracker in a weekend and use it to good effect. I’ve been putting off learning it, though, and I want to have some kind of bgm in my game. Whether I end up using it or not in my LD project, I’ll be making an effort over the next few months to figure it out and put together some compositions with it.

Ohio Game Developer Expo 2013

This Saturday, 12/7, is the first annual Ohio Game Developer Expo. I will be there and am looking forward to meeting people and participating in the discussions and activities.

http://www.ohiogamedev.com/

http://www.ohiogamedevexpo.com/

GameMaker Studio 1.2.1146 update greatly expands tutorials

From the release notes:

  • Tutorials and Demos are now downloaded from our servers, reduces installer size – allows us to add many more tutorials and demos
    • Uses an RSS feed to get the information, allows other feeds to be added
    • Users can create their own RSS feed for their own Tutorials and Demos
    • 16 New Tutorials added that cover a variety of subjects from getting started, through touch controls to ads and facebook integration.

This is a very cool feature indeed! The ability to add third party RSS feeds to the Tutorials and Demos promises to make the GameMaker developer community even tighter, by accelerating the sharing of knowledge and techniques. While there is a great deal of information on how to do things in GameMaker at the GMC Forums, on various websites, and on YouTube, now users will be able put everything into a nicely aggregated channel accessible directly through the GameMaker: Studio IDE.

I’m really looking forward to seeing what the community of developers, which likely numbers in the thousands or tens of thousands, comes up with.

If I had a nickel…

One of the nice things about being an indie game developer is the community of devs who find each other through the internet. On one community that I frequent, I posted an idea a few weeks ago:

Starving Indie Marketing idea: Add a global counter for the total number times the game has been played by anyone, anywhere. Every time the game state reaches “Game Over”, the counter increments.

Then as the game over screen is displayed, the text: “If I had a nickel for every time someone played my game, I would have $” + global.games_played/20 + ” dollars…. In reality, I have $” + revenue ” dollars.”

Then display the IAP screen.

I’ve been wanting to see this tried, but haven’t been ready to set up a game for commercial release, so I just put it out there for anyone to run with it if they wanted.

So, one of the guys did! Jason Artis, of Hurgle Studios, is working on a Sudoku game for Android called Sinister Sudoku. Currently in beta, it will implement my “If I had a nickel” idea. So I’m really looking forward to seeing if it helps draw revenue.

My theory is that by providing immediate and direct information to the player about how well the game is doing, it will help provide the necessary incentive to the player to pay for a game if they enjoy it, to encourage the developer to continue working and release more games. I believe many players justify not paying for games because they rationalize that the game must be a success and must be making the developer all kinds of money, when the reality facing most indie game developers is anything but that. I like the free-to-play because it lets you experience the game to see if it’s worth paying for before you sink any money into it, and I like pay-what-you-think-it’s-worth models because it removes the excuse that many freeloaders use when pirating games that they’re “too expensive” and that they “would pay something, but not that much.”

Hopefully, by showing just how much revenue a game has generated, it will get players to realize how much labor and expense goes into producing a game, and drive home an understanding that it’s not free to produce them, and that good development cannot be sustained by low revenues. As a result, my hope is that those who are able to pay for games will be more likely to pay what they can and what they think the game is worth.

DRM signals early death knell for legacy GameMaker development

It’s generally known that GameMaker 7 and 8 use a DRM technology called SoftWrap to manage license and product activation. Today, YoYoGames released the following announcement, regarding this technology:

http://yoyogames.com/news/172

Update for GameMaker 7 and 8 Customers: Please Read

We want to inform all GameMaker 7 and 8 customers that Softwrap, our exclusive technology provider for GameMaker 7 and 8, has announced a change to its business. By August 31, it will no longer be possible for GameMaker 7 and 8 customers to install or reactivate their licenses. After August 31, if you are having issues reactivating GameMaker 7 or 8, please register a ticket that includes your Softwrap license code via the YoYo Games Support Center and our agents should be able to help you.

In reaction to this news we would like to help migrate users to GameMaker: Studio. “Studio” is the current version of GameMaker and the only version where we offer regular updates and support. We’re therefore offering customers of GameMaker 7, 8 and 8.1 an upgrade to GameMaker: Studio Standard for only $9.99., which is a $40 saving on the regular price.

To upgrade to GameMaker: Studio Standard, simply click here and enter your Softwrap license number to purchase a license for GameMaker: Studio Standard.

For more information on how to migrate games from GameMaker 7 and 8 to GameMaker: Studio Standard, please read our Wiki entry “Porting GameMaker 7 and GameMaker 8 to GameMaker: Studio.”

We apologize for this inconvenience but hope you find our offer to upgrade to GameMaker: Studio compelling enough to take advantage of it.

Thank you for your continued support of YoYo Games.

The YoYo Games Team

It’s not entirely clear from this what the help YYG plans to offer GM7 and GM8 users will consist of, or how long they’ll continue to offer this help.

A consumer friendly failsafe for the contingency of the DRM license servers going offline should be to unlock the product for all users. Not doing so can present a great inconvenience. If YYG and Softwrap goes out of business, or simply change their policy, that’s it for your GameMaker license. Short of hacking around its product activation, there’s no way you’ll ever be able to use it again.

That’s for a product that you paid for. This changes the nature of purchases into something more akin to a subscription or rental — only, your continued right to access that which you have paid for is contingent upon the continued existence and goodwill of the business entity who provided it to you.

Imagine having a tool chest filled with expensive tools that you paid for, but then finding one day that the chest has become permanently locked as a result of the manufacturer going out of business. That’s what it’s like to use DRM-encumbered tools.

Offering a discounted upgrade path to developers who haven’t yet adopted Studio is better than nothing, but it’s likely that developers who are still on these old versions have not upgraded yet not because of financial reasons, but because of legacy projects that are not easily ported to Studio due to a dependency on now-deprecated functions that are no longer supported in Studio. For any such developers, migrating their codebase from GM7 and 8 to Studio could involve substantial re-engineering.

YYG no longer use SoftWrap DRM with GM:Studio, but does continue to use a DRM solution, and YYG have stated in the past that they will likely never abandon DRM. I disagree with their stance on the matter, but I recognize that it is their decision to make. I continue to recommend that they abandon DRM in the future, and figure out a business model that allows them to do so.

I also encourage them to release a non-DRM encumbered version of GM7 and 8 for existing licensees who wish to continue supporting legacy codebases that they are unable to port to Studio. When a business elects to cease support for a product that they released, the most ethical thing to me would be to release the source code for the product, so that those who wish to continue using it can develop their own patches and updates. Failing that, at the very least they should unlock any DRM that would prevent customers from being able to use what they’ve paid for.

Bad timing

Yesterday, my laptop’s Lenovo system health software warned me that my hard drive had failed a test back in late June, and that I should replace the hard drive “as soon as possible.” Why I didn’t see this notification back in late June, I’d sure like to know.

I have a spare drive laying around, an SSD, which I would like to move my files to, only it seems I can’t do it. I am trying to use a tool from Paragon Software called Migrate OS to SSD 3.0, which I got for free through a Giveaway of the Day special some time ago.

Now that I’m trying to work with it, it seems that the file migration doesn’t result in a bootable volume. Something is wrong with the boot manager, apparently. Paragon’s documentation recommends running a WinPE tool to build a WinPE USB drive, which can repair problems. But due to a change in the way Microsoft licenses the tools that their WinPE builder puts on disk, they no longer offer the tool. Supposedly they have replaced it with something else called Boot Media Builder, but as far as I can tell it’s not available on their web site either, although they have a download page where you can download a PDF of the manual.

This has taken 12+ hours and counting, and I’m still not out of the woods. I have a few more options to try, but it’s getting frustrating, and wasted a huge chunk of my dev time for the Summer Jam project, so I’m not too happy right now.

Epilogue:

I’m now running on a Crucial M4 256GB SSD, and successfully migrated the OS on my old, failing HDD over to the new SSD. Paragon Migrate OS to SSD utility worked, except for the crucial bit where it sets up the volume as a bootable system partition. Why it does this, I don’t know exactly, because it’s damn inconvenient of it not to do that. But it might have to do with the way Microsoft licenses their Windows PE technologies.

I previously had Ubuntu Linux installed on the SSD, and ran it for a while, and then found that I could not boot it from the ultrabay adapter for some reason, so pulled it out and continued to run Windows from the main hard drive bay. As a result, I got a clue from the first attempt when I put the SSD in to the main bay to boot from it, and got a grub prompt telling me that it couldn’t boot anything. That told me enough to know that the Windows 7 boot loader wasn’t present, and it was still using the Linux grub utility to try to boot the system, which, of course, wouldn’t work. I eventually fixed the problem by using my Windows 7 installation disc to install Windows to the SSD, and then re-migrating the OS from the old drive to the SSD, which now had the Win7 boot loader on it, and then was able to boot as expected.

I’m very happy with the performance of the system now that it’s on a SSD. Chrome launches instantaneously, and everything is much snappier than previously. I’m not sure how much of that to attribute to the hard drive being a hard drive, and how much of it to attribute to it being a failing hard drive, but full or failing hard disks definitely hurt performance in Windows. No longer having 10-30 second delays to launch apps is kindof exciting.

Unfortunately, I lost the entire day to this, and now have pretty much given up hope of finishing my game for the Cleveland Game Devs Summer Jam. After being sick and missing Global Game Jam 2013, and then basically blowing off Ludum Dare 26, I’ve lost 3 good opportunities to make a new game. :-/

Cleveland Game Developers Summer Jam 2013

Cleveland Game Developers Summer Jam 2013 is underway!

Theme.announce() {return “The Butterfly Effect.”;}

I’ll be posting builds in progress at https://csanyk.com/cs/releases/games/SummerJam2013/web

Haven’t really thought of anything yet.
I’ve started an idea, not sure where I’m going with it yet.

GameMaker Studio: YYC beta promises performance boosts

A few days ago, YoYoGames released some new features in the beta channel that will be a part of GameMaker Studio 1.2. I took a few minutes today to test out the new YoYoCompiler.

I tried rebuilding my Radar demo project with the YYC, and found that I was able to get up to 8000 objects with it still running at ~30fps on my workhorse Lenovo Thinkpad T61p, 2GHz Core2 Duo, 8GB RAM, purchased in 2007. When I tried to run 40,000 objects in my radar demo, fps dropped to around 6-7. Presumably on a modern Core i7 CPU, one would expect to achieve much greater performance than this.

Using the old compiler, on this same hardware I was getting about 27-28 fps with just 4000 objects in my Radar demo, so it looks like the new compiler is giving about a 200% performance boost for this project. Not bad!

Of course the exact improvement depends greatly on the implementation details of a specific project.

Ouya Support: needs improvement

A few weeks ago, my kickstarter Ouya console arrived at my house. I was excited. Since every console is also a dev kit, I wanted to set it up and see if I could build a simple game for it.

I went to the website and tried to download the SDK, but found that I couldn’t. When I clicked the link, I got served an error message.

I sent an email to Ouya support to notify them about the problem, and received an auto response immediately, thanking me for contacting them.

The next day I figured out that I could get the download link to work, by trimming some unnecessary information from the url.

Weeks passed, and I forgot all about the email I had sent them. Today, almost 2 months later, I got a follow-up message. This time, it was a generic response, written like a form letter, advising me to go read an FAQ that might answer my question. Nowhere in the response was there any indication that a human had been involved at any point in reading my email, or generating the responses.

Obviously, I am disappointed by the experience. On the bright side, I figured it out for myself, and it didn’t cost anything. On the negative side, I got the impression that Ouya support is inadequate.

I imagine that they just don’t have the resources to provide higher quality free support for developers at present, and are overwhelmed by their success. This is somewhat to be expected, so I am understanding, but I do hope to see improvement from them in time. Developer support is, obviously, going to be crucial to the success of this fledgling new platform, and I do want to see it succeed and fulfill the potential that I saw in the ideas that they outlined in the original kickstarter pitch video.

GameMaker Tutorial: Password systems 3: on-screen keyboard

Yeah, I know. Last article, I said in this article we’d cover parsing and validation and converting the password into gamestate data. We’ll get there eventually. But I want to take a detour and show you how to build an on-screen keyboard.

In the first article in this series, I handled the user input simply, by using the get_string_async() function. This is good enough to be functional, but has two main problems:

First, because we’re allowing input directly from the keyboard, the player can enter any characters at all, which means that we’d need to handle characters that are not part of our password’s alphabet. This means extra programming. Not necessarily a bad thing, if that’s what’s right for the user, but it is more work to write up validation scripts that properly handle our Base64 password alphabet.

Second, the user experience of typing a password into a textbox is fine, as far as it goes, but it isn’t at all like an authentic old school keyboard system. This is a somewhat debatable point — old school consoles used on-screen keyboards not because they were better than keyboard entry, but because there was no keyboard. Entering passwords this way is slower and more tedious. But, if we are going to re-create the experience authentically, we need to heed the conventions of the time.

Every onscreen keyboard in the old days was a custom implementation. No two were exactly the same, although there were a lot of commonalities, and most of the differences were cosmetic. The most common implementation was a grid of characters, which the player selected one at a time using the D-pad, pressing a button to enter the character, and another button to go back. When the entire password was entered, typically the player submitted it by pressing the Start button, or sometimes there was an on-screen button that the player would select with the D-pad. We’ll build something like that in this tutorial, although we’ll use the keyboard rather than a gamepad control. Implementing the gamepad controller input capability isn’t too difficult, though, so I’ll probably come back and add that eventually.

The Alphabet and the Font

One of the problems people have with writing down (and later reading) passwords is that certain characters look very similar (such as 0, o O, l, l, 5, S, 9, g, etc.) You can’t help the player’s handwriting, but at least when the game is displaying the characters on the screen, you should be sure to pick a font that makes these characters unambiguous. These symbols are merely labels which stand for a number value, so it doesn’t really matter what they are.

It’s not a bad idea to omit the similar looking characters, although for this tutorial I’m going to stick with the full alphabet. We’ll at least want a font that has very distinct characters to aid the player in recognizing them correctly. Google for “programmer” or “console” fonts, for suggestions on good ones to use, and pick something out that looks right for the style of game that you’re making. Make sure the capital “I” has serifs and the zero has a slash or dot in it, and so on.

The Onscreen Keyboard Object

oOnScreenKeyboard

Create

alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!?";
font = fConsole;
var k = 1;
for (var i = 0; i < 8; i++){
 for (var j = 0; j < 8; j++){
 keyboard[i,j] = string_copy(alphabet,k,1);
 k++;
 }
}
row_selected = 0;
column_selected = 0;
instructions_text = "Press A to select letter. Press B to erase letter. Press Enter to submit password.";

input_string = "";
max_input_string_length = 4;

Draw

draw_set_font(font);
draw_set_halign(fa_left);
draw_set_valign(fa_top);
draw_text(10,10, "PASSWORD: " + input_string);

draw_set_halign(fa_center);
draw_set_valign(fa_middle);

for (var i = 0; i < 8; i++){
 for (var j = 0; j < 8; j++){
 draw_text(x+(32*i), y+(32*j), keyboard[j,i]);
 }
}
draw_rectangle((column_selected * 32) - 16 + x,
 (row_selected * 32) - 16 + y, 
 (column_selected * 32) + 16 + x, 
 (row_selected * 32) + 16 + y, 
 true);

Press Button1

(Pick whatever keyboard key you want for this.)

if string_length(input_string) < max_input_string_length {
 input_string += string_copy(alphabet, (row_selected*8) + column_selected + 1, 1);
}else{
 audio_play_sound(snBadPassword,1,false); 
}

Press Button2

(Again pick whatever keyboard key you want for this.)

input_string = string_copy(input_string,1,string_length(input_string)-1);

Press Enter

if validate_password(input_string){
 apply_password(input_string);
 room_goto(rmGameStart);
} else {
 bad_password();
}

Press Up

row_selected = (row_selected + 7) mod 8;

Press Down

row_selected = (row_selected + 1) mod 8;

Press Left

column_selected = (column_selected + 7) mod 8;

Press Right

column_selected = (column_selected + 1) mod 8;

That's it for the Events, but we need to write three scripts for the Press Enter event. These passwords are where most of the implementation-specific code is going to go.

The details of these scripts will vary from project to project, but this is where we'll handle the validation, parsing, and conversion to gamestate data -- what I thought we'd be covering in this article. We'll cover our example versions of them in the next article.