Almost a month without an entry and no GM progress… so what have I been up to?
First and foremost I have been quite busy with my daytime job. It’s my first ‘real’ one, so it’s a bit getting used to and I still need to find a good balance, especially since I’m hanging out with people from work after work as well ;)
Booking time
Still, there is always free time left (or as they put it: free time made) for other things. I have actually picked up reading a classic fantasy trilogy most of you will probably not have heard of to date: The Chronicles of Thomas Covenant the Unbeliever. It’s actually a Tri-trilogy, as there are two trilogies made and a much later third series being written as we speak. The one I’m reading now is the first trilogy which was written in 1977.
Now I wasn’t playing pick the donkey in the bookstore. I actually bought the first trilogy, as it inspired one of my old-time favorites from the 8” floppy-disk era: The Land. Created by Mike Riley in 1988, this was a Rogue-like that required a whopping two floppy disks to install having a massive size of 431 kB (we are talking the time of 286’s, mind you ;) ). Anyway, countless hours were wasted upon scavenging dungeons, leveling up and seeking lore to get rid of magical force fields to obtain the next piece of the puzzle. It was buggy and ugly, but I loved it :)**.
Point is, that I finally took the time to buy the book where it has been based on. Without giving anything away, the main premise of the book is that a leper named Thomas Covenant gets hit by a police car and wakes up in the magical world of The Land. The book is written entirely from his perspective, so the reader (and the main character itself) is constantly uncertain whether what he sees is real, or just a figment of mind struggling to survive the impact trauma.
Ledgejumping
Next I have been playing some platform games, for fun and inspiration. Most notable titles have been Iji, the amazing platformer by Daniel Remar and Treasure Hunter Man by Bernie.
Iji is brilliant. It has great balance, enough little secrets for retries and a good flow. My only pet-peeve is that final boss is about twenty times harder than all previous bosses even in easy mode (although, the directional warning hints displayed in game are a very fair addition). Pick it up if you haven’t played it yet!
Treasure Hunter Man is a nice little platformer by Bernie. It lacks some flow here now and then, but finding out how to continue is part of the fun. The MIDI music fits the game well, even though it’s funny to hear Colonization and Daggerfall music in-game :).
Well that’s it for now!
*) Anagram of Work, Read and Play. Yeah I know, but it sounds a lot more interesting :P
Building a level editor using the full capabilities of the existing Game Maker engine can lead to some interesting if not frustrating discoveries. The last of the bunch, was related to a certain facet of the option of built-in GM backgrounds’ ability to be set as a foreground. Picture the following: set a background to tile both horizontally and vertically, then set it as a foreground image. Result: the editor is obscured by a background :S. Since the setting is simply “set as foreground” there is no way of setting a depth for the rest of the editor that would allow it to be shown above the background.
Now there are several ways around this. An obvious one would be to emulate foreground behavior, by creating a fake background, for instance using draw_vertex_texture() in combination with texture_set_repeat(). This would become a bit troublesome if I only needed to repeat either vertically or horizontally.
But I have found another way, of which I was very amazed it existed. I bumped in it by accident. You see, if you tile, the chosen background is tiled indefinitely in the chosen tile direction. Or is it…? You see, when you tile horizontally, you can go as far to the left as to the right and you will see re-tiling wherever you go. If you would however tile vertically, this repetition stops when passing the origin… what? Yes if you get into negative space you are spared the sight of repeated tiles.
I'll explain it a bit better using the image below
For these two cases, the view of the room has the same origin as the editor around it. The background is set to repeat tiling both horizontally and vertically.
In Case 1, you see an editor window with a view on the room. If you set it to the foreground, you get the right picture and the editor and any objects below the foreground are obscured.
In Case 2, same editor, same room, but this time the view position has been shifted so that the origin of the room (point X=0, Y=0) lies within the room view (shown by the greyed-out area which is everything left and above the origin (or X<0, Y<0). If you set the background as a foreground now, only the part below Y=0 completely covers the screen. Everything above the origin is seen... because continuous tiling - for some unknown reason - does not go into negative Y space! (I apparantely forgot to remove the blocks in this one, imagine they aren't there :P)
So how does this help us? Well, if you make the view of the room and the editor independent, i.e. using two views, you can put the entire editor window in negative Y-space and simply use the built-in foreground setting with backgrounds and everything works fine.
Hope it is much more clear now ;), let's continue:
Thing is, now I will have to move the entire window into negative Y space. Though most of what I made was made using relative coordinates, it still will require a lot of rewriting. I’ll make sure to make everything easily movable now, before I run into more little GM gags.
I have even downloaded the rip found in the comments (as the playing artist didn’t mind). The more busy pieces are a bit chaotic, but almost all the softer pieces are done very well, especially Gestation, Cemetary, Geothermal and Moonsong are done really well and come out stronger in this all-piano form. Some pieces are sadly missing, most notable being Meltdown 2 and Scorching Back. Also, Balcony was sadly cut short (perhaps he was tired playing so long already and eager to finish). I definitely recommend taking the time to listen through the entire 23+ minutes.
More meat is still being added to the Lasagna sauce! I’ve started creating the framework required to add objects to the room. With the work done on the tile layers, some of this framework was already made, but aligning it to make it compatible with objects is taking more effort than I wished.
At this moment, basic layer functionality is possible (depth/visibility) as well as setting base object properties. Properties changed later will (naturally) affect existing instances. Seeing as creating an uploading system for sprites to add to objects is very cumbersome and time-consuming, I have made a simplified system using colored shapes. There are eight shapes to choose from, either filled or simply a border and over 16.7 million colors ;). A shape’s width and height can be set and its (relative) origin as well.
For now, the editor has been limited to supporting 90 unique objects. Each object can be given a nickname aside from its domestic GM object name. Aside from objects being more easily recognised, this feature makes it possible to use various object-slots in the editor for the same object (which clarity may require).
Some other basic functionality has been added, such as tool-tip text, which shows minimum and maximum values of integer-receiving text boxes and/or short-keys for buttons. Below again a screenie showing the latest version!
No one knows better movement than our Ninja friends
I decided to abolish the use of scrollbars in Lasagna, too much hassle. Instead, if the user holds the M key, the cursor becomes a four-pointed shuriken and you can move by coming near a border of the view. It is amazingly intuitive and gliding over the room’s surface just feels very Zen :). To prevent you from getting lost (you have ‘infinite’ positive room space), you can return to the origin of the room by pressing the O key.
Lasagna learns the mystical arts of ninjitsu…
Layers
Tile layer development is also steadily moving on. Tile layers can now be interchanged with little arrow buttons to swap either up or down. (similar to Paint.NET).
Another small but nifty element that has been added is that when a layer contains tiles, its title will be printed italic bold. This way you can easily see if a layer is still free for use/movement.
A bit more detail
Sanity warning ! Pun approaching!
Yes... indeed a silly webcomic from yours truly.
Some small incremental progress has been accomplished with Lasagna. Layers are functional with respect to tiles. It’s really great fun to be able to toggle tile layer visibility, which is very easy given the tile_layer_hide() and _show() functions, which makes me wonder even more why this is absent in GM. Oh well.
Scroll bars are deceptively difficult. I’m a bit ashamed to say that I am somewhat spoiled in this area, being used to working with VB6 in the past where it was just a matter of (ahem) drag-drop. So making them from scratch and flexible enough to work for various ends is proving to be quite the challenge. But I’ll manage, no worries :)
Musaging
Also been playing around a bit with musagi the newly available tracker software made by the same guy who made SFXR. It works really well, the only thing that really annoys the hell out of me is the popup warning that you get when you want to change an instrument. I haven’t figured out yet how to switch that off :(.
ANFSCD (John Cleese in a field behind a desk moment)
Also been listening/viewing some older scifi related work, to be exact Discovery (Daft Punk album) and DS9. Really don’t get why they (as far as I can tell) haven’t shown any reruns of that here in say, the last 8 years. It’s my personal fav of all the Trek series, with perhaps the best cast/characters to date.
Don’t get me wrong, NG was great as well, but mainly because of 3-5 really good actors/characters. I feel that there are hardly any weak characters in DS9. Perhaps it was the great move of putting the whole setting on a space station for a change that allowed more space for a wide palette of fixed/returning characters.
It’s still funny to see that the project title of my level editor is called ‘vg_leditor’, after Vanguard for which I was building it, while the way it is growing now it will be completely project-independent. It will certainly take significant time before I arrive at the point at which I can start tinkering on a clone of Lasagna to add project-specific content.
Still, Lasagna is looking more and more like an actual functional product. Already many features unavailable in GM are incorporated, such as zooming the room-view, setting the grid color and fixing the ratio between the grid-cell values. Other features, such as the layers are in development. A link to a full-sized screenshot can be found at the end of this post, showing a zoomed-in view with colored grid . The latter was done using blend mode to keep it visible with the tiles, but semi-transparent not to cover them entirely.
Showers are a wonderful place to be. Every morning the very first thing I do is take a shower. Perhaps it is the fact you are still half-asleep, tapping into the power of your sub-conscious, or the prowess of a fully-rested mind (well, most of the time), but I find that in these moments I can have brilliant ideas and the most lucent thoughts, be it about what needs to be done that day or, in this case, finding ideas/solutions for my latest GM project.
So last week I had two epiphanies: how to solve the interpolation issue with zooming while keeping interpolation available for text and yet another missing functionality I needed to add in Lasagna. The latter was the ability to move in negative space, i.e. going left an above the point (0,0) in the room. This is useful in many cases, for instance for adding wall objects at the rim of a level. I remember bumping into this issue many, many times in GM in the past. In the screenshot, you can see the start of this functionality by the arrowheads just visible in the top-left corner symbolising the origin of the room.
So I guess the moral of today’s blog: take a shower (don’t take it personally).
Yesterday I made my first steps with one of the most scariest things you can do when a game project gets serious: the making of a level editor :O. The previous blog rant has made it obvious that, if I want to add some more complex material, I will need to leave the GM Room Editor and take matters in my own hands.
I’m however starting with a basic construct, so I can adapt that later on for future games. It will have a lot of basic elements such as the ability to add backgrounds, tiles and objects, set the room size etc. The following paragraphs discuss some unique properties the editor will get (compared to GM).
Layers
The idea is to at least make a layer system, one for tiles and one for objects, to facilitate room editing. Much like in Photoshop, layer visibility will be able to be toggled and the order will be able to be changed quickly. In GM you only have layers with tiles and you cannot see the other layers at any time, except by using the drop-down box. Also, you cannot move tiles within several layers at the same time. Objects don’t have layers in GM (as they have a natural initial depth). It would however be great if you could put all wall objects in a separate layer for editing purposes.
A rather preliminary glimpse of the editor. And a good excuse to break the wall of words ;)
Automation
Another point I would like to add as a basic feature in the editor to be able to couple objects to tiles you place. Often you have objects that act as tiles, but need to be objects (think for instance of water and other liquids).
One special case will be simplified in particular, namely tiles that usually will have walls. The objects will be added automatically in a standard object layer as soon as you place the tile (and this object does not exist in this layer yet). The reason I do this, is that you can remove some unwanted tiles later on, to add some secrets for instance, so you don’t get stuck with wall unwanted objects you cannot remove.
User facilitation
Think of the ability to set the colour of the grid, the ability to see the bounding boxes of objects within a layer and being able to see quickly whether an object has additional creation code. Also being able to actually select (multiple) objects/tiles, to change properties and move them without the fear of deleting them.
I will naturally add some specifics to this editor as well for handling event triggers/scripting which I am doing all by hand at the moment with my own makeshift syntax coding system.
As for the title: see the title :) It seems a fitting name as it implies, layers of tiles and objects (lasagna sheets and sauce :P). It’s also Garfield favourite dish :
So I’ve been meddling around with the first level for Vanguard using the standard Room Editor in Game Maker. In many cases, GM’s facilities for level editing are adequate. Those who venture off the beaten path once laid out by Mark Overmars’ standard platform tutorial will start getting annoyed by GM’s level editing quirks and limitations. Today I’ll discuss three of the larger issues I’ve come across that bug me in this respect. I work with GM 6.1, but as far as I can tell, these issues have not yet been dealt with in GM7.
One vision
First of all, the fact that you cannot zoom in or out in the Room Editor, both in the room as in the tile view. In Vanguard, my normal block size is 64x64. Basically I’m using a factor 2 blown up sprite-set and tile-set to circumvent the resize-blur effect when setting the game at full screen. The latter may be due to my video card, but I know many people have this issue (I’ve heard it’s Geforce related). Even with my 22” widescreen I can only see a small portion of both the room and the tileset. If I could zoom out just by a factor 2 (preferably more) this would greatly speed up the creation process.
Sometimes you want to use very low grid settings (i.e. lower than 8) for precision placement. At this point the screen content becomes almost invisible due to the high amount of gridlines. If one could simply zoom in a bit, one could actually see what one is doing.
Tile dementia
Another peeve of mine is the way tiles are loaded in the game. Often, I make a tileset and add elements (trees, machinery, decorations etc.) to it later on during the level creation process (i.e. I could really use a tile for X on that spot) or I noticed I forgot to add a certain base tile of the terrain. I edit the tile file and then the fun starts...
When you want to reload an image file in an existing tiled background you are punished. GM namely forgets it was a tile background plus all the settings you used for it. So you have to load, reselect ‘Use as tile set’, reselect ‘Transparency’ (in most cases) and (unless you use 16x16 tiles at 0,0 off-set) fill in all the dimensional values for the tiles. Why would anyone want to lose all their settings when they reload in an existing resource?
Creative disorder
The third point I’d like to discuss takes us back to the Room Editor. One of the more potent tools that are available in the editor, is the ability to add individual object creation code. This is really great, but the design choice made when this bit of code will be executed within the Creation hierarchy of the object is troublesome. This unique code is executed before all other creation code of the object.
The way I see it, how sooner code is executed, how more generic it is and how less specific. For instance, if you make an enemy you will often make a parent object with a lot of basic settings set, so you won’t need to do this for each child object. Therefore, you will execute the inherited parent code first followed by any additional code.
Say all enemies of a certain type start out walking randomly, either left or right. Now, there is this one enemy you want to start walking out left for some reason. Then it would be useful if the additional bit of unique code you enter in the Room Editor would end up executed at the very last, as it will otherwise be overwritten by the other code (making it random again).
In the least case, it should have been possible to choose when to execute this code, just like you are used to in the object editor. This could have been achieved by adding a ‘room code’ action in the object editor, which can be placed only once per object and only in the create event. This would be read to determine when room code must be executed. If absent, room code can still be executed first.
The way to circumvent the problem as it is, is by using a lot of variable_local_exists() in the parent or child objects, but it works very counter-intuitive.
Worked some more on Vanguard today and decided to play around with the first level’s opening sequence. One thing I didn’t like about the original’s first level, is that you simply were at the beginning of the level with no clue how you had gotten there.
So now I’ve constructed a little Drop ship object to deploy our hero at the scene. It’s mostly an FX-travaganza, complete with friction burn, sparks, retro-rocket-fire and some clearing ‘fog’ as the drop ship capsule opens to reveal the player.
Special delivery
I’m very happy of the result so far. It also gave me good excuse to practice with Audacity, the wonderful powerful yet still free sound editor. Still, I find myself grabbing SFXR a lot, as there isn’t an abundance of (good) free wav samples.
I did make a freak find as I was looking for a sound for the ship opening up. I thought ‘airlock’ would be a good search term and I actually found a link about the Vanguard Airlock System (ahem). It featured a rather awesome speech file that said:
“All Vanguard systems nominal”,. Perhaps fun to add somewhere as an easter-egg :).
Work on Vanguard has continued, I’ll discuss some points that I’ve come across in this version and how it relates to previous runs as well.
Aiming
I have decided to change a gameplay element back the way it was in the first version. Well, almost anyway. You see, when I worked on v2.0 (just to make things clear, current version is 3.0), I decided to do something about aiming complaints.
In the first version, the main character could only aim forwards (i.e. left and right), making anything on the ground above gunpoint very difficult to kill. Some of the alternative weapons (among which a flame thrower)could help, but essentially you could not aim for the ground unless you were jumping from an opposing ledge underneath. Also, anything straight above you in a chute would be difficult to kill without confrontation.
So , in the second version, I decided to add mouse-aiming, with a little limitation in the turn angle. You could aim anywhere between straight up to forwards. Yes I didn’t add aiming down at that time and I feel silly about it now, but then I was convinced that it was a good way to force the player to use the alternative weapons. Considering these alternative weapons had limited ammo my attitude had a hint of sadism.
The mouse aiming didn’t feel right though, as it slowed down the games pace, because you had to compensate your aim all the time. Aiming with the mouse works fine in FPSs since your sight is farther and the accuracy actually improves when you get nearer to your target (larger area of the screen is filled by the target). The sight is much shorter in platformers and the accuracy is independent of your target’s vicinity.
So, in this version, I’ve decided to use keyboard-assisted aiming. The player can now shoot in three direction: at an upward diagonal of 45°, forwards and a downward angle of 10°. I chose a different angle for downwards so it is comparable to shooting rats on the ground and shooting birds in the sky. It feels rather okay this way. The only thing I feel missing is a straight upwards shot, but I’m trying to fit it in the already busy keyboard scheme. I’ll add some enemies first though, so I can see if it really is necessary.
Story elements
In the previous versions, I predominantly used com-messages to lead the player through the storyline. This was loads of fun, as it allowed me to introduce several other characters into the game with their own quirks and agendas, but without having to physically involve them in the gameplay. If anyone has played The Jeluvian Project, you may know how powerful this trick can be.
Your CO has some encouraging words for you!
Anyway, for this particular version, I’ve decided to enhance the experience using a simple Zelda:LttP –ish cut-scene method to precede each chapter in the game. The screenie below should give an impression. Mind that the chapter title is very WIP (it refers to the name of the moon orbiting the planet).
This also allows to show a bit of the characters past and how it affects his actions. That and drawing widescreen pixel art just being plane awesome and puts you directly in the director’s chair :).