FableQuest: Origin of the Phoenix Knight is one of my most developed projects. It's an action/adventure RPG that combines the exploration elements of many Legend of Zelda games with a real-time RPG system. If you're a veteran DC member, you could think of it as Lost Valley, but with a bigger focus on storytelling.
The game takes place in Megatia, an obscure continent far from the shores of mainland society. It is inhabited by a large variety anthropomorphic citizens - everything from kitsunes to talking birds - who have built several distinct settlements in order to harvest the riches of the earth. At first glance, Megatia seems like a typical fantasy world with friendly characters, but your journies will reveal a darker side of this land that could threaten its very existence. Every city is held together by the military and political grasp of the Imperium, a seemingly evil force that is necessary in order to keep the peace and prevent civil war among citizens of different races.
The story focuses on Ikkin, a kitsune woman with a strong heart and a relentless desire to help those who are in need. Much to her surprise, and to the surprise of others, she quickly learns how to fight effectively with swords and use other fantastic abilities. It will be up to the player to help Ikkin discover who she really is and what her role will be in the things to come.
Except for the main character (who was created by one of my good friends) and some of the sound effects and monsters, the content in this game has been created by myself. The graphics have a simplistic level of shading to keep with the old-school feel and to pull off an interesting art style in general. The music is being composed with high-quality soundfonts and will be in OGG format when the game is released.
With a variety of items and skills, tons of monsters to fight, secrets to explore, and bosses to defeat, it is my hope that FableQuest will be an RPG adventure to remember!
A vast overworld map with over 256 areas to unlock and explore, including hundreds of underground rooms, indoor areas, and secret passages
A variety of useful skills to learn in four different categories: Passive, Sword, Magic, and Summon
Over 80 different types of items, each with its own effect or purpose
Three distinct towns with a variety of services, including shops, inns, training areas, libraries, item mixing, and spellcasting
Hundreds of enemies to fight, from simple insects and forest creatures to surreal and completely bizarre monstrosities, and even powerful and intelligent soldiers
Dozens of unique dungeons put your mind and sword to the test, each one longer and more challenging than the last
Colorful, cutout-style graphics and expressive animations
A high-quality soundtrack with over 65 minutes of beautiful music
A compelling story that embraces many classic RPG conventions, while deconstructing others in a unique way
Despite the performance boost that I've noticed in Construct, I have a feeling that sticking with MMF2 will pay off later, especially since I just recently learned how to use the XLua object. This could potentially allow me to handle the bulk of the game's monster AI externally, and I'm anxious to see if I can recreate the events I've made so far with pure Lua scripting. What I'm even more anxious about is to see íf programming the game in Lua will yield faster performance speeds.
I've recreated the monster AI in Construct and run a side-by-side comparison between both the MMF2 HWA version and the Construct version.
For the test, I deleted all events except for the ones that handle monster behavior (i.e. attaching monsters to their collision masks, wandering around, etc), and I continuously spawned new monsters until the frame rate dropped from 60 to 30. In order to handle the relationship between monsters and their collision masks, I used an optimization trick in MMF2 discovered by a member of the Sonic Fangames HQ, which you can read about here:
To date, it's the fastest method of MMF2 object handling I've encountered. In Construct, I used the built-in Pairer object to group monsters with masks.
Despite the optimized object handling trick in MMF2, I only managed to spawn 95 monsters until the frame rate fell to 30. In Construct, it didn't drop to 30 until 376 monsters had spawned. When both programs reached 30 FPS, MMF2's display was much choppier than Construct's, which I believe has something to do with Construct using DirectX 9 as its runtime.
So, as I predicted, Construct has much better object handling than MMF2. In spite of this, I still have a few concerns. Microsoft is apparently working on its next operating system, Windows 8, and there's no telling if games built with Construct Classic will be compatible with this new system. Conversely, MMF2 can export to a number of different formats, and it's updated more actively, so there's a chance that Clickteam could find a better method of object handling by the time the game is finished.
So, I'll have to decide if I should switch to Construct and hope their community continues to develop stable versions for future operating systems, or stick with MMF2 and hope that better ways of object handling are made in the future. I'll probably starting asking around to see if there's an extension I can use that'll help out.
So I have the basics of the combat system rewritten in MMF2. I've made it so that every monster and NPC has a collision mask attached to it, allowing me to adjust their elevation in the game world, and I've also programmed the faction system so that monsters from different factions will fight each other just as much as they fight the player. It's pretty awesome how much depth it adds to the game world, and it no longer feels like every living thing is out for the player's blood. Almost like a simulated ecosystem of sorts.
Unfortunately, the amount of fastloops I need to make this work seamlessly is causing a considerable amount of lag. I can only have about 100 active objects in the frame before it starts slowing down, which is no good if I want to make dense forests or large mobs of enemies. After doing some extensive research on how I can optimize the code, I'm afraid there's really nothing I can do, as this is a built-in limitation of MMF2's software.
However, in my search, I learned of a freeware program called Construct Classic that contains many of the exact same features as MMF2, but provides quite a few shortcuts that simplify parts of game creation that would need complex workarounds in MMF2. It's like a mix between MMF2 and a raw programming language. The interface is surprisingly familiar, and the presence of an Event Editor means that I can easily recreate the events I've made in MMF2 so far.
Some immediate benefits I've noticed in Construct:
- Vastly improved object handling. Objects can have "Containers" attached to them, which means that you can link two objects together and they'll always act together when events are called. An example of this would be a Tank object acting as a Container for a Turret object. Whenever the Event Editor tests conditions for the Tank, only that particular tank's Turret will be affected instead of every Turret object in the frame. No fastloops or spread values required.
- A dynamic number of values and strings for each object. Objects don't have exactly 26 values and 10 string like in MMF2. You can add as many values and strings as you see fit.
- Backdrop objects can be placed above active objects, even on the same layer.
- In addition to a Hot Spot, objects can have as many Action Points as you want (Construct calls them Image Points).
- The default movements (Ball, Platform, etc) are actually really good and have fantastic built-in collision detection.
These are only the things I've noticed so far, and I'm sure I'll run into some other cool features once I grow more accustomed to the interface.
MMF2 is still really awesome, and I'll continue to use it for smaller projects, but it looks like Construct is better suited for the kind of game I want FableQuest to be. I won't be 100% sure until I migrate all of my events into it, though, so I'll have to see how far I can push it until it lags, if at all.
I've attached screenshots of MMF2's and Construct's event editors, for comparison purposes.
After roughly three and a half years of development, I think I've finally built myself into a corner. I find that the game file takes several minutes to load and save in MMF2, and all of the old events that I created when I was less experienced are starting to pile up on me. It's like opening a cupboard in your house that you haven't used in ages only to find that it's been taken over by bugs.
Does this mean that the project will be canned? NEVERRRR! However, an engine revamp is looking more appealing to me by the day. I'm strongly considering remaking the game from scratch, but reusing all of the assets I've created to speed things up (i.e. the dungeon layouts, graphics, sprites, etc.)
To put it in perspective, here are some of the benefits that I would reap from remaking the game engine:
- All of the bugs that have been plaguing me will be completely gone, and any new bugs that crop up with the new engine will be far easier to fix.
- Now that I know how to use functions effectively, I can cut down the number of events by a huge amount. For example, every line of dialog currently takes up its own event, but if I can condense all dialog use into a single function, this can easily chop off 1500-2000 events. Not to mention, it would make it far easier for me to edit dialog later.
- Instead of hard-coding all of the dialog into the game, I can extract it from an external file to make it easier to modify. This would also allow me to translate the game into other languages if necessary.
- Instead of using the illusion of 3D space, I could give the game world a true height map so that the player can actually jump over certain obstacles. This would cut down on invisible barriers, and it would also allow me to get more creative with the combat system (i.e. certain attacks tossing monsters into the air).
- I can divide different regions of the game world into sub-applications to reduce loading times.
- Now that I've fleshed out a decent part of the story and the game world, I can go back and make changes to the plot more easily.
- I can increase the frame rate from 50 to 60 without having to adjust all of the timing-related events to compensate.
This is only a thought right now, but when/if I decide to remake the engine, I will be releasing the old version of the game to the public, which contains roughly 33% of all of the planned content for you guys to mess around with.