Git it? *dodges arrows*
OK, enough with the horrible puns and incomplete meme references. I feel the need to write a longish blog, with pictures; so once again, brace yourselves. This blog will
contain traces of the usual insanity, nuts, salt, preservatives, and C++. You have been warned.
Divided up into neat little chapters, so read 'em all like a boss or pick through them only reading what interests you. Or just skip to the comments at the end and comment on those.
Exile - a pictorial tour
I'm making progress like crazy. I seem to have finally found my focus. I am now able to spend longer than 2 hours at a time working on my projects, and actually getting somewhere.
Anyway, here's Exile's progress in pictures...
My testing hub world. Note the doors. They open by splitting down the middle and sliding into the walls. That's my sector-tags in action.
next, take note of that weird red thing on the right. That's a World Portal. Yes, I liberated the idea from Hexen. :3
Yes, they work too. Seamlessly.
A close-up of my doors. Gotta love doors. Guess what? These ones have more functionality than you'd think at first. I'll explain that later.
Warp portal. They warp the player from one location on the map to another. If you set it up correctly, they act almost exactly like Portal portals (sans the seeing through them gimmick, which I can't do in this engine for various reasons).
That tiled look is going to disappear as soon as I find the will to try create another texture for the damned thing. It's animated, by the way, as you may have seen in the last video I made...
My harmless goblin...
Wait, why is it walking towards me?
And that's what you get for messing with me (Note the health meter, by the way. Yes, you can take damage now...)
Oooh, dark scary stairway. Mayhap we shalt find the lost taco salad down there?
*Wild goblins appear*
Oh darn, they can climb stairs now...
That was merely Friday afternoon's progress. Yes, this is another pre-written blog.
Anyway, as you can see, I'm doing a ton of stuff, and I've already passed over a major hurdle; from here on in it's mostly level design, artwork and music. A bit of enemy AI as well, of course :3
Anyway, some not-so-obvious things you may want to know about: That little status box in the bottom right of the screen. It's going to hold information about your skill. I'm having (Like Hexen) three classes. Berserker (Biased Strength), Paladin (Balanced) and Mage (Biased Magic). Killing enemies will net you points (XP, of course). These will, when accumulated to a predetermined amount, increase your stats a bit. Your max health too, by the way. Why should we forever be confined to 100 health in first-person games? :P
The Magic system is simple, and works through the Staff, combined with a chosen Spellbook (Selected as an item in the center console). I've got a few plans for this, mostly offensive spells. And because I've already implemented the logic behind it, this will take practically no time at all.
The Magic counter replenishes slowly, depending on your Magic stats. The Barbarian gains no Magic bonuses, but can still use the staff to whack goblins over the head with.
Anyway, besides that... I have a basic pathing system for enemies. They walk towards you and clobber you (With a cooldown, of course) when you get within a certain distance from them. I'm working on some simple Line-intersect code at the moment that will prevent enemies behind walls from trying to move to the player (Line-of-sight, in other words. Piece of cake).
Doors are doors. They work as advertised. I'm implementing them using Lo/Hi tags in my editor. A hi-tag of 5 spawns a Z orientated door, whereas a tag of 6 spawns an X orientated one. Then, you set the lo-tag to specify the way it's opened. A tag of 0 means it can be opened by hitting the Use key. A negative tag means it requires a key with the matching index (Of abs(tag)). A positive number means it requires a trigger in order to activate. This means pressure-plates, events (Kill all enemies) or switches.
Also, warp portals. Great fun. Useful for linking rooms together.
Then there are the World portals. Now these are really
useful. More than mere 'end of level' warps, these actually allow me to have multiple warps in a single level, to multiple maps. The player is deposited at the player-start position in the other map.
I still need an intermission screen, not because of load time (it's instantaneous with the largest maps I've tested), but because it adds to the effect. At the very least I want to make a fade-in/fade-out.
Interesting note: All my levels are defined in the Asset List now. Meaning I can add new levels to the game without recompiling the game. Decoupling. My game is becoming more and more data-driven, meaning it's far more modifiable than it was before.
No, there's no limit to the number of levels you can have, besides your RAM. Also, since I haven't made it clear yet: Ditto for the dimensions of the levels. I use 64x64 as a testing size, but I could go up to 16000x16000, give or take a few tiles (sizeof(int)). AFAIK, this won't affect performance during editing nor during the running of the game, but will increase SAVE/LOAD times somewhat. Also, RAM usage. A single 16000x16000 level will take up about a Megaton of RAM.[/noPunsHere]
I just did a quick estimate, based on the structure I use to store tiledata, and the fact that I'm using int for everything. Apparently, it's 5859MB of RAM. Heh.
I'd say that, for huge levels, a 1000x1000 map is far more reasonable, weighing in at a mere 22MB (Estimated) of RAM.
UPDATE: I actually tested the 1000x1000 map. Not only does it glitch the editor, take ages to initialize, take even longer to load, but it crashes the game. 128x128 worked, and 256x256.
Something that you may not realize though; with the practically instantaneous load time achieved with these lower sizes, and a World Portal that doesn't render visibly, I can create 'link' rooms that silently switch to another level without you knowing it :P
Now, since I can define up to 16000 or so levels in my assetlist, and if I only used 64x64 levels, that's a total of 65536000 (65 million) square 'meters', or blocks. Plenty of space to work with, IMHO.
Oh, I am
going to be packaging the level editor and some basic instructions along with the game :3
As a side-note, I've finally removed all .dll dependancies from my game (No more libgcc-sw-xx.dll). All of them 'cept openal and libsndfile. But those I can bundle with the game.
Also, I've tested the game on Windows 7 multiple times (Yesterday), and under Wine. Works fine with no modifications required. Compatibility is my main concern whenever I make a game in C++.
I'm always doing something musical, whether it be dreaming up some new song or the other, or practicing on my guitar.
Recently my guitar playing has improved drastically. How can I tell? People in the next room over shut up when I start playing, so they can listen.
That's a change from having to compete with whatever disc they happened to quickly throw into the Hi-Fi to drown me out. :3
Also, the calluses are a good sign.
On the digital frontier, I've been working quite a bit with the beta of Famitracker 0.3.8, which has support for the N163 expansion. That was awesome enough. But then I finally figured out the whole instrument thing in VGMMaker. So now I'm working with two platforms.
In addition to all this, I've been plodding along practicing the more 'contemporary' styles, in MadTracker and LMMS. Needless to say, I still want a MIDI keyboard, more as a controller than anything else.
Otherwise, not much to say other than that all the music for Exile is going to be emulated-in-real-time YM chiptune.
Mega: Freelance <class X>
It's a pain in the ass, but it's a useful one.
I've been in the habit of using it for my recent projects. Including Exile. Here's a rev-list of my commits:
9215b5c Late. Check it carefully. Has enemy LOS testing, fixed PointInView so that it works correctly, added in Alpha testing so that sprites render correctly. Optimized speed.
b43c648 Stable. Enemies working correctly. Attacking correctly. Colliding correctly.
31e4d15 Stable with Enemy movement, attacking, damage, etc. Doors working.
81e7722 Split doors added. Need to do proper distance check on activation, as well as visibility check.
7039fde Stable with warps and world portals.
f49a825 Stable. Working nicely. Water/Lava added. Jumping added (Aesthetic, and useless. Use the stairs. :P)
a433970 ColMap Renders working perfectly. Need water + lava textures
1a817c7 Stable so far. Got base render-type detection
31b6197 Added colmap mods
5b6b175 Pre-modification backup
d0b3403 Bleeding Edge. Stable. Uses GRAVE level format, has updated HUD
e931842 Stable. Improved culling. Directional Billboards. Need to fix SE system
8ba5ad3 Stable. Sword. Basic Vector library. Occlusion.
e0b13df Stable. About to re-implement height-offset system.
7f0e6e4 Stable, new renderer (Optimized).
35c7091 Stable with punching, HUD, etc. Need optimization
f3b8ee1 Stable with shadows, variable height, strafing/mouselook and support for high-res textures
ee14546 Stable Alpha with Collision
That's in reverse order, from newest commit to oldest. I tend to branch every-time I make major changes. I'm so glad I remembered to with my last late-night stint (uppermost commit). I don't trust it. :3
Some notes. No, Colmap isn't a color-map. It's the collision data saved with the map. I use it to detect how to render that tile (As a wall, as water, as water with a ceiling, as a portal, etc).
It also has an invisible wall, which renders as a normal floor and (And ceiling if set), which is used by the Doors (Invisiwall is set when closed, unset when opened).
GRAVE is my enhanced, updated and completely awesome-sounding level format based on the same format I used since V4D. MXL. I still use a similar system. Since GM sucks so badly at generating binary files reliable (The way I like them, in other words) I output the data in ASCII format. This is then parsed and compiled by GRVCOM.exe, which packs it into binary (Thus making the file unreadable by the general public unless they know the byte-order, which isn't too difficult. It also makes it easier to read it all in).
SE system was my original SectorEffector system, which remains badly misnamed. My game doesn't have sectors, just cubes.
And yes, jumping is
useless, buggy, and may be removed from the game at some point. At least until I can untwist my twisted math.
If you get the <class X>, you get a cookie.
Some Minecraft-related stuff
I've been freelancing in my town for a while now, and things have been picking up. I just got paid today for that site I was developing (Which is now finished, operating, and already doing it's job).
Last week I was hunted down for that job I think I mentioned. But then they backed out because I happen to be a short 100KM drive from their company, and apparently that makes arranging interviews hard (Sounds like a load of BS to me).
But then I got offered a job in the locality, running a store for somebody. A store that sells water, of all things; this isn't strange, because our water is horrible, and has to be filtered in order to be deemed drinkable by 50% of the populace. The other 50%? They're at the pub.
So yeah, the pay won't be major, but it has some plus sides: It's stable employment and it looks good as a reference on my CV.
Oh yeah, that whole load of crap going on with Barclays bank in the UK? It's made me change banks. Because the bank I'm with (ABSA), is owned by Barclays. Not as a result of this recent muck-up; they weren't clear on their bank charges, and the money I deposited was gobbled up by the evil Bank Gremlins, and I found myself unable to buy Dragon Age: Origins, which was a paltry $5.
Banks... Can't live with 'em, can't use PayPal without 'em.
With the recent prereleases, I was getting nearer to flaming Jeb for doing a horrible job on the game. The first few made my single-player games lag like a slow multiplayer game (Latency. And a dedicated multiplayer server running on my own PC using the same pre-release was faster...).
Then the next-to-last one slowed down to a crawl of 2FPS in addition to all the previous tripe. So I nearly resolved to use 1.2.5 for all eternity, THE END.
But I decided to try the new release yesterday, since it had 'improved performance'.
I'll put this in as light a way as possible. I used to average around 40FPS on my PC (With WMP or Winamp open in the background playing FLV's, which are one of my sources of music. Often Steam was resident, and my HTTPD server is always resident). I'm one of those people who're happy with anything above 30FPS.
But when I loaded up the new pre-release, I was blown away by the smoothness of the framerate. I hit F3 and had to pick up my jaw from the floor. I maxed somewhere at 180FPS. On Balanced. While encoding a video for my MP4 player.
Good job, Jeb.
Anyway, in other news, I've been building all sorts of redstone circuitry. I'm trying to make a simple processor for no other reason than that I feel like it. Interesting story here that the Notchophobes will miss...
My library sells 'donated' books for a measly R2 (20 American cents) apiece, no matter what condition they're in or what they are. So somebody donated a box full of computer-science books from the 50's up to the 70's. Old stuff, to be sure, but back then (In 2005), I was drawn irresistably to them. So I bought 'em up. All 20 of the things. Some were about FORTRAN, some about processor design, some about the IBM System 360... and from those I learned a ton about the way a computer works. Regrettably, I think I sold most of them in 2009, before I moved briefly to Cape Town. Mark that up as one of my Moments of Mega Madness.
Either way, I remember most of the basic logic required by a Full Adder and Half Adder. I'm working on creating an Addresser at the moment, creating RAM cities, Clocktowers (Because that's just being awesome), and wiring the bus-lines before I build the other required component pieces (APU, Program Interpreter, Fetcher, Registers, etc).
Screenshots when I feel like it.
Well, there's another blog out of the way. I felt I needed another blog that wasn't purely a dev-log. They get boring.