You know what I never seem to do?
Work on the same project for longer than a week. Kinda a problem I've had for ages.But I've managed, over time, to discipline myself and learn to ignore the annoying little voice in my head that tells me that every new idea I have is what I should be working on. So, my game that won me first place in the locally-hosted NAGJam has been the focus of my attention since I submitted, and I intend to keep it that way. I want to take this through to completion, put it up for a couple of bucks and take that experience forward into my next project. And for once, I don't have a definite "next project". I'm actively discarding ideas at this point, keeping a laser-like focus on my current work. Hopefully I'll follow through on this; I really need somebody to stand behind my chair and slap me alongside the head when I get sidetracked. I'm going to attempt to write a semi-regular (Possibly weekly) log of development on the game, along with any problems I encounter, tricks I discovered, the occasional beta release… I do find that writing about your plans regularly, telling other people about them and showing them the unfinished product tends to instill a need to finish said product or face the consequences (Awkwardly telling people that you're kinda not working on that thing you were so hyped for a week ago.)The Game at a GlanceTo keep things simple, the game is currently a very small hack 'n slash action game. You run from the starting room into the boss room, die, return and try again until you win.After that, you get booted back to the title screen after a congratulatory message. What the game was meant to beI'm not going to lie, my entire thought process going into the game was basically: Can I translate Souls style gameplay into a simple top-down representation, ala Gauntlet?Answer: Yes, but I didn't get that far. Or at least, the demo didn't.Some of the original trappings I discarded were things like random world generation (Always a dumb idea for a game jam), Diablo style enemies and boss groups (Too complicated for a jam), and local co-op (Would have been nice, but again, JAM).At this point I've added all of these to my to-do list for post-production (Stuff to add after the game is feature complete).The PlanCurrently, I have a clear idea of where I want the game to be, and have it down into a long list of small to medium size features that I can implement easily in chunks; this is a design method that definitely works (For me), and has been leading to a sizable list of "completed" goals, which is encouraging.My goal is to keep working like this, adding necessary features to my game until I reach a point where I need to branch out into "world building". This is where things get tricky and I need to come up with the path of the actual game, basically "where does the player fit into things and what is their goal?". Also, dozens of enemy sprites.The EngineI toyed briefly with the idea of moving the game over to MonoGame, but decided against it over reasons of efficiency. Yes, it definitely would be nicer to work in an actual programming language, especially one with classes and proper scoping, but the process of moving and setting up the game in a new environment would cost me weeks in which I could be actually making the game in the existing setting.Game Maker is far from ideal as far as toolsets go, it has severe limitations to performance and capability. But it's still adequate for my purposes. My justification is that while Language and Framework X has a list of nice features, I don't really need them to complete my game.GM is full of quirks and things that I need to work around in order to achieve my desired results at times, but they are, at least achievable. I've also learned a few handy tricks to make things easier to work with too, as detailed below.Working with GM:SThe game, as I want it, is basically a big stat-fest. Everything in the game is tied to stats, attributes and states in some way or other, and this gets difficult to manage… if you're doing things in the usual way.Thinking ahead to when I'll need ways to not only save and load state but potentially share it across games (Think online co-op), I've opted to save any and all state in ds_map structures.To make things easier to manage from a single location, I have created several scripts that handle different "classes" of data. Here's an excerpt from one of them:///sc_create_stats()
_struct_stat_table = ds_map_create();
stat_hp = 0;
stat_hp_max = 0;
stat_hp_refresh = 0;
stat_st = 0;
stat_st_max = 0;
stat_st_refresh = 0;
stat_str = 0;
stat_dex = 0;
// etc...
<constants number="34">
<constant name="stat_hp">_struct_stat_table[? "hp"]</constant>
<constant name="stat_hp_max">_struct_stat_table[? "hp_max"]</constant>
<constant name="stat_hp_refresh">_struct_stat_table[? "hp_refresh"]</constant>
<constant name="stat_st">_struct_stat_table[? "st"]</constant>
<constant name="stat_st_max">_struct_stat_table[? "st_max"]</constant>
<constant name="stat_st_refresh">_struct_stat_table[? "st_refresh"]</constant>
etc...
</constants>
// Create Event
sc_create_stats();
sc_create_object_state();
// Step Event
switch(game_object_state) {
case STATE.IDLE:
game_object_state = sc_ai_check_area();
break;
case STATE.CHASE:
game_object_state = sc_ai_chase_entity(game_object_target);
break;
case STATE.MELEERANGE:
game_object_state = STATE.ATTACK;
break;
case STATE.ATTACK:
sc_entity_attack(game_object_target, self.weapon);
game_object_state = STATE.COOLDOWN;
break;
case STATE.COOLDOWN:
game_object_state = sc_ai_action_cooldown(stat_atk_cooldown, stat_atk_cooldown_max);
break;
default:
game_object_state = STATE.IDLE;
};
Yep, writing about the game weekly really helps.
I don't have problems with cancelling games, but I do more progress this way. Also it reminds people that your game exists =PAside from that…In computing in general: