Cybearg

LD26

Settled

At first, I was going to try making a game in Gamemaker. I set it up to create different shapes of random colors, but I abandoned the idea I had been going for since I don’t know Gamemaker well enough to confidently spend time building a full game in it yet.

gamemaker

I’ve instead decided to do a game for the Atari 2600, since that is where my experience lies.

The theme is “minimalism,” so I was thinking of what would be fitting. I decided on a game where the player is a bat and needs to navigate invisible tunnels using echolocation.

I have a couple ideas for how echolocation could work. Either the playfield pulses a visible color for a split second or the player shoots out a missile in whatever direction (s)he is facing, the missile bouncing and growing darker with each bounce until it vanishes, like a sound pulse.

Though, as I ponder it more, I think that I may do a combination of the two. An attempt at paper prototyping proved that I have a very poor memory and I don’t want it to be too difficult to be fun.

Hitting the trigger will release the pulse. Each pulse will reduce the player’s points by a certain amount, while moving towards the randomly-generated cave to the right will score constant points. So the idea is to balance pulses against blind movement to create an overall point surplus. Balancing may be difficult. There will likely eventually be enemies that move around and must be avoided. Hitting the walls or enemies will lose a point of health out of three. There may be some way to regain a point of health after a certain number of points or for some kind of pick-up (that can only be seen with the echolocation pulse).

Programming progess is nil for the time being. Since I’m already three hours in, I need to get crackin’. Here’s the bat sprite against a blank playfield:

bat

Tags: 2600, atari

def

Note to self: don’t use spaces before/after the equals sign in a def statement.

Also, for some reason, batari basic doesn’t like me to use the name “pulse” on its own. *shrug*

Anyway, got the basic pulse working. It fades the playfield (currently set and not randomly generated yet) to an increasing color, then fades back out to black. I’m using the standard batari basic kernel, since I’ll need working collision detection.

pulse1

 

I may invest in no_blank_lines, though if I recall, that may mean losing my missile 0, which is out of the question. May just have to deal with those obvious batari basic lines.

Comments

27. Apr 2013 · 03:38 UTC
This is looking great already!!

pfscore1

I added a life system using pfscore1. Currently it doesn’t really do much, but I’ve set up the movement so that a collision with the playfield (based on the ball, which is in the center of the player sprite and rendered in the layer below so it’s not visible) causes the playfield to turn red and the player loses one life of three.

A bit it set to ensure that the player doesn’t continually lose lives. This means that a player could “abuse” the system by hanging on a wall to memorize the layout of a screen, but since that knowledge will only help them until they’ve gotten to the edge of the screen, I don’t consider it a problem. If the player really wants to make that sacrifice, why not?

pfscore1

 

I got around the loss of missile0 by having player 1 (the second player) be the player that is actually being controlled. This should work fine, since there will only be a single enemy on screen a a time, and it can just as well be player0 as it could have been player1, but since the enemy won’t have any attack, there’s no real cost in losing missile0. Thinking outside the box. :)

In a Flash

So, currently the player could spend all their points on sonic pulses and then fly left and right again to gain back any loss within that window. I’m not sure if this could be considered an exploit or not. To prevent it, I’d have to monitor continued player progress and only award points for new pixels explored, but that means a running tally. While that is impractical for a single byte, since one could get to 255 within just two screens, using two bytes would fix that exploit. For now, I think I’ll leave it as is, to see where it goes. The advantage of being able to grab some 30 or so points by flying back and forth is negated by a little addition that subtracts points when you fly backwards.

The lives and pulse all work. Now to take a bite out of the tough part: the Assembly to scroll the playfield and create randomized caves. If I can’t find a good way to build challenging caves randomly, I’ll have to design ’em. I would prefer randomization, since it allows for infinite replayability.

Once I get the Assembly working, I’ll need to add in the bouncing ball, which may take a bit of a trick as well. Hopefully I don’t start overdrawing cycles. The game logic is pretty simple so far (or so it seems), but the Assembly routines to scroll the playfield can gobble up cycles fast.

At least debug cyclescore reports I’m never going under 2300 remaining cycles, so I should be in the clear.

pulse2

Time to stretch my legs a bit!

Randomization

