River Nyxx

A development blog for FFVI3D, the fan-made Final Fantasy VI remake in 3D.

平成21年8月3日月曜日

Unfortunate setbacks~ >_<;

So I've been spending a large portion of my absense from the blog, working on various editors associated with FFVI3D, (I can't go into detail yet until they're more fleshed out- but they're intended as development tools that wouldn't see the light of day even on a professional game) as well as some side-projects of mine that I'm also intending to add into my cyberportfolio.


This weekend my house experienced a power surge, and it would appear as if my surge protector didn't very well succeed in doing it's job, as I am now finding myself with a couple of video cards that no longer perform all of their required duties properly. At least, that's how it's looking for now. Needless to say, it's quite difficult, nigh impossible to partake in certain hobbies of mine, and as such, it appears that FFVI3D's programming will have to sit at the wayside until such a time that I can get my computer properly repaired. I fear that such a time may be farther away than I would really like >_<;

ラベル: ,

平成20年12月13日土曜日

Quite the undertaking...

So the new File Manager I'm working on it taking quite the amount of time to properly implement, as it requires re-writing of EVERYTHING that loads from the HDD into the game- and it all has to be done in my special new format to allow easy saving to the HDD, as well as unloading of files, if it's supported by that particular filetype.


Everything is being done in a modular style, so next time I want to add a new type of resource for the game to use, I just have to create a new module to plug into my as-of-yet-unfinished File Manager.

Once I'm done with this (who knows?) I think I'll go back to working on that modular attack system I just barely started a month or 2 ago.  I think that's going to turn out well- and what's got me really excited about it is that it's going to be generic enough that I can use it on virtually any game I write from now on~  It'll support everything from "basic attacks" such as attacking and healing, up to "complex attacks" such as changing gravity, hurling objects via physics, setting game flags, or any other imaginable attack effect.

With the systems I'm creating now, I'm already thinking about my future projects, and trying to make things generic enough that they can (mostly) be used from project to project.  This'll save me boatloads of time on future projects, as well as allowing me to improve on my already tried-and-true systems that I have in place from my other games.

ラベル: , , , , , ,

平成20年10月17日金曜日

< /Summer >

Okay, so now with Summer out of the way, I'm starting to have more time to program again-- the summer festivities always tend to take away from that.  I still have to survive thru Halloween, as the costume/party preparations are still taking up a bunch of my time, but that's just like summer- it happens every year.


I worked my way thru a bunch of memory leaks (one of which had me pulling the entire engine apart to find it!) and other boring stuff that won't really interest anybody, but while doing so, I've had more time to reflect on the class structures I've got in the current iteration of the battle state.  I'd have to say that as things stand right now, I'm really not happy with how it all works together- it's just too messy, and horrible to read/maintain.

So I've decided I'm going to rewrite the classes for handling actions in battle, and am seriously considering rewriting large portions of my script class to add more versatility to it.  I've learned from reverse engineering another game in a side project of mine, of some other methods to load scripts into RAM that will provide easier access to various things such as variables, etc..

Battle actions will be rewritten in such a manner so as to be more generic, and modular.  This'll not only provide me with reusable code, but also an easier means thru which I can add more actions to any "battle" in whatever game it is that I'm programming.  This class is going to be quite powerful in that it can accept actions that do virtually anything in the game, but all thru a generic interface that makes the custom actions rather easy to write and plug-in, quite possibly by means of my script class as well, but we'll burn that bridge when we come to it.

All that said about the future, what have I actually done lately?  Sadly, not much- but I -have- already started taking steps towards the rewriting of the battle actions handler, in that I've written some base classes and gotten it basically "working", although not really tied into the engine properly yet.  That'll all come with time.

ラベル: , , , , , ,

平成20年5月26日月曜日

while (!sleep) sheep++;

So I've been spending the last few weeks implementing battles and the associated algorithms into the game, as well as occasionally being unmotivated, and instead playing video games. Regardless of which activity it is that I'm involved in for the night tho, I haven't been getting huge amounts of sleep, haha ^-^v I've started trying to go to bed earlier tho, as I've found my cognoscence start to lack when my sleep levels get too low, which ultimately results in less production by time.

