• Hey! Guest! The 36th GMC Jam will take place between February 27th, 12:00 UTC - March 2nd, 12:00 UTC. Why not join in! Click here to find out more!

Alpha Final Fantasy for NES [PC/MAC Demo]

Hyomoto

Member
@tetherline - I'll admit it's more ambitious than I thought when I started :p

@Red_Wing - I looked into the old code recently seeing if I could clean it up a bit and I didn't hit that bug. I don't want to expend too much energy on it since it's a problem in the old engine, but at the same time it bugs me knowing the demo doesn't put it's best foot forwards. If you can help me track it down with the whole error message I'll see if I can't at least fix that.

@stenol - Then you are in the right place! It's not available yet, but there's another person working on a similar project to mine but they are using Unity. You aren't alone!
 
R

Red_Wing

Guest
___________________________________________
############################################################################################
FATAL ERROR in
action number 1
of Draw Event
for object parent_battle_actor:

I64 argument is unset
############################################################################################
--------------------------------------------------------------------------------------------
called from - gml_Object_parent_battle_actor_Draw_0 (line 9)
called from - gml_Object_obj_system_render_Draw_0 (line 21)
called from - gml_Object_obj_render_Draw_77 (line 108)


I didn't post the full error because it's the exact same error someone else mentioned. Happens right before the battle screen.
 

Bentley

Member
very region has something or someone who is contributing to this problem, and defeating them will also reduce the threat level of the whole area. As an example, the Kingdom of Elfland is being terrorized by Astos. As fight in that area you thin out the monsters, but once you've defeated him the whole area becomes safer. Thus there is a benefit to fighting. Trying to grind your way to the Marsh Cave may be quite difficult before you've taken down some of rabble around the city. In this way, running also comes with a sort of penalty. Yes, you avoid combat: but the threat level remains unchanged
Sounds very cool. Making my favorite game of all time even better : )
 

Hyomoto

Member
I hate to leave things dangling so it's probably a good time for an update. While rebuilding the engine I did some really great work concerning how the rendering pipeline works, it's some of my best work to date. So much so that I've been refining and iterating on it in a lot of ways. However, as for the rest of the project, I'm just not finding that I'm really happy with the results. What it really comes down to is some of the systems I want to create, I'm finding that my results aren't quite what I want them to be. What it comes down to is there are some systems I'm good at, and some systems I'm not and I don't want to build the game using half-designed building blocks. I know well enough that 'perfection' is a silly goal, and I don't mean to imply that I'm chasing some mythical standard. Heck, others have warned against that exact problem in this very thread when I announced I was rewriting the engine. But something that may come to no surprise to anyone is I'm completely self-taught. I've never taken a programming course in my life, and besides the manual for various languages I haven't even read a book on the subject. And while I do have more than twenty years of experience in coding, absolutely all of my knowledge comes from personal projects and observation.

Recently I decided to change that and picked up two books, "Game Programming Patterns" and "Procedural Content Generation in Games". The first is all about how to structure tasks in coding, and the latter is pretty self-explanatory. So what I've been doing recently is not so different to the Tetrix project I did a few months ago: prototyping smaller projects with an emphasis on trying out new ideas in systems.

So where does this leave this project? Right now, out in the cold. I do hate to leave a post like this, it's easy to read it as a death knell in a digital world obsessed with short term results. So the reason I am writing it is not to convince anyone I'm still working on it, I've literally just said I'm not, but rather explain why I'm not. This is a project I want to accomplish. It's a personal goal if you like, but it's not a short-term one or one I can satisfactorily finish. Instead I'd like to build up more knowledge and try out some concepts that have been bubbling in the back of my mind. I'll probably push a few smaller prototypes, enjoy some Stellaris (for reasons I'll probably never adequately understand), and let this one simmer a bit.

To those of you who have posted that annoying bug, @Red_Wing and @Roa, I uploaded a fix to that particular bug (should work, tests fine). It should be playable but as I've said before, I don't want to invest too much time fixing an engine I'm not going to use. Not to mention it's a bit... well, it's not total spaghetti but it's not terribly easy to pick at either.
 
When you're making a big game - especially when alone or in a very small team - even chasing good code is usually a pipe dream. As long as you release a product, nobody cares. The original Binding of Isaac, the recent Celeste, and heck, the original FF on NES are proof of that. Granted, I completely understand abandoning this project. It's a passion project, it's someone else's IP, and it seems like almost all code is unrecyclable. Others might be disappointed with your decision, but in the end, it's your decision. I'm certainly not going to criticize it.
 

Hyomoto

Member
@nacho_chicken - Rather than abandoning, I'd prefer to describe it as putting it aside. It's something I want to do, it's just not something I want to do right now. But, I'm not wholly against your description either since again, my goal isn't to leave some door open or convince people it's somewhere it isn't.

But, I will address one thing. A lot of the code I've written is quite good, at least from my perspective. I've come up with a number of novel ways to handle various tasks, and I've been really happy with how much I've improved in the time I've spent working on this engine. I came up with a useful approach to handling inputs, found ways to reliably implement frame skips, how to decouple the render size from the window size, gotten better at decoupling game systems in general, and a whole lot about how to handle the queuing and execution of tasks both in a single frame, and over time. I don't have to tell you this, but games are big. It isn't enough to write a battle system, or a map system, or a save system, or a controller system, or a music system, or a data system, or a render system, or any other word you could put before system: it's about tying them all together. And that is where I'm unhappy with the results, so my goal is to work on some smaller prototypes and experiment with some different styles. I'll return to this project eventually, whether publicly or privately, when I feel it's a size I'm better suited to handle.

But thank you for the words of support as well. A lot of people have spoken highly of the project, and I hate to put up a gravestone.
 

Field Magic

Member
I know exactly how you feel and have been there many times also. Its unfortunate because what you had managed to achieve was outstanding, I can't imagine how much work had gone into it. Looking forward to seeing what you do in the future.
 
J

Jafman

Guest
@Hyomoto After playing your Castlevania game I just had to give this one a try but the link is broken. Am I too late to the party? No pun intended, least not at first. Looks very good!
 

Hyomoto

Member
@Jafman I dug into this the other day and even though I updated the link it gives me the same issue. I'll figure out what's wrong, but for now I wanted you to know I looked at the problem and it seems Dropbox is misbehaving.

That said, you can try again, I did update the link, but it didn't work for me here.
 

Hyomoto

Member
@Jafman - While I can't say for certain, it seems to be a copyright thing. Perhaps someone thought I was distributing the ROM or something, which is a bit flattering though it's more likely a drive-by DMCA takedown. That seems to be the issue, however. It might be possible to subvert that but I'd rather not get my dropbox suspended, so until I can unblock the link it is, unfortunately unavailable.
 
J

Jafman

Guest
@Hyomoto Haha yikes I hope that's not the case! I guess a clone give or take is harder nowadays with modern day data recognition, it's easier to spot duplicate work on the net. The engine looks tight, are you thinking of using it in other projects if this is a stickup..I mean takedown?
 

Hyomoto

Member
@Jafman I'm writing/written (it's a living thing!) a different engine but some of it is definitely based on what I learned here. It'll end up a topic here eventually but if you are interested I post to the Gamemaker Mentors Discord, so that's one way to get a peek. But right now I'm using it in a small ARPG, I'll also be using it for the jam later this month.
 

Hyomoto

Member
It's been a while since I've updated here, and in many ways, it would be understandable to consider the project dead. This isn't entirely true. If you read back over this thread, you can see little omens of what was to come, as I spent time reconfiguring and rejiggering the codebase. The mistake that I ultimately ended up making is I didn't really keep good backups of the code as things progressed and after a while, I had a lot of clashing codebases with no way to return to earlier versions. This is why the final release build ended up with a crashing bug during battles that I really ended up being unable to figure out. Going down that rabbit hole, I ended up finding entire blocks of logic that seemingly went nowhere or did nothing. Probably remnants from an earlier time. Bad stuff, and in need of a clean start. However, starting over is never fun, and anyone who does it too much will likely never complete their project. It's just the way of things it seems. However, this still is a passion project, and despite having not really worked on this project directly, I have been hard at work on something else that I've talked about before.

For the past few years, I've been trying to write a useful toolkit that would help with the making of games. I don't want to dive into the nitty-gritty here; the short version is I see a lot of extensions and things people create as solutions. Solutions are all well and fine if you happen to have that specific problem, but what I want is more baseline and less rigid. I can code a platformer, or an RPG or a puzzle game. That's all well and good. Regardless of the type of game I make, however, there are some things I do over, and over again. Data storage and retrieval, controller inputs, scene transitions, etc... things that aren't really tied to a specific game but are generally helpful in any project. So, after five rewrites and a lot of feedback I've finally gotten them into a shape that I feel confident about. So what's the litmus test? Why porting someone else's project to my codebase and see how well they work. Next on my list is to reboot progress on my FF remake. It's too early to show off anything super concrete because I suppose, "I'm being more careful about how it is structured" is a fair enough description. That said, using those tools I was able to put together a few pieces fairly quickly and painlessly. Work has progressed from there. When I first started this project, I thought I would have a playable build in two weeks and probably be about finished in a month. Assuming that I had done a better job, it would have taken three times as long (or more, honestly) but it would have been finished. Given that I'm more than two years late, you can see where a lousy decision can get you off track.

So, I'll start updating this post as things progress, and I'll start talking about some of the underlying tools that will hopefully make this a more successful attempt. What I can say, having had two years to mull it over and one failed attempt to back it up, I am going to scale my ambitions back. At least initially. I want to aim for my original goal: a mostly faithful recreation of the original game with changes here or there to my personal taste. Once that is done, well, perhaps the sky is the limit. For now, this remains what it always was: a passion project. I don't expect most people are genuinely excited about a reasonably faithful adaptation of an NES game, but ultimately I do these things because I find it fun and I want to. For the few people out there who might enjoy it, well then it's for you too. Until next time, here are some images of things that are currently working. I'm still insisting on the dynamic color palette; it's something I decided I wanted to do day one and that much hasn't changed.

test_gif2.gif test_gif2 (1).gif
 
Last edited:

Hyomoto

Member
I'm not going to write a nice long post or anything, but I did reach another milestone I wanted to share. This time around, I am a bit lazier about how I handle things. When I started this project, I was coming off of GMS1.4. I didn't fully appreciate some of the new tools that are available in GM2, tools I am leveraging this time around. Namely, the room editor in GM2 is vastly more powerful and useful. In GMS1.4 and prior, I always built controlled"scenes," which were made up of depth-sorted objects that were self-contained. It works fine, and I still use this technique. For things like complex interfaces, however, it requires intricate control logic for things to happen in a "safe" way. Well, this time around, I'm just making the various interfaces into their own rooms. I don't really have to do it this way, but thanks to the expanded room editor, I can build a sort of WYSIWYG-style editor:
upload_2019-10-9_22-37-35.pngupload_2019-10-9_22-54-24.png
On the left is what I put into the room editor, on the right is what is seen in game.
Looks so pretty! There's still a fair amount of logic necessary to make this work, but it allows me to plan and visually adjust the scene. Behind the scenes, all of these objects provide sizing and other generic identification information that is used to structure the scene internally. I could still do this entirely in code. The room is just used to populate the parameters for these objects, and it could come from anywhere. The room does provide one extra benefit: I can leverage the scene transition logic. I can treat going to a menu exactly like changing a location. Internally it's all the same code. The underlying systems are smart enough to understand what type of scene it is and cull logic as necessary (maps have character-state logic that is ignored in scenes that aren't maps ).

I have actually finished all the vehicles as well. It is now possible to create and traverse every map in the game... if they existed.
That is my update for today. Interface logic has always been a bit of a pain, so having that done makes it easier, but there's still much work to do. I've decided to split the game into roughly two halves, and base my work on it that way. The first half is the world: movement, menus, saving, characters. The other half is combat. That may sound like an uneven division, but it's the type of work that matters here. The world logic, comparatively, is simple. Maps are a simple object to define some parameters, and everything else is procedural or derived somehow. Very little code goes into making a new map, usually two lines. The lion's share of World work is making the maps: the programming is relatively basic. Interfaces are like a middle-tier thing, a lot of their data is derived, but they do all need some custom logic. Battles, on the other hand, are super easy to build: feed them the party and enemy data. However, the actual logic and scene handling for a battle are where things get complicated. Right now, I'm estimating the combat scene will account for half of the overall game code. Right now, there are roughly 7500 lines of code. 4200 of those lines are FAST, the library backend I'm using. All of the interface and world logic takes up 3200 lines with another few hundred expected. Combat should easily rival that. That's my update, so until next time!
 
Last edited:

Hyomoto

Member
Here's a little add-on to what I showed off before. As I said above, the new tools do help out a lot with scene construction, but they do not make it any less tedious. The "editor," if you wish, consists of two pieces, the interface parent, the cursor, and the "placer" objects. The placer objects are boxes, images, and text that are replaced with their functional counterparts when the game starts. There are variations and adjustable parameters to affect, for example, how the text aligns. The rest of the magic happens in the interface parent, which essentially constructs a data tree of the scene elements to make it easier to access them. Now, you would be forgiven for thinking that these boxes contain simple draw calls, but alas, it does not work that way. For some things, like the menu tabs Equip, Trade and Drop, it's as simple as providing the path to that text entry in the string database. For the character name, it requires providing a lookup to the position in the Party tree. Things like the class name require looking up the character's class path in the Party tree, then retrieving the path to the text entry from the string database. Under the hood this is complex, but it's just a single line of code per entry:
Code:
        var _class    = node_get( Database, node_get( Party, menuChar + ".class" ) );
       
        ( node_get( Interface, "char.gfx" ) ).icon            = node_get( _class, "gfx.portrait" );
        ( node_get( Interface, "char.gfx" ) ).palette        = node_get( _class, "gfx.palette" );
        ( node_get( Interface, "char.name" ) ).textPath        = menuChar + ".name";
        ( node_get( Interface, "char.class" ) ).textPath    = node_get( _class, "name" );
Where it get's complicated is these lookups have to be written for every. single. element. There's some other complexities that comes out of how the engine renders different layers but what it amounts to is that building out the interface, let alone the various pieces of necessary logic just takes time. Putting together this one scene took between six and eight hours, with a few more hours for writing back end party logic that is needed here. The tedious part is it's mostly just data entry tasks coupling the various interfaces together. That said, I do think the result was well worth it and I'm pretty damn happy with this scene even though I sincerely hope this ends up being the most sophisticated screen I have to build.

upload_2019-10-13_1-40-46.png

On the left, you can see the overlapping elements. On the right, the results of this long work.
To speak briefly on design, you've probably noticed that the menus have changed profoundly. The thing is, the original interface in Final Fantasy, nostalgia aside, is functional. There are concepts I like about it, but it was the result of both time pressure and hardware limitations. While I am keeping the aesthetic alive, there are some conventions that I feel making adjustments is okay. For example, I've done away with the separate WEAPON and ARMOR screens, and replaced them with one EQUIP screen. The item and equipment limitations are principally the same, except instead of four weapons and four armor, you can carry eight pieces of equipment. This change will impact gameplay, different arrangements of special items are possible now, but the effects should be benign. Overall it is a change for the better and simplifies inventory management. As shown here, you can trade items to the other characters, equip and unequip, and drop items you don't want. It also provides an overview of the change in stats that would result from changing your equipment, a popular feature. That's all I have for today, until next time!
 

Yal

GMC Memer
GMC Elder
I'm all for being inaccurate when it results in a better end product! Go for those interface changes :)
(In today's climate it's kinda a scary prospect to make a fangame in the first place, but considering how retro stuff is as popular as ever, you probably could do a graphics replacement and redo map layouts to not be 100% identical to FF1 to make Original Concept Do Not Steal which could safely be sold and distributed and things)

I notice you're allowing for 5-character character names, which is a nice improvement :3 If you've got enough space to make spell names longer as well, it could help making some of the most illegible spell names a bit more understandable (e.g. instead of LIT, use BOLT, and PURGE could be more legible than HARM for the "turn undead" spell)

Another thing that would be nice would be having High-potions and X-potions, the original game only had the weaksauce potions that healed like 20 HP and you could only carry 99 at a time, so if you wanted to save up on magic you'd buy dozens of them in the endgame (one at a time, because that's how the shop worked) and then chug tons of them after every battle.

Another thing that always irked me is how the battle menu has this weird design where RUN is on its own and everything else is in the same column, it feels like a bad use of space to make the menu take up twice as much horizontal space just for one more word. But maybe that's iconic GUI design now... :/
 

Hyomoto

Member
@Yal - Hmm. Enter key slipped. Anyways, the nice part about this project is that all of the data is very malleable so when I'm done it will be a fairly decent engine if I want to use it for future projects. As far as names are concerned, they'll still be short but I'm adding space where I can, and as presented if I want to change something I will. Honestly, I really like the original game in a lot of ways that other people consider broken, but there are parts I know have not aged well. Things you mentioned like buying potions one at a time, but also having three button presses to use them.

I'll be talking about it later on I'm sure, but the game is powered by a custom parsing engine which allows new content to be added fairly easily. For someone like yourself this is all pretty rudimentary I'm sure, but since everything in the game is driven by this data, once the various interfaces are built it's possible to change or add content very easily.
Code:
@item.key        = 1
@item.item        = 2
@item.weapon    = 3
@item.armor        = 4

template.item    = {
    base    = { type = @item.key; buy = 0; sell = 0; name = "no.string"; use = 0; flags = 0; }
    $template:template.item.base
    usable    = { type = @item.item; sell = 0.5; effectivity = 0; }
    equip    = { sell = 0.5; equip_on = 0; equip_by = 0; effective = { family = 0; element = 0; }; attack = 0; critical = 0; accuracy = 0; defense = 0; mdef =0; evasion = 0; }
    weapon:template.item.equip     = { type = @item.weapon; equip_on = 0x01; }
    armor:template.item.equip     = { type = @item.armor; }
}
armor    = {
    body.cloth:template.item.armor    = { name = "armor.body.cloth"; buy = 10; defense = 1; evasion = -2; }
    $template:armor.body.cloth
    body.wooden    = { name = "armor.body.wooden"; buy = 50; defense = 4; evasion = -8; }
    body.chain    = { name = "armor.body.chain"; buy = 80; defense = 15; evasion = -15; }
  
    }
It is funny that the "fangame" is in such a strange place right now, but my intention has never been to sell this project. If anything I'm using it to refine a series of tools that I used to create it which I hope maybe will be worth selling. Thank you for your thoughts!

@CombatCalamity - I probably should pull down those links. The old version of the project is no longer available, sorry for the confusion. I'll update the main post.
 
Last edited:
  • Like
Reactions: Yal
@Yal - Hmm. Enter key slipped. Anyways, the nice part about this project is that all of the data is very malleable so when I'm done it will be a fairly decent engine if I want to use it for future projects. As far as names are concerned, they'll still be short but I'm adding space where I can, and as presented if I want to change something I will. Honestly, I really like the original game in a lot of ways that other people consider broken, but there are parts I know have not aged well. Things you mentioned like buying potions one at a time, but also having three button presses to use them.

I'll be talking about it later on I'm sure, but the game is powered by a custom parsing engine which allows new content to be added fairly easily. For someone like yourself this is all pretty rudimentary I'm sure, but since everything in the game is driven by this data, once the various interfaces are built it's possible to change or add content very easily.
Code:
@item.key        = 1
@item.item        = 2
@item.weapon    = 3
@item.armor        = 4

template.item    = {
    base    = { type = @item.key; buy = 0; sell = 0; name = "no.string"; use = 0; flags = 0; }
    $template:template.item.base
    usable    = { type = @item.item; sell = 0.5; effectivity = 0; }
    equip    = { sell = 0.5; equip_on = 0; equip_by = 0; effective = { family = 0; element = 0; }; attack = 0; critical = 0; accuracy = 0; defense = 0; mdef =0; evasion = 0; }
    weapon:template.item.equip     = { type = @item.weapon; equip_on = 0x01; }
    armor:template.item.equip     = { type = @item.armor; }
}
armor    = {
    body.cloth:template.item.armor    = { name = "armor.body.cloth"; buy = 10; defense = 1; evasion = -2; }
    $template:armor.body.cloth
    body.wooden    = { name = "armor.body.wooden"; buy = 50; defense = 4; evasion = -8; }
    body.chain    = { name = "armor.body.chain"; buy = 80; defense = 15; evasion = -15; }
 
    }
It is funny that the "fangame" is in such a strange place right now, but my intention has never been to sell this project. If anything I'm using it to refine a series of tools that I used to create it which I hope maybe will be worth selling. Thank you for your thoughts!

@CombatCalamity - I probably should pull down those links. The old version of the project is no longer available, sorry for the confusion. I'll update the main post.
Please do, I really want to try! :D
 
Top