So this is what a randomized playfield looks like:

pulse3

I think that I’ll need to stick to pre-made playfields unless I can come up with a really clever way to make the game randomize cave-looking areas with enough space to maneuver so its’ not completely unfair like this.

The upside of having the stages pre-planned is that they’ll generally be of higher quality because they were intentionally designed to be a certain way. The downside, of course, is that they come to an end, and so does the game.

Signing Off

I’ve made some great progress and I’m satisfied with where I am for now. I think it’s time to hit the hay.

After some testing, I realized that, although randomized, the same patterns seemed to show up over and over, even when running on a real Atari 2600 (courtesy of a Harmony cartridge). So even if I had a means of randomizing a semi-decent cave, it would appear more pattern-based than any designed cave.

In short, instead of scrolling the playfield at the mid-way point as initially intended, I’ll allow the player to hit the far right wall and will then load in a random map and set the player sprite back to the far left side. It doesn’t have the visual elegance of a constantly scrolling background, but there was something I neglected to consider:

Each of the playfield blocks are 4 pixels wide, so they can’t smoothly scroll in. Either I wait 2-4 loops before bringing in a new playfield block (which means the player’s sprite would just be hovering statically in the center of the screen until then) or the playfield will scroll by too fast for one to reasonably be expected to react.

At least the use of multiple playfields solves that problem. I’ll need to make up a couple dozen modular sections that can be randomly fit together. Hopefully the modularity doesn’t become distractingly noticeable.

Ah, well. That’ll be for tomorrow! Then, once I have playfields loading in correctly, I’ll finish the bouncing missile part of the echolocation and add in random enemies to mix things up a bit.

Oh, 6502 Assembly…

So after banging away at the keyboard for an hour or so, trying to elegantly create a routine in Assembly that would, based on a randomize index, load the appropriate cave playfield through a series of data sets, I ended up getting it to work with a simple on…goto command. It’s a bit less elegant code-wise, since there will be a bit more redundancy for each new cave playfield added, though I suppose it’s actually fairly negligible.  An extra 9-10 bytes or so, but I’ll take that if it means that it will work.

So now the game will set a random cave for the playfield and keep it until the player reaches the far right wall, at which point it picks another random playfield. I added a variable to remember which the index of the last cave is so the player never plays the same cave twice in a row.

Now time to crank out n^2 playfields for some variety!

I’ve been pondering the intention to use a ball to bounce around as part of the pulse. Considering how much code it would take to make the ball bounce in a useful way (I’d have to monitor which of the 8 directions the player was facing, then copy it to a variable for the ball, then randomize an inverted direction based on the ball’s current trajectory when a collision occurs), I may just stick with the visual pulse. The effect is pretty nice and it’s challenging. I don’t know think that the bouncing ball would really add anything.

So I just need to finish up these playfields and then add in something for randomized, moving enemies to add some extra challenge now and then. This game may well fit in a 2k cartridge, as I have 2076 bytes to spare but haven’t even used a custom include to cut out all the unnecessary assembly routines that I won’t be using, like playfield drawing.

Sprite Woes

Since, without some Assembly wizardry that the standard batari basic kernel does not allow for, the Atari 2600 only has two–count ’em, two–sprites available, I’ve been spending the past few hours fighting to find a way to fake up to three with flickering, but in the end, I gave up because of all the trouble with collisions on a flickered sprite. It’s just a mess.

So I’m rolling back to the last fully working version (as seen in the video in my previous post) and I’ll go at this again, but this time with the intent to only have ONE possible sprite on screen at once, either an enemy (an owl) or a power-up (an insect).

If I hadn’t spent so much time trying to get two sprites on screen at once, I’d probably be done with the game by now. Ah, well–still plenty of time left!

Comments

Osgeld
28. Apr 2013 · 00:07 UTC
tons of time!

Excellent Progress – Also Bugs

I’m very pleased with where I’m at. I just need to add sound effects and see what I can do in the way of a title screen (if I can’t do much there, I’m not too worried). The game works and has enough randomization to keep it interesting for a little while.

In the video, you can see the bug. Specifically, it’s a bug bug. The insects (which are power-ups that give you a life, some points, and a free echolocation pulse) seem to screw up the playfield when they’re around, though I have no clue why. I’ve had the same issue earlier, but with the owls (enemies). Somehow, it went away for the owls and was doing fine, but now it popped up again. There must be some bug in the standard kernel. I’ll be leaving a tech support call on the AtariAge.com forums and hopefully someone can tell me what the issue is before the game is due.

If not, I suppose I can live with it.

Well, that’s a wrap for tonight!

Comments

Osgeld
28. Apr 2013 · 05:12 UTC
dont stress it, it will be fixed before deadline

Ping – Game Complete!

Ping

PlaySourceAtariAge – Game Page
Note: Requires an emulator like Stella to play on computers.

About

For a small bat like Ping, the world is a big, dangerous place. Will little Ping make it in her new home?

Instructions

Move using joystick (arrow keys or mouse with Stella), ping using echolocation with joystick fire (spacebar or left mouse click in Stella).

Pinging costs 25 points. You gain points by making progress to the right and by eating bugs. Try to ping as few times as possible to maximize your score.

Avoid owls and walls, eat bugs, and get as far as you can!

Special

Supports AtariVox high score saving. Requires an AtariVox/SaveKey module to be plugged in to controller port 2 (or emulated in Stella).

Clear your AtariVox high score for Ping with select + joystick fire while in game.

Mute the pinging sound by setting Color/BW to BW (F4 in Stella).

Have fun!

Tags: 2600, adventure, atari, bat, batari basic, bats, minimalist, ping

Polishing

Well, the game’s done. Time for polishing! I’ll be adding an intro cutscene (hopefully I’ll have enough space–I’m down to ~340 bytes left) and have already added AtariVox/SaveKey high score saving support. And on top of all that, the nice folks at AtariAge pointed out what that bug was. Evidently, I need a bit of code to account for the length of my game, see below:


if ( (<(*+7))
repeat ($100-<*)
.byte 0
repend
endif

Hopefully getting that help won’t disqualify me for anything.

Oh, and I decided on the game’s name. Initially, I was going to call it “Batty,” but instead I settled on “Ping.”

LD28

A Story of Hearbreak

As mentioned in my previous journal entry, I will be remaking my first game, Heartbreak. It’s a bit of a strange tale, however, since Heartbreak wasn’t originally “made” by me at all, at least in the sense of programming. It was my baby design-wise and in the limited capacity of “art,” but I relied on another programmer to do all the actual creation. Still, I think that it will count fine for the sake of this mini-Dare. It’s either that, or Ping.

The game was originally made for the 2013 Game Jam (the same one that produced Surgeon Simulator 2013). It was my first time ever attempting to make a game, and I was nervous of the possibility of having no ideas. There were about 200 students packed into a lecture hall (which very much surprised me, as our university isn’t particularly large) when we were all given the theme for the Game Jam: the sound of a beating heart. We broke off into 15-20 person groups and went into separate classrooms to brainstorm.

This was my first experience with brainstorming, and I loved it. There were dozens of great ideas thrown around, my contribution being an idea for a point and click adventure game set inside a dystopian, film-noir crumbling city that was located in someone’s body, with a large, pulsating heart looming in the background. It was supposed to be a story about survival and dealing with impeding death, etc. Not a very good idea for a 3-day game jam.

Then, someone in our brainstorming group suggested a game consisting of a number of arcade-style mini-games. Although I cannot guess why, for some reason Heartbreak–a mix-up of the classic arcade game Breakout where the player controls the blocks instead of a ball, with the blocks arranged in a circle around a beating heart that serves as the player’s life counter–sprung immediately to mind. I abandoned the over-complicated concept of a point-and-click adventure game and clung to this new concept.

When we returned to the lecture hall and game creators began separating to work on individual games, I found myself almost working alone, since my concept of an arcade game about moving colorful blocks around a heart sprite didn’t quite grab attention in the same way that some of the other concepts did, but I managed to hook a couple people who claimed to be experienced with programming in GameMaker. With that, we all broke up again into different classrooms to begin constructing the games we’d gone with. My group was, by far, the smallest, with most groups having 6 to 10 people on a team, and I with just 3.

The two programmers set to work surfing the Internet and half-heartedly (forgive the pun) looking up tutorials while I fiddled with some sprite art and designed the game in my head. That’s how most of the first evening was spent–simply thinking while I worked. By the next day, after a short sleep and a lot of fitful half-awakedness, the game, simple as it was, was fully-formed in my mind.

The only remaining problem was that the two programmers claimed that the concept couldn’t be done in GameMaker (something I intend to prove wrong during this mini-LD), and so our little team was stalled for a few hours until a very nice and quite talented Unity3D programmer stepped in to join our group and get us on the right track. Said programmer made the game in Unity entirely on his own, with me hovering over his shoulder like a fussy mother, directing every aspect of the game’s design.

To cut an already too-long story short, our little four-person team (the two GM programmers were delegated to sound work, which meant searching Newgrounds for some music tracks and finding a few arcade-like sound effects) ended up winning “best designed game” for the Game Jam at our university, as well as “most popular” among all those students at our university who participated. A humble honor that was all thanks to the nice programmer who stepped in to make the game for me. It fired off a brand new interest in game development that I’d not really had before, and I’m still waiting to see exactly how far it will take me.

Tags: game jam, heartbreak, journal, Unity 3D

My First Game – Then and Now

Last journal post until I actually make some progress, I swear!

After making a long post about my choice in game engines and then another explaining where my original game concept came from, I’m going to, finally, explain the history of my first game’s development. In brief, I hope.

Heartbreak version 1: Unity 3D for Windows

Original Heartbreak game, made in Unity3D

As you can probably see, the game is very flawed. One major issue was with the controls, which were tied to the mouse, so moving the mouse left and right caused the ring to spin. Hitting left mouse button would fire the balls from the central heart. On top of that, the game itself is bugged. At the eleventh hour, we discovered a bug on the fourth or fifth level that would cause the score to reset to 0 after the player had progressed to the following level. Finally, at the time I made a big deal out of “elegance of design”, which I saw as every part of a game coming together to compliment everything else.

Don’t get me wrong–elegance of design is a good thing, but I may have taken it a bit too far by creating a menu system that you could literally “lose” at (by accidentally selecting the exit button), in the interest of turning even the menu screen into a gameplay tutorial. I think I had seen one too many episodes of Sequelitis.

After the 2013 Game Jam, I was excited to try my hand at game programming, since I’d been only the lead designer for the original Heartbreak. I wanted to learn the craft of programming for myself, in the interest of being more self-sufficient. To that end, I decided to start as “simple” as possible and got into programming for the Atari 2600. Yes, the real Atari 2600.

If it’s a bit debatable whether or not I technically “made” Heartbreak version 1, since I was really just directing a Unity 3D programmer in what to do, I consider my actual first game to be my first remake of Heartbreak for the Atari 2600. I used the homebrew tool Visual Batari Basic, which, when combined with Batari Basic, gave me a convenient and simple IDE with many helpful sprite and sound design tools, plus the ability to code in BASIC and use a pre-made kernel, rather than coding everything directly in 6502 Assembly. I was extremely grateful for that.

Heartbreak version 2: Visual Batari Basic for Atari 2600

Prototype Heartbreak game, made in Visual Batari Basic for the Atari 2600

It took me a couple months to actually make Heartbreak for the 2600, since I was learning along the way and frequently had to go back and reprogram bits of code here and there as I discovered more efficient ways to organize the game logic. Keep in mind this was all done for a system with a 1.19Mhz processor and 128 bytes (yes, individual bytes) of memory (only 26 bytes of which were available to me in Batari Basic, since the kernel I used consumed the rest of it to write the playfield to the screen).

In the end, it was again thanks to a more experienced programmer, who generously wrote a custom kernel for me, that Heartbreak was able to function well on the 2600. Normally, using Batari Basic’s standard kernel, only a single playfield color can be displayed on-screen per playfield pixel (those big, rectangular blocks), but the programmer managed to work around that limitation with some clever 6502 Assembly wizardry that I still don’t fully comprehend.

From the custom kernel as a framework, I was able to build the finished game. Some months later, I revisited my old code and cleaned it up, organizing everything into neat, clean functions that you can view here. I’m rather proud of how tidy and efficient it all is (relatively, keeping in mind that this is BASIC with 6502 Assembly calls in it, all programmed in non-object oriented in a language that relies on spaghetti code). The game itself only uses about 1000 out of ~3000 CPU cycles that are available with this particular kernel, and the game itself is under 4 kilobytes. And, yes, it works on a real Atari 2600. If you’d like to try for yourself, I included Heartbreak, with a few other small games I developed for the Atari 2600, in a 32k compilation ROM (along with an updated version of my previous LD, Ping) that you can get here (you’ll need an emulator such as Stella to run it, unless you have a real 2600 with a Harmony cartridge), and you can see the finished version of the game below.

There have been a number of gameplay changes since the Unity3D and earlier 2600 versions.

Heartbreak version 3: GameMaker for Mobile

Originally, the player had to hit a button (joystick fire on the 2600, spacebar or left mouse on Windows) to fire a new ball from the heart. The ball would take on the color of the heart and it had to either match the block’s primary color or be one of the primary colors that made up the block’s color, or else the player would lose a life (indicated by the size of the central heart). Hitting a wrong block three times meant game over, but the player’s heart would be brought back up to full size after every stage.

Once I’d finished the basic game on the 2600, I was seeking to program in alternative gameplay modes, since alternate modes were a thing with many 2600 games. One of those modes included a bouncing ball, so rather than the player having to spawn each ball (which would fire from the heart and then disappear once it had stricken a block), the player only had to press the fire button when they wanted to transfer the heart’s current color to the ball. This meant a lot less button mashing, and it was far more satisfying to just control the blocks to catch the ball as it bounced. This ended up being the only game mode in later versions.

With the block colors, I’d always intended the game to start with simple primaries–Red, Yellow, and Blue, and work up to secondaries–Orange, Green, and Purple–and finally to White and Black. White blocks would give you a heart back, but black would take away a heart if they were struck and had to be avoided, which was particularly challenging in the 2600 version, because the background is solid black as well.

However, this lead to the game becoming progressively easier, since an orange block could be broken by either a red or a yellow ball, a green with yellow or blue, and a purple with red or blue. Obviously, a game should get more challenging over time, not less. I fixed this in the 2600 version by having the ball remove a color from the block’s color, leaving the remaining colors in its wake. For instance, if a red ball hits an orange block, it bounces off and leaves a yellow block behind, which must then be broken by a yellow ball. And if the orange block was hit by a yellow ball, it would bounce off leaving the block red. Yellow blocks would need to be hit by all three primary colors before they would disappear.

Overall, I’m very pleased with how the game itself plays as of the final 2600 version, but a few things had to be sacrificed in the move to the 2600’s limited hardware.

For one, the ball will only bounce at a few pre-determined angles, as letting it bounce freely would result in the ball always getting lost, particularly since the blocks aren’t of uniform shape and they don’t fully encircle the central heart.

Additionally, there was no way to add multiple concentric circles to the game, so it always operates on a single ring. I would very much like the game to have up to three or four rings at a time, as in the original Unity3D version.

Finally, I always intended the game to be a musical arcade game, but having background music wasn’t feasible with the 4 kilobyte size limit of the 2600’s ROM. I would like to bring a musical quality back into the game, with the heartbeat matching the tempo of the current soundtrack, rather than set to a steady, heart-beating sound effect.

On top of all that, I’d also like to bring the game to a mobile setting, which I think would fit the gameplay very well, being a sort of casual game that works best in just a few moments played at a time. This would, of course, mean reconsidering the control scheme. I would like a simple swipe gesture to allow the ring to spin, perhaps with a simple tap used to set the ball’s current color to the color displayed by the heart.

On the other hand, I may modify that mechanic so that the heart does not change colors on its own, but instead must be tapped by the player in order to change the ball’s color. Or maybe the heart and ball always share the same color and, rather than tapping at the right moment to get the right color on the ball, the player would need to tap the heart to swap between its colors? We’ll see.

While I’m at it, I’d like to update the game’s visual style, maybe moving away from the direct pixel-art look into something a bit cleaner. And, who knows–if I find the time, maybe I’ll try implementing some kind of power-up system, similar to Arkanoid. I may have an idea of how it could work.

Now it’s (finally) time to get to started!

Tags: atari 2600, batari basic, GameJam, GameMaker Studio, heartbreak, journal, ping, Unity 3D

Templating

The core of Heartbreak is the blocks that get colored and rotated. Thankfully, GameMaker should make this relatively simple, since it has a coloring function that I’ve tested and find to be working fine, plus a simple rotation value for each sprite. All I need to do is create a single block, give it an offset that will make it rotate around the center of the screen, and then rotate and color the blocks based off of a controller object.

I’ve already had some annoyances with selecting a resolution, so I’m just going to keep it simple (since I don’t have much time or experience for fiddling around with adjusting views for every possible mobile device) and just design it for my own Motorolla RAZOR HD phone, which seems to have a 1280×720 screen. If only there was some semblance of a standard when it comes to phone resolutions. This is certainly giving me a whole new respect for mobile developers, who have to contend with multiple versions of images for all possible densities and resolutions of phones, and they are all over the place.

A question I now have to ponder is how many blocks to design the game for? I have a couple templates made, one with 80 blocks and one with 40 blocks. The Atari 2600 version of Heartbreak used 16 blocks in a row, but that would mean 80 blocks after 5 rows and I wonder if that wouldn’t just be too tedious to play through. I suppose I can always adjust things later, if need be.

What bothers me is that 8 blocks seems good for the inner-most two circles, but since the individual blocks in the rings get larger and larger, that makes the outermost ring quite easy. I suppose I could combine rings of 8 and 16 blocks, either with the inner-most two or three rings sporting 8 while the outer ones have 16, or maybe just a random combination of 8 and 16? The latter would be a bit more tricky to program, as leaving things purely to random chance could result in too many or too few blocks in a row. I’ll have to see how things go.

80 blocks40 blocks

EDIT: Using different sizes for the rings gives 64 blocks total, a nice in-between, and requires more and more precision for the player, so I think that I will go with it this way.
64 blocks

Tags: journal

Day 1/3 Conclusion

Well, I think that it’s gone well so far. Using the template posted earlier, I built base sprites for each row of blocks, then created a script for creating and setting up individual blocks and a script to churn out full rows. Much like the original game(s), I hope that this version will do a decent job of teaching intuitively through level progression.

Also, the heart changes colors and has a simple beating animation (just scaling down for a frame).

Tomorrow, I’ll be adding the ball and controls. If I have time (which I expect I will), I’ll also add in all the core levels and the score counter. There should be at least 12 levels, each of which will introduce something new (an additional color or another row), plus a few different random mixtures for infinite play beyond that.

Here is a screenshot of where I’m at so far, with all the blocks being randomized into place. Seeing how it looks, I’m definitely going to have to figure out something different visually. I was shooting for something cleaner, but it just looks drab in the end, plus the blocks don’t fit together particularly well, so I will have to rethink that. Maybe a pixel-y art style will be back on the table, since it’s relatively simple to accomplish, but would add some visual grit and variety, if done well, so everything wouldn’t seem so bland.

Heartbreak v3, with randomized blocks


Time for a break, then bed.

Tags: GameMaker Studio, heartbreak, journal

Day 2 – To Do

After a relaxing night’s sleep, some Thanksgiving leftovers, and a couple YouTube videos to wake up with, I’m back to work! While checking the new posts for this mini-LD, I came across this particular post, which posted a video about motivation.

Now, I, personally, often have trouble keeping myself motivated. I tend to want to go do something else, like watching YouTube videos, playing a game, chatting on Skype, etc. and it’s been a bane to my productivity for many years. In the interest of giving the aforementioned video’s suggestions a try, I’m going to set out a clear list of things that I must get done today and organize them into “modules” so I can see the progress I’ve made. I’ll be editing this post to update my list as I work.

Major Goals

  • Mobile Controls – 100%
    Mostly complete, and much simpler than expected, thanks GM’s point_direction function. Still need to test it on a mobile device with someone to see how intuitive the controls are.

    Update: Complete, with press-dragging to move the blocks and tapping to create balls or change ball colors, if a ball already exists on the playfield. It’s actually very intuitive on a mobile device, which is pleasing.

  • Lives – 100%
    This was one of the shorter, simpler tasks. The heart is resized based on a global lives variable and is destroyed when the lives are set to 0, which also serves to lock out any controls but a simple tap, which resets the stage.
  • Ball Color Checking – 100%
    I underestimated the work involved in “Bouncing Ball,” so I’ve split it into two categories, now. Collisions work, with balls correctly changing the colors of the blocks they hit, but I don’t have any bouncing code implemented as of yet. It may prove to be complicated, and I’m not exactly sure how I will implement it. I’ll ponder it while I take a break.
  • Bouncing Ball – 100%
    Finally managed to get this implemented. Not only did decent bouncing take a while (and it could use some work, but it’s serviceable), but I came across a number of other things that needed tweaking and fixing in the process. There’s still one bug that I can’t reliably replicate that strikes almost at random, seemingly only when a blue ball hits an orange block, but only on occasion. I hate loose ends.
  • Level Progression – 100%
    This task was fairly simple, and I took advantage of GM’s defaulting unspecified array values to 0 to my advantage to cut down a tad on how huge the level array will be, at least in code. Now to type out the levels, which should be fairly simple–it’s just a bunch of copy-pasta.
  • Implement Levels – 100%
    There are currently 22 levels implemented, with plenty of room for more. My level system is pretty flexible, allowing me to specify how many rings there are (I’ve set up the rings in a switch case statement so that they’re rendered in a certain order), which colors the heart progresses to (a necessary control for the earlier tutorial levels), and what the odds are of each of the eight possible colors spawning. It worked out quite well, and I could easily add more levels that have different color spawning odds, but I’ll probably leave it at 22.

Stretch Goals

  • Score Implementation – 100%
    The current score is rendered on-screen, just above the heart, as in the original Unity3D version of the game. I had to look up how to make it always display zeroes to the left of the score, but in hindsight, it’s something I should have figured out, myself.
  • Scanline Effect
  • Sound Effects

Time to put on a game soundtrack and get to it. On a related note, while Hotline Miami has an awesome soundtrack in the game itself, it doesn’t make for good listening on its own. FTL and Super Meat Boy are great to just listen to, though. If you can think of some others, let me know.

Tags: journal, to do

Comments

lazyeels
30. Nov 2013 · 18:59 UTC
FTL has a great soundtrack! Check out Jim Guthrie of Sword and Sworcery, anything by Disaster Piece i.e. Fez etc. Also C418 – nice couple of albums for Minecraft. :-)