I've gotten so far as to implement a rudimentary battle interface with the basic commands "Fight" "Magic" and "Item"- although currently "Magic" and "Item" do nothing. I've also put together a fairly extensive set of algorithms for hit detection and damage calculation. Virtually every type of attack can now be made with these 4 functions. I've put these 4 functions into their own class that can be configured remotely by scripts. Typically, each script will do the same thing, that is, ask the player to select a target, pass that target to the attackHandler class, pass the type of attack being made to the attackHandler class, and request the attack be made. The only different thing a script may want to do (off the top of my head) would be to request an attempt at applying a status effect on the target. Everything else tho, instant death, elemental weakness, etc.. is handled in the attackHandler class.

That in mind, it will be virtually nothing to actually start implementing spells and have them called with the "Magic" option in the interface. I'll just have to put something together to allow the player to select a spell (or an item, in the case of selecting "Item"). That's really the only reason those 2 options aren't functioning yet.

I have a basic "target selection" system in place, but for all intents and purposes, it's just for me to throw a target at the attackHandler class. It's going to get almost completely rewritten for end-product.

Additionally, I've started implementing custom sceneNodes and sceneNodeAnimators for my specific needs in the game- things like the movement/fading/etc effects of the damage text and whatnot, that appears briefly on the entity in question.A couple of bugs have been preventing me from expanding too much on that yet, but the basic effect is there.

I had to start teaching myself some DirectX (Irrlicht typically hides this from the programmer...) so I could write some custom material handlers for Irrlicht, as it didn't have a material or 2 to do some of the things that I want.

ラベル: , , , , , , , ,

平成20年4月6日日曜日

Polishing and upping the standard

I've now gone back and polished up the GUI Manager, and the Script Manager to support more things-- most notably, the GUI Manager now supports scripts being executing on various other events other than merely selecting an item.

Scripts can now be executed when a layout is shown/hidden/paused/resumed, and also as a cursor moves in any of the 4 cardinal directions off of any given item.

Additionally, the layout files can now pass a single identifier into the script they're calling, so a script can be aware of which GUI element is calling it. This will allow the scripter to use a single script for multiple GUI elements. More relative values can also be used for placement/sizing options for the various GUI elements, such as percentages, and centering. This will allow for GUI windows/etc to resize themselves based on the resolution of the game.

On top of those feature additions, various small bugs have been squashed, and some optimisations implemented as well. I'm shooting for a professional level game here, so I want the code to be as robust and efficient as possible.

As far as my work on the battle state goes, I've created the basic classes required for character creation (and theoretically, monster creation as well, although it's not currently implemented...) and have created all the necessary data files for all of the 14 standard characters that will be playable during the game. All of their data (even the unimportant stuff, such as background info) is loading correctly, and I've also created everything required for levelling up, so I can now create any of the 14 characters at any level, and all the numbers will match the original game.

I have yet to decide exactly how I will format temporary playable characters such as General Leo, Biggs, Wedge, and Banon tho.. If I take a hint from the original Super Nintendo game, I'll end up creating them exactly like the other characters, and just never introduce a situation that will allow them to remain in the party permanently. That's still some time away tho, as I still need to implement more important things such as monsters, and the actual battle sequence!

Graphically, I've put together a basic system to allow character meshes to be composed of 3 pieces: Legs, Torso, and Head, (ala Quake3) which will allow for much more complicated animations with much less work required.

Some of the next things I'll be working on will be the scenery loader, to properly load the battle scenery/information, monsters, and the monster formations. Once I have that all in place, then technically all the data I need will be loaded, and it will just a matter of manipulating it to actually perform a battle.

ラベル: , , , , , , , , , , , , , ,

平成20年3月19日水曜日

Time to get this battle started~

Okay, so I've now gone thru and finished off my script manager, and I've created a screen processor for handling full screen shaders, "filters" if you will. I can now stack filters to have multiple effects at the same time, applied to either the 3d Scene, or the whole screen including the GUI. I've written up a simple "mosaic" shader in HLSL and it now gets applied to the screen (with varying strength) when you try to select a disabled menu item, or back out of a menu you're not allowed to back out of.

I've also created an audio manager for handling of all music/sound effects in game. Currently all it does is act as a music play control, and a means thru which my classes can acquire 2d sounds, that is, sounds that don't represent anything in 3-Dimensional space, such as GUI sound effects, etc... Once I start having something in a format I want to represent it in, in 3D, I'll be throwing in the functions for 3d audio as well. And that, my friends, should be coming soon enough.

I've got back and streamlined a bunch of my initialization functions, making them faster, and more importantly, I've implemented a means for the game to compile my custom scripts into a format that it can load MUCH faster. I ran a test on my long test script, and when left to parse/load the raw script, it took 183 milliseconds to load, but after compiling it, just loading the compiled version took under 2 milliseconds! Yesyes, much better. *nodnod* FFVI3D can also load both compiled and non-compiled HLSL shaders now as well.

The commands available to the scripting language have been extended a touch to include option value acquisition as well. And also scripts can now be attached to interface layouts, to be executed when the layout is opened/closed/paused/resumed as well, which is quite useful for self-adjusting layouts, such as an options/config screen.

So now, I'm looking at what to do next, and I think it's finally time to start dipping my toes into the battle-state lake that I have been eyeing for quite some time now. Tonite I'm going to start work on some of the frameworks required by the battle-state so that I can start coming up with something real to show off sometime in the hopefully-not-quite-so-horribly-distant future^^

ラベル: , , , , , , , , , ,

平成20年3月1日土曜日

Script Manager down, who's next?

So, the 2nd iteration of my Script Manager is up and running now. Everything is working beautifully, it's fully recursive, which means I can have expressions with parentheses, and math in function parameters, etc.. It also looks a LOT like C++... the only really noticable difference is that I don't use curly braces ( "{" and "}" ) anywhere, and opted to instead go for a "if/endif" and "while/endwhile" route instead. Other than that, it looks quite a lot like C++, function definitions, etc.. Well, I guess more appropriately, it would be closer to C, since my scripting language doesn't support objects, but whatever.

So this is the final test script I was running to make sure everything was working fine (and it is!), just so you can have a taste of what the language is capable of. Take note, that this doesn't actually make any calls to functions in the game itself, but they are fully supported (I was testing those in a different script file...)

number testFunction5(number x, number y);
number i;
i = 2 * (2 * ((1 + 1)) + 2) / 3;
print("*****FINAL RESULT*****");
print(i);
number r;
r = 5 * x * y;
r = r + 50;
r = r - 23;
r = r / 10;
string tst = "part1:";
tst = tst + "part2";
print(tst);
return(r);

void testFunction2(number num);
print(num);
num = 45;
print(num);
return;

string testFunction(string str1, number numbah);
print("Output- displays nothing since it is only useful mid-operation");
output;
number num = numbah;
print(str1);
print(32);
print(num);
print("constant text called explicitly");
expose;
return("text returned from function to main");

void testFunction3();
print("Test function 3");
return;

number testFunction4();
return(1337);

entry;
number n1;
boolean boo = false;
string s;
print("Before loop scopes:");
expose;
print("Inside loop scopes:");
while (n1 == -1 && !boo);
print(s);
s = s + "a";
if (s == "_aaa");
boo = true;
endif;
expose;
endwhile;
print("After loop scopes:");
expose;
while (n1 < 20);
print(n1);
n1 = n1 + 1;
endwhile;
while (n1 <= 40);
print(n1);
n1 = n1 + 1;
if (n1 >= 34);
break;
endif;
endwhile;
string str1 = "yay!";
string str2;
number num1;
print("Before ifelse scopes:");
expose;
if (str1 == "yay!" && str2 != "" || num1 == 0);
print("Inside ifelse scopes:");
expose;
print("Before if scopes:");
expose;
if (str2 == "_");
print("Inside if scopes:");
expose;
print("true");
endif;
print("After if scopes:");
expose;
else;
print("false");
endif;
print("After ifelse scopes:");
expose;
number num2 = 100;
str2 = "text";
num1 = 50;
string str = testFunction("text passed to function and thus is stored in variable", 42);
testFunction2(3);
testFunction3();
number ret = testFunction4();
print(ret);
print(str);
number n = testFunction5(num1, 23);
print(n);
boolean b = true;
number nr = 1.5;
print(nr);
expose;
end;
Of course, all of the variable names, constant values, etc.. are all random and make no sense whatsoever, as they were only being put in to test specific constructs in the scripting language itself. As far as the scripting language itself goes, there's only 3 things I'm currently considering still putting into it: do/while loops (which we can do without, as we have a basic while loop...), and for loops (which we can also do without, but it would be less scripting for a simple type of loop, if it was implemented), and lastly, a means to have the script wait for something in-game to occur, and trigger the script back into action again to finish off. The main thing I'll need this for is to implement in-game cutscenes, so I can have a script (for example...) tell a character to walk north 10 meters, at which point the script will wait until the character arrives at that point, at which time the script could continue to tell that character to say something, or some such.

Now I'm quite firmly involved in finishing off all the little notes I left for myself in my code months ago. With all those little things done, I'll be working on the battle state.

ラベル: , , , , , ,