Day 2/3 Conclusion

I’m very pleased with where things are right now. Considering that much of yesterday was spent with family after Thanksgiving, I got started late today, and I took frequent, long breaks, I couldn’t be happier that the core game is basically completed after about 12 hours or so of actual work. It’s good to know that the game could be made and work well within a Game Jam’s time period, no problem. Take that, guys who said that Heartbreak couldn’t be made in GameMaker!

I’ve been keeping an ongoing list of my progress throughout the day, and I feel that having the work in a checklist aided in my productivity and concentration. I’ll have to practice this sort of thing more in the future.

Heartbreak, as of tonight

That leaves things like sound effects and music for tomorrow, but at least those should be fairly simple to do. There is an abundance of great music available on the ‘net, and I may simply record my sound effects from the Atari 2600 version of Heartbreak to use again, as they are perfectly serviceable and I would be looking for something similarly retro-synth-sounding, anyway.

I’d also like to experiment with different visual styles, such as a grungy pixel art look and/or some scanlines. Something so that the visuals are so overly smooth and clean. That said, I do like the pastel colors that I’ve settled on, and it all looks pretty slick on my phone. I’ll have to experiment tomorrow and see what I like.

In any case, I consider the mini-LD technically complete as of now, since the gameplay is implemented and fully functional. The only nagging point is a crashing bug that I experienced a few times that I’ve been unable to replicate and track down. Here’s hoping that it got smoothed out somewhere and doesn’t rear its ugly head. Or, if it does rear its ugly head, hopefully it rears it high enough that I can find the neck and give it a good chop.

That’s it for me tonight. Time to wind down!

P.S. Is it just me, or does the above screenshot have a bit of an optical illusion going on with the blue block on the far right? Try turning your head back and forth and looking at it out of the corner of your eye. To me, it’s like the blue block separates away from the rest of the circle.

Tags: game progress, GameMaker Studio, journal, mobile

Day 3 – To Do

First off, to anyone reading this–when exactly does today’s LD end? Is it at a specific time, or just midnight, relative to whomever is doing the dare?

Last day. I’m fortunate that my game happens to be significantly less complicated than everyone else’s, so I have the luxury of effectively being finished, then having an entire day to polish things up. The downside is that I’ve decently recreated everything that I’d intended, so I’m not quite sure on what direction to go with said polishing, aside from the inclusion of music and sound effects. I suppose that’s part of the learning experience.

Major Goals

  • Sound Effects – 100%
    I expect that I’ll just use the sound effects created for the Atari 2600 version, since they’ll be simple to acquire and appropriate for the retro-inspired style I had intended.
    UPDATE: I’ve got some sound effects in, most of them simply recorded from the 2600 version of Heartbreak, though I generated a couple with DrPetter’s awesome SFXr, made for LudumDare participants, as it so happens. The sounds that I chose aren’t particularly great, but sound engineering is something I have zero experience in. May be a field worth learning more about for the future, particularly if I intend to keep participating in dares like this.
  • Title Screen – 100%
    This took the longest. I’ve been working on the title/credits screens for half the day. My desire to make things as “neat” as possible has resulted in an absolute mess of code all over the place as the entire game only uses three rooms, one that only initializes two variables before kicking the player to the title screen, and one that just scrolls credits on screen, since it seemed easier to use a unique room than to modify an existing room. The remaining room handles all levels and the title screen based on what global.level is set to. It’s both elegant, and an absolute mess.
  • Music Integration – 100%
    This went off fairly well, especially since the songs I’m using from incompetech.com list the BPMs of the songs, making it a lot easier to make them feel integrated. In hindsight, there is a song for the last three levels of the game that may be almost unfairly fast, which causes the heartbeat to be nearly too quick to get the color you want, so you have to anticipate it. Ah, well–I’m sure that anyone who can make it to that level will be able to handle it.

Polish Goals

  • Pixel Grunge Style?
  • Scanlines?

UPDATE: After some research, it seems that most of the effects like noise or scanlines are done using surfaces, which I know nothing about. I’ll definitely be looking into them in the future, but since I’m on a deadline with this LD, I think I’ll stick with the crisp, clean style that I’ve currently got. Besides, I have a couple other ideas on how I may polish things.

Time to get to it.

Tags: journal, to do

Comments

01. Dec 2013 · 23:35 UTC
Generally with mini Ludum Dare’s the submission will stay open for a week or so after the set time.

Heartbreak Postmortem

Well, v0.1 is complete, anyway. Considering how much stuff I had in mind when I began this LD which didn’t come to fruition, I hesitate to call it a full-fledged 1.0, but it’s working, and (as far as I can tell) stable.

I’m pleased with the final result, overall. It could definitely use some polishing and expanding, but for two and a half days spent making what is essentially my first non-2600 game? It could certainly have been worse!

My only real disappointment is that I don’t know how to dynamically make the game fit across multiple mobile device screens. The linked version is sized for a Droid RAZR HD, since that’s the phone I’ve got. Once I figure out how to make a version that scales automatically for different phone resolutions, I’ll make sure to post it. Until then, give the Windows version a shot if you don’t have a RAZR. Controls are mouse clicks and drags, since it’s the same control scheme as the tapping/flicking gestures of the mobile version.

Heartbreak&#039;s Title Screen

Heartbreak’s Title Screen

Submission Page
Windows Download
Android Download

For those curious, you can play the original game, made for the 2013 Game Jam in Unity3D, here, and my remake for the Atari 2600 (included in a compilation ROM of other small games I made) here. The latter will need an emulator such as Stella.

This has been an excellent learning experience. I’m going to enjoy a little break, but then I hope to keep working on learning more to improve what I can do, whether with programming, art design, or sound design, since there is serious room for improvement in all of them.

Tags: arcade, atari 2600, breakout, gamemaker, heartbreak, journal, mobile, postmortem, unity3d