5/31/10 -Monday: LOTS OF CUSTOM ENEMY WORK... |
So, me and my fiance went to the river for a little picnic, to celebrate Memorial Day in our own little way. After eating, as usual, we both just walked around, taking in the sights and whatnot. The tradition for me is to listen to music I'm either putting in the game, or thinking about putting into the game. I have brainstormed many ideas just walking along the river bank, or in the woods, listening to various pieces of music. In particular, I made sure to load up my iPhone with the new music I've been listening to for the past week. As I continue to sift through more and more albums, I'm finding a lot of good stuff. Sometimes, I wonder how much great music is out there, that I don't know about. Thank you, Pandora :)
When I got back into development, I continued work on the new custom enemy I started yesterday. The first thing I did was re-tint their armor, to resemble what I had in Cry The Beloved. It was a damn shame that I actually forgot the exact colors, and had to sift through old journal entries to find a screenshot. I must be getting old if I can't remember stuff I implemented just 3 1/2 years ago!
After I was satisfied with the new tinting, I moved on to what I was contemplating doing yesterday: giving them a Unsion Ability. This particular one is a Timed Unison Ability, which means you have to perform 2 different abilities and get the timing just right, to make it work. I had already designed this one months ago, and I've been happy with it so far. Well, it turns out making it work for enemies was literally just as easy as changing the condition to see if the ability will be used or not. So, at some point in the script, before the ability is activated, I make a check to see if the participants are party members. I just had to add in a check to see if the participants where hostile enemies (towards the PC, that is), and it worked like a charm. I have to say, I was damn proud that my earlier design was extensible, and that this change was painless. Was nice to see these new enemies using this ability on me. I may have to balance it a little more, because now that I am on the other side of it, I realize it may be a little too much!
I'm actually getting ahead of myself a little bit, because before they would use the ability, I had to create a custom AI package for them. This was really split up into 2 pieces:
- Extend an existing AI package they use so that they use the particular ability needed for the Unison Ability.
- Create a new levelup package for them so that they start the game with the ability already learned.
While it's not that much work when you know what you're doing, since I hadn't made a change like that in months, I had to go through a 20 minute crash course to try to remember what the HELL I was doing. Now, with the AI package, as I mentioned, I extended an existing one. At the moment, I want to keep things as general as possible, though I know I will most likely go back and make things more granular, making AI packages for each individual enemy, so I can have as much control over things as possible.
While I was knee deep in 2DA hell, I ended up cleaning up a bunch of superfluous ones I didn't need. See, whenever I get some idea for something where I need to utilize a 2DA, I usually just copy an existing one, and override the entire thing. Just a quick and dirty test. Well, when you compile the 2DA, it generates files for each worksheet. So, when I was making changes to ItemVariations.2DA for the custom clothing Archon made for me, I just C&P the entire thing, then added the new item at the bottom of the appropriate worksheet. But, that damn thing has like 20 worksheets, which generated SO many files in my module export folder. Well, this is mostly boring stuff anyway, but I needed to create these 2DA's the right way, so I just bit the bullet and handled that as well. Nice to have it out of the way.
The last thing I did was start work on yet another level. Turns out, this was one I was procrasinating on for a long time, one that the player will see earlier than the events I am implementing at the moment. Turns out, the player will be coming back to this same area at the moment, so working on it sort of kills 2 birds with 1 stone. I was actually able to knock out the foundation, and put in a whole host of props and things, so I can consider it done for the moment, just so I can continue with the gluing process.
Tomorrow, I'll focus on some more encounters, as well as some more dialog (I'm going to stop including the word "stage" when talking about dialog, cause every dialog I write will have a stage, it seems!). Oh, and there is another custom enemy I need to work on, though the player may not run into them for a while, so there is no rush at the moment. We'll see.
Till tomorrow...
5/30/10 -Sunday: PLOT PROGRESSION... |
Plot progression continues to move at a brisk pace, I am happy to say. I've really been in a groove since Thursday, just knocking stuff out pretty quickly. It helps that I have more experienced with the toolset, allowing me to fly through things I would previously have had to read a tutorial on.
Keeping in line with my predictions from yesterday (scary!), I fixed up the lighting in certain places in this new level, created another stage/dialog for the end of the area, and setup the last encounter. I played around with different setups for the encounter, just to get things perfect. One thing I try to avoid is just having the enemy appear in front of you. It just looks dumb to me. However, if you can see the enemy, and they only attack after you step over some arbitrary trigger, that also looks stupid. In some cases, I would just leave the enemies activte/hostile, and be done with it, letting the game handle things. However, for speicfic reasons I cannot go into, I need the enemies to be activated at certain parts. I got around this by hiding them around corners (you're sort of being surprise attacked anyway), so when they appear, you won't see them until they come barreling around the corner to attack. Actually, another reason to only activate enemies when they are needed is good for performance. No reason to have the AI of enemies running, when you're not even fighting them.
Finally, before ending my night of development, I started creating the next custom enemy that the player will start to fight. I'll need to re-tint their armor to better resemble the same armor used in Cry The Beloved (was that a slight teaser?!), but they are more or less done. The only thing I need to figure out is if I will give them the ability to use a particular Unison Ability. (this ability is not on the list on this site, it's currently undisclosed right now). At the moment, it's only available for the player and another party member, but really, there is no reason why that cannot be extended to anyone in the game who meets the prerequisites. Lucky for me, I designed it in such a way that it will work for anyone (I just put in a temporary condition to only include certain participants). I'm sure I'll have to re-work something I missed, but it shouldn't be too hard.
I have to say, it's nice to finally start seeing my vision come alive. Sure, it's been alive for months, but getting all these pieces put together to form a cohesive story feels good. Personalities are being defined, the "This character is an asshole" or "I love this person" people are being defined, and more importantly, the world is slowly being introduced to new players, and re-introduced for old players. From the perspective of the player that you control in the game, you're learning things at an accelerated pace, and trying to take it all in, with so many events happening around. At least, that's what I hope people feel :)
Till tomorrow...
5/29/10 -Saturday: ANOTHER LONG DAY OF DEVELOPMENT... |
Today started off with me accepting the fact that I would have to purchase a product key for Windows 7, which I recently installed after my hard drive crashed last month. It's a good product, and I haven't had any issues with it, so they deserve the money, no matter how evil people think they are (how cliche is it to hate a company that makes a lot of money :) ). To be fair though, I use Ubuntu at work for development, and their OS is really getting better. Damn shame you need Windows for games and game development...
So, continuing with the work on the current sequence, I started to make another level. Thank the gods this is a pretty straightforward one, which will just involve some combat. I did have to mess with the lighting a bit to get the effect I was looking for, but it worked out in the end. I also did a little stage work, and wrote a few lines of dialogue fo the conversation that occurs when you enter said level.
Designing the combat was pretty interesting. For one thing, I had to make sure that each encounter was just a little harder than the previous one, while also feeling as if you needed to use different tactics to win. At the moment, the combat will be difficult for those that don't take advantage of some custom abilities I've created. That's another story for another day, but even custom abilities have to be rolled out in such a fashion as to not overwhelm the player, to make sure they get their heads wrapped around it.
Anyway, another issue is designing combat in a way that works around wonky AI. Many times, I've seen people complain about the AI in the game, and while it's valid, a lot of it could have been fixed by smart area/combat design. I mean, assuming you are using the UT_Team* suite of functions, when you call UT_TeamAppear, and an archer is placed behind a wall, don't be surprised if he just stands there, or tries to shoot through it. Make sure to put him in a place where he can immediately take part in combat, not rely on the AI to get him there. Enemy placement is so important. It was things like this that I spent some time on today. I essentially played the same sequence over and over again for an hour or so, in different ways, to make sure the combat AI would hold up. The only issue I had was a follower switching to a dagger from an enemy got too close to him, but not switching back to a ranged weapon when the enemy was killed. I know it's possible for that, so I just need to find the right AI package for him.
Tomorrow, I need to finish up this area (inclduing lighting), create another stage/dialog, and the last encounter for the area. Then, depending on how I feel, I could either start on another small level where a lot of plot events take place, or I could clean up a lot of small bugs that have been in the game for a while. The biggest offender is some sort of inventory duplication bug. For some reason, pieces of armor are showing up twice, and even items that shouldn't even be spawning on the pre-gen character are still showing up. Not game breaking, just annoying enough that I thought I would mention it :)
Till tomorrow...
5/28/10 -Friday: AH, NICE TO HAVE A NICE LONG DAY/NIGHT OF DEVELOPMENT! |
Man, I haven't had a day of development like this in a while. Since my office closed at noon today, I worked from home, up until about 2 or so, just wanted to make sure the Ruby scripts I was working on were... working :) So, where to begin...
NON-PARTY FOLLOWERS So, I'm at a point in development where I need to add some non-party followers to my party for a short period of time. Nothing too fancy. Then came the part for area transition (yeah, I know, this again!). Well, seing as though the followers were in my party, I assumed they would transition with me. Nope. Hell, it even says it in the comments of the function used to add them. The fact that all the areas are in the same area list didn't do anything either. It's important to realize that this problem is slightly different from the one concerning creatures NOT in your party.
Undeterred, I started looking for some sort of TRANSITION event I could catch, and then just manually transition the non-party followers. After about a 2 minute search, I found exactly what I was looking for: PLACEABLE_ACTION_AREA_TRANSITION. It's used when you click on placeables to transition, like doors. Great, so all I had to do was write my own version of placeable_core.nss (roe_placeable_core.nss), check for that event, then loop through all party members (including the followers), and manually transition them. Easy enough, right? Right???
Well, turns out the function, GetPartyList(), only returns regular party members. Sigh... Okay, so there has to be a function to return non-party members, right? Wrong! Well, at least I didn't find one. God help me if there is one, because it means I wasted a lot of time tonight, as you will see.
So, at this moment, I'm thinking, "Shit, now I have to create a custom door with a custom script for each transitioning situation." Although in retrospect, maybe just one door that redirects to scripts via a tag would have worked as well. Regardless, the point is, I didn't want to have to know who needed to be transitioned, I needed a system. Then, I had one of my light bulb moments!
I forgot I was already using the Unlimited Variable Storage package. My thinking was, I could just keep my own list of non-party followers in an array, and reference them when needed. Then, I could just have the one script (roe_placebale_core.nss) query this list and transition everyone in it.
I sifted through the library of functions, and found these promising functions: StoreObjectInArray() and FetchObjectArray(). Seemed simple enough. I would just wrap the existing function, AddNonPartyFollower () in my own custom function, which would call StoreObjectInArray(). Whenever I needed to get the list of them, I would just use FetchObejctArray(). Perfect. Here's the function to add the non-party follower:
/**
* This will add a non-controllable party member.
* This essentially does what the normal function does,
* but changes the group ID to match the party leader.
* Also stores in separate array since game doesn't
* do it automatically.
*/
void AddFollower(object oFollower)
{
AddNonPartyFollower(oFollower);
SetGroupId(oFollower, GetGroupId(GetPartyLeader()));
StoreObjectInArray(FOLLOWER_ARRAY_NAME, oFollower);
}
Then, I started running into some bugs. After adding them, when trying to retreive the array, I would get all the followers that I stored in there, as well as 2 objects that had the name, "Invisible Object". I know this object is used in the main library of scripts, but I just didn't want to spend time debugging, to see what was going on. Annoying as it was, I just wrapped FetchObjectArray(), with my own function, and filtered out the unwanted items before returning the list. Here's that function:
/**
* Retrieves all followers.
*/
object[] GetFollowers()
{
object[] oTemps = FetchObjectArray(FOLLOWER_ARRAY_NAME);
//fucking hack. for some reason, these "Invisible Item" objects
//keep appearing in this array, so remove them
int index;
int nFollowerIndex = 0;
object[] oFollowers;
for (index = 0; index < GetArraySize(oTemps); index++)
{
object oFollower = oTemps[index];
if (GetName(oFollower) != "Invisible Object")
{
oFollowers[nFollowerIndex] = oFollower;
nFollowerIndex++;
}
}
return oFollowers;
}
Then, I started thinking about what happens when I remove a single follower. I didn't see any existing functions to remove a single item from a stored array, so of course, I just wrote my own. I was getting extremely tired at that point, so I took the easy route. I just got the existing list of followers, purged the array cache, then re-added them, minus the follower I removed. I didn't feel like getting too deep into the library of functions, so this one will suffice. I know there are a host of more effecient ways to handle this, so I'll likely come back to this when I need to.
Now however, I have complete control over non-party followers, and more importantly, they will transition with my main party whenever I go through any normal door transition. Well, only to areas within an area list. For other areas, I have other ideas in mind, but I'll look at that tomorrow... EVERYTHING ELSE
After that little non-party follower debacle, I was able to move on to other things, such as testing some more combat. I'm not going to go too crazy with the balancing at the moment, but so far, it's around the difficult I'm looking for. I messed around with the coward package for some NPC's, and so far, it's okay. I may extend it to do what I want, because it's a little weird when an NPC runs into the middle of a fight, then starts holding their face in fear. Why not run the opposite direction? Yeah, I know this game has pathing issues, which is why I may come back to at some point.
Oh, and I will probably be back to messing around with some auto-leveling packaging 2DA's as well, for some other NPC's that take part in combat. It's been a while since I did that, so I'm sure there will be a little learning curve.
At the end of the night though, I have to say, it was a very productive day/night. And I still have 3 more days off!
Till tomorrow...
5/27/10 -Thursday: FINALLY!!! |
Well, it's been a long time, and anyone who's been following this blog knows, I've been talking about it for a long time... That's right, I've finally gotten back to combat design! This is where I can really excel, and there are so many things that are involved:
- Custom creature design (not custom models, but, AI and such)
- Custom abilities
- Unique situations
- Balance
So, there is a cutscene that precedes the action, but I needed to play around with how many creatures I will be having in the particular area first, to checkout the performance. It'd definitely better to be proactive, rather than realized late in the game, you're having performance issues. Anyway, I played around with a certain number of combatants, and I feel good with things so far. After a few more tests, I will know the exact number of people needed in the cutscene.
I also got the custom combat music into the scene, via FMOD. I first heard this track while listening to RPGFan Radio back in 2006, literally days after I released Cry The Beloved. This particular scene literally came to life in my head, just by listening to this track. On another note, damn shame the guy who ran it shut it down, because of the increasing costs (hell, I would have ponied up some money to have him keep it going)... In fact, many tracks used in this game, I first heard on that radio station. Whenever I heard something I like, I made a note of if in textpad, and looked it up later. I was really exposed to some new and great music that wasn't Nobuo Uematsu, Yasonaru Mitsuda, etc. Good times.
Anyway, I also handled some pre/post scripting for the fight, including the *wait for it*... transitioning of creatures to the area. On that subject, I received a PM from community member FergusM about a function I may be able to use from utility_h, called
UT_PartyStore. I got a chance to look at it briefly, and it does do some interesting things. I may be able to pull out what I need from it, and create my own function that will handle moving party members and such around. Thanks, FergusM!
Tomorrow, I'll put an end to the first part of the sequence, and start the next. This will most likely include getting in that new custom creature. Not sure if they're going to have a Last Resort or not. With things like that, I really need to focus on how to slowly roll them out, so they have a big impact on the player. If they keep seeing them over and over again, they'll start to lose their appeal. Anyway, I have a few ideas, but I'll just cross that bridge when I get there. I also need to re-color the armor of more people as well, to continue to get back that Rose of Eternity look and feel. With the long weekend, I really need to get as much done as possible!
Till tomorrow...
5/26/10 -Wednesday: MINOR CLEANUP WORK... |
So tonight, I didn't get that much done, because I wanted to get to bed as early as possible. I have literally gotten 4 hours of sleep the past 7 days in a row, and I needed to break the chain. In fact, I've been so tired that while writing journal updates on the train, I pass out :)
So, I just focused on some polish type stuff. I added even more glue, making sure that I could run from the very beginning of the game till the last stuff I've implemented. As expected, various things had changed, which broke some things. It wasn't a big deal fixing them, and it felt nice to get them done. This thing of a story that I have in my head is now starting to make sense in game, when taken as a whole.
I was able to work around the whole creature transitioning thing by adding all the areas in this particular sequence into the same area list. So far, I haven't noticed any performance issues, which is sort of amazing, to say the least. This is definitely not the way to move forward, but for now, it works.
Tomorrow, I will be starting on the biggest sequence yet for this game. I'm going to skip one of the cutscenes, and get down to what I love to do: implement interesting, custom combat situations. I already have ideas for one particular custom enemy, and the scripting should be straightforward. The most difficult part will be the AI, which will be handled through their respective 2DA.
Oh, and for whatever reason, it totally slipped my mind that I will have tons of development time coming up. I work from home tomorrow, since the office closes at noon on Friday, I'll work from home that day until noon as well. Then, we have Monday off. So yeah, no excuses, time to get stuff done!
Finally, this new music I've been listening to is really starting to catch my ear, more so than I expected. I know I already mentioned that, but now, it's moving into the realm of "This could be the theme music for character X". It's that good! I think I'll try to get more of their albums, as there are like 6 more I believe. Ah, music... My 2nd passion, to video games, of course!
Till tomorrow...
5/25/10 -Tuesday: DESIGN DECISIONS - COMBAT VARIATION... |
Before I get a little long winded, I have to point out this piece of machinima that was created using the Dragon Age toolset cutscene editor. Simply put, I was extremely impressed. Now, I was looking at it from a purely technical point of view, and was really amazed how well they blended the animations and camera movement. Top notch stuff, really. I hope more stuff like this continues to come out in the community.
COMBAT VARIATION
I may have talked about this already, and surely I've mentioned it in journal entries from years ago, but here we go again...
Simply put, for the majority of the game, the player has to be challeneged in one form or another in each encounter. Now, challenge doesn't just mean inccreasing the HP's of the enemies, or just throwing more of them at you. I'm thinking of other things as well, such as how you kill the enemies. There was actually a pretty in depth thread about this in the general discussion forums, with people taking 2 distinct sides (this is the internet, right?!).
The general point of the thread was that the enemy variation in Dragon Age was too little, and that tactics you used in early levels could be used in later levels. I agree with it to a point. Morrigan'sCone of Cold was pretty much my go to spell in the game, by far. By the end of the game, I was really using the same strategies over and over again, and in particular places (I'm looking at you Deep Roads), things just got very repetitive.
Now some will argue that you cannot have a story based game, with a strong emphasis on the combat. That was some of the excuses people had, in favor of Bioware. I call bullshit on that. It's certainly harder to do it in a non-linear game, but not impossible. Here are some key things that I think are needed:
COMBAT HAS TO FEEL FRESH IN THE MAJORITY OF ALL ENCOUNTERS
The concept is simple, really. The player cannot keep going into situations, thinking, "Shit, not this again?!" How do you accomplish this? Well first and foremost, you need to acctually use different monsters. Failing that (I understand thte current monster model list is somewhat limited), you need to drastically change how a particular monster fights.
Here's a very simple example. We already have genlocks in the game. You essentially fight the same ones over and over again throughout the game. Perhaps there could be a variation of a genlock, that has extremely powerful armor on. Armor that can only be destroyed by a certain spell the player unlocks during the game. So, in odrder to defeat said genlock, you must first cast the spell X amount of times to destroy the armor, allow your melee allies the ability to finish things off. That's just a minor example, but you see where I'm going with this.
Another thing is putting the player into different types of combat situations. Maybe you need to flee an area, but are forced to kill enemies on the way out, increasing the tension. Perhaps you fight in an area with some mages as party members, where magic cannot be cast, making you use some of their other resources. Maybe you need to split your party into 4 smaller groups, knocking off various parts of an area, before reuniting in the end (I actually did something like this in Cry The Beloved in the Dungeon of Summons).
Long story short, very unique sequences. Think of them as set piece battles, but on a slightly smaller scale.
NON-SUPERFLOUS ABILITIES
I've always been a quality over quantity guy, and this extends to abilities. I simply hate throw away abilities, abiliites simply there to pump up a number when describing a game (i.e. my game has 96 new talents and spells!). One design decision I've always stuck to is creating unique abilities that serve a purpose. Final Fnatasy was one of the biggest culprits of this flaw. You all know what I'm talking about... Firaga 1, Firaga 2, & Firaga 3. All essentially the same spell, just more powerful. Why not just have a Firaga spell that levels up either by how much you use it (I love that leveling system), or if you have to, determined by your own level. Get rid of the bloat, cut the fat... whatever you want to call it, it needs to go.
Instead, focus on very unique abilities that serve more than one function. Anyone who played my NWN games will remember Illuminate. You could use it to stun enemies (which could be upgraded), make certain enemies flee from it, light your way, and solve certain puzzles. All of that from just one ability.
In my opinion, a player should feel a sense of accomplishment when learning a new ability. That just won't happen when you've gained ability #34, which is essentially ability #24, just a little stronger, with a faster cooldown.
DIFFICULTY SLOPE
This is a hard one. I have essentially seen 2 different ways this is handled, especially in the beginning of games. Either A) the player is extremely weak in the beginning, making the game harder at first or B) enemies are weaker, making the game very easy in the beginning.
Many modern games make beginning areas easy, assumingly so people can gte used to the contrrols. Final Fantasy XII comes to mind. Then, you have games where you're weak as hell, and must tread carefully. Baldur's Gate 1 comes to mind. I'm a proponent of the latter. From the perspective of an RPG, when starting out, you're a low level, so therefore, anything should be able to kill you. I love being weak, just being able to fend for myself. It makes level gaining that much more rewarding. I never really got this feeling playing Dragon Age. I always thought the enemies were just slightly more powerful than me... Which brings me to my next point...
...This is where the hills and valleys come into place. I love the feeling of gaining a new ability, and being able to defeat previously tough enemies easily. But, this shouldn't last too long, because another set of difficult enemies should be right over the horizon. It's really a fine line, but important nonetheless. Point is, the player needs to feel heroic at some point... Just not all the time.
CONCLUSION
It should go without saying that I am following these methodologies while developing. I readily admit it's easier for me, because I know right away the party makeup in most situations, which special abilities you will have and should be using, etc. Still, I hope players find my style of game design fun.
Till tomorrow...
5/24/10 -Monday: AND SO STARTS ANOTHER WEEK... |
This is going to be an interesting week. The French Open is on, there's like 13 hours of daily coverage between the Tennis Channel and ESPN2, and I feel obligated to watch as much of it as possible. Luckily, it's only the first week of grand slams that are crazy. Once you've made it to the 2nd week, which is essentially the round of 16, I don't have to be glued to the screen as much, as there are only so many matches. I got even luckier today, because Roger Federer played his opening match, and it was relatively quick and painless. Then, no other matches really interested me, so I was able to pretty much skim through the rest of the recording.
However, to make room for all the tennis coverage, I needed to get through all the tapings of 24 that I had. I think I've watched like 7 hours in the past 2 days, and I am just down to the series finale, which I'll watch tomorrow night (it aired tonight). The show has had its ups and downs, but these last few episodes have been pretty good, and I can't wait to see how they handle Jack Bauer in the end. Is he killed? Does he get away, and finally get some peace in life?
------------------------------------------------------------------------------------
While all of this was going on, I of course was developing. As I've stated earlier, I'm going through the gluing process, piecing all the various sequences together into one coherent entity (I hope!).
Progress continues to move at a swift place. A few things came up:
- I need to figure out how to handle the transitioning of party members. More specifically, because of story related reasons, they will leave your party at various points. At the moment, I've just had an instance of said party member in every area they've been needed in, as I've just been spot testing. Now that I need to test end to end runs, I need to properly transition.
Realistically speaking, the solution isn't too hard, I just need to implement it. Getting the party member from the opening areas of the game to this particular one won't be hard, because they'll be a part of the party, so any transition you do with the PC will bring them along.
Once they're in this new area, there are 2 area lists. I should be able to use one of the positioning funcctions to move them around at least in areas in the same area list (SetPosition()?). The only wrinkle is how to get them to the area that isn't part of the area list. I feel like there isn't a function for this, which is sort of annoying. I don't want to resort to having specicfic versions of them for specific areas, because as the original template is updated over development, I'll have to make sure all the other ones are updated as well.
If I do have to resort to having multiple versions of them, then there's the issue of variable/inventory/reputation thngs to carry over, as well as other custom things I am not at liberty to speak about at the moment. I'm not saying these things are difficult, just stuff to think about. The good thing is, once I come up with a generic solution, it can/will be used everywhere.
- Related to the first bullet, I need to handle how to move non-party member/important npc's around, trying to avoid having splot specicfic version of them.
- With regards to day/night transition, I need to figure out how to handle it. I mean, I guess there's no way around it, really... I'm going to need 2 version of every level/area. For interiors, it's not as serious of a problem. The only thing that needs to change is the music, and perhaps the dimming of some torches? At the moment, I'm just using the same area or both day and night, and merely changing the music.
With regards to exterior area, thankfully, there are atmoshphere settings that can be saved, and applied to levels. So again, all that needs to be done is some lighting changes, and the changing of the music.
And of course, all plot related events need to be scripted as well.
With those things handled, I will be in a good position to move on the section of the game I purposely left weeks ago, because I ran into game designers block. I've had a long time to think about how to tackle this really big, upcoming sequence, and I can't wait to get it done.
Till tomorrrow...
5/23/10 -Sunday: DEVELOPMENT WITHDRAWL... |
So, we didn't end up getting back from Baltimore until 9:30 ish. That in itself was fine, but then there was this little issue with my DVD running out of space... I have about 8 hours of 24, and a bunch of other stuff. Guess what started today, and will be going for the next 2 weeks? The French Open. So, I knew I had to clear space out as fast as possible. So, I went on a 24 binge, going through about 65 episodes. I also did delete some stuff I knew I would never watch. All of this means that I know I won't be going to sleep until around 2am, knowing I have to be up at 5:30am. Good stuff...
With regards to development, I believe the last full day was on Thursday. I'm eager to get back into things tomorrow night, and since it's the opening rounds of the french open, and I will be mainly doing minor scripting tasks, I should get a decent amount of content done. It's always a little weird going back after a brief break, mostly because I don't remember what files I was woring on, or even in rare cases, what I was working on period!
Till tomorrow...
5/22/10 -Saturday: THE KEEPER OF THE ROSE... HOW SHE WAS CREATED... |
Just want to get something out of the way. I went to Baltimore, Maryland, for a surprise birthday party for a good friend on Friday. Since I know he has read this blog before, I didn't want to say anything suspicious. Anyway, as you can expect, I've been away from my development computer since Friday, and will be until late Sunday. I still have my laptop, which I can use to write these blogs... Anyway, back to the topic at hand.
So yesterday, I talked about the Keeper of the Rose, and how I needed to focus on more of her personal story. Today, I'll briefly talk about how she was even created...
Around 2001 (2 years after I initially started creating the world), there was already a pretty solid foundation for the events of these games. A very high level foundation, but it was there, nonetheless. Still, something was missing. Something... different. While I believed the story to be very good on it's own, I still felt like it was missing a core element, if you will.
Well, one night, I was listening to Looking In by Mariah Carey. The song is damn near the saddest thing I've ever heard. The music, the lyrics... you just feel her pain. While I had heard this song many times before, something just struck me that night. As I always do when listening to inspirational music, I began to brainstorm.
Seeing as it's Mariah Carey singing about her pain, I started thinking about some woman who sings about her pain (what a coincidence!). I actually initially envisioned a woman kept as a prisoner in a snow globe type of thing, looking out onto the world, wishing she could be out there with them. Even show flakes were falling around her. And of course, she was always singing. Next to her was a single rose, the Rose of Eternity, with petals falling off, ever so slowly.
The next key thing, the fact that she grows old, dies, and is reborn over and over again, well, I don't remember where that idea came from. But, I did envision it over and over again in snow globe type thing. In fact, I would play Looking In over and over again, and mentally create a cutscene of her transforming in key with the specific verses of the song.
As time went on, the snow flakes turned into rose petals, and the whole snow globe thing gave way to the Garden of Roses. Next, she became someome that people started to worship, and from there, I began messing around with the idea that it's the people themselves who are keeping her in her prison. Then, all the core ideas that show up in the current games just started flowing freely from my mind.
Then, development on her back story sort of stopped. It wasn't until abour 2 years ago that I started to expand on her, this time, her personal history. And that's where I am today.
Till tomorrow...
5/21/10 -Friday: THE KEEPER OF THE ROSE... |
Right. So, the Keeper of the Rose is supposed to be an important figure in this entire series of games, right? I mean, seriously, she is literally the heart and soul of everything. Everything revolves around her, and the pain she has endured for 4000 years. And still, people don't know much about her. She's been relegated to being the star in all of the opening sequences of the games, and that's about it.
In Rose of Eternity - The Coming, the game starts out with a prisoner telling Ranon about her. The player sees her walking around the Garden of Roses, singing. They see her as a little girl, aging to a woman, an even older woman, dying, then being reborn. All of this is happening, while the seasons continue to changes, through rain and snow, sun shine and darkness. If you think about, going through this cycle for 4000 years would drive a person mad!
In Rose of Eternity - Cry The Beloved, the game actually shows her briefly before she is placed in the Garden of Roses. It shows her being led from her homeworld, and being transported to her jail. I actually made a video of this, and I just need to figure out how to get it show up on the internet. This laptop will help out with that, now that I can do stuff like that on the train.
Now, the thing people have to realize is, while she is a sort of mystical being now, before her fate was decided for her, she was a normal girl, like anyone else. She had dreams, aspirations, etc. All of that was taken away from her when she was selected for this task. It was quite unfair, actually. Out of all the people in the world, why her? She asks herself this question every day.
These are things I will be addressing (plus much more, which I cannot spoil at the moment) in this next game. While she has always been the overarching main story of the games, once things get started, I've always focused on the people in the actual world. Which is fine in itself, but I always had ideas to expand on her lore, then ran out of time. It's a shame really, because there is really so much more to her than people think.
I really look forward to doing this, because as I said, she's the face of the game. It's all about her, really. She needs to face time :)
Tomorrow, I will talk about how I was inspired to create her, and the many forms she has taken throughout the years. Till tomorrow...
5/20/10 -Thursday: MORE SCRIPTING... |
Today was more of the same, really. Tons of plot scripting, and plain old scripting in general. Nothing too fancy, really. It is amazing how much work needs to be done to make sure players don't break the plot or anything. Not hard work, per se, just very meticulous.
Now, the one interesting thing I spent a bit of time on was simulating a fading in/out effect. Besides in cutscenes (and apparently dialogues, more on that later), there isn't any really easy way to achieve this. In NWN1/NWN2, there was a simple Fade function that was great to use, sadly, nothing like that exists in Dragon Age (that I know of).
At any rate, I started this thread on it, and got some answers from Amstrad Hero and Fergus very quickly. It turns out, you can convert a line in a dialogue to a cutscene. I didn't really get the concept until I actually tried it out, however. Essentially, for that particular line, you can essentially do anything you can do in a cutscene, including fading in/out. Lucky for me, this fade effects needs to happen during a certain piece of dialogue, so I was already in position to make use of it.
There are some minor wrinkles to work out, but all in all, it seems like it will work just fine. Shout to to those guys for pointing me in the right direction, because honestly, I had no idea that aspect of the toolset even existed!
Anyway, things are coming along just fine. I just have some more minor scripting to handle, then it's on to the show piece of this particular sequence. You know, it's one of those things I've been thinking about for years, blah blah blah. Let's hope my vision somewhat matches reality!
Till tomorrow...
5/18/10 -Tuesday: PLOT DESIGN NIGHT... |
Well, I had one hell of a night dealing with plots. It's always the small things that get me. Complex scripting? No problem. Figuring out why plots aren't updating? Hella tough!
So, this has to do with some plots I previously spoke about, maybe 2 months ago. Essentially, there is an area plot, that has a subplot, which then has 3 subplots. As you finish off each of the 3 subplots, a check mark is added, so you know what is left. It's essentially the way to handle piece meal quests, where the order doesn't really matter. Or, at least one way to handle it anyway.
Last time I worked on it, I got the 3 sub plots working, and for whatever reason ,moved on to something else. Probably level design, or a big cutscene :) Anyway, I needed to finish this off, so that when all 3 sub plots were completed, the parent plot ended as well. After thinking about it for a few minutes, I came up with a solution where everytime one of the sub plots was finished, it set a parent plot flag, and in the script for it, I would check to see if all 3 of the sub plots were completed. If so, then I would set the final plot flag for the parent, which essentially closes out the quest. Simple enough. Yeah, right...
It turns out, if you set a plot flag, and then in the script handling for it, set another plot flag (which in turn calls a script), the value of the first plot flag hasn't finished processing, so it's impossible to tell if you just finished it or not. Here's an example of what I had:
--------------------------------------------------------------------------
/*
* BRC (c) Copyright 1999-2010
*
* Plot file for Reconnect_Gillis.
*
* 04-Apr-10 LB Created.
*/
#include "utility_h"
#include "wrappers_h"
#include "PLT_RECONNECT"
#include "PLT_RECONNECT_GILLIS"
int StartingConditional()
{
int nResult = FALSE;
event evEvent = GetCurrentEvent();
int nEventType = GetEventType(evEvent);
int nPlotFlag = GetEventInteger(evEvent, 1);
if (nEventType == EVENT_TYPE_SET_PLOT)
{
switch (nPlotFlag)
{
case RECONNECT_GILLIS_START:
SetPlotGiver(GetObjectByTag("gillis_1003"), TRUE);
break;
case RECONNECT_GILLIS_END:
SetPlotGiver(GetObjectByTag("gillis_1003"), FALSE);
WR_SetPlotFlag(PLT_RECONNECT, FINISHED, TRUE, TRUE); //<-----------THIS WON'T WORK
break;
}
}
return nResult;
}
--------------------------------------------------------------------------
Now, when the script for PLT_RECONNECT was called, I tried to check the value of RECONNECT_GILLIS_END, but it always returned FALSE, even though I had obviouly just set it. In the end, I just had to break up the setting of the plots in the particular dialogue they're called from. Not a biggie, but was annoying for a while, as I just couldn't tell what was happening. In the end though, I learned something new, so I'll never have to deal with this again.
Even with the above issues, I accomplished a lot tonight, I'm happy to say. Tomorrow will be the normal big night, and I expect it to be filled with more plot scripting, journal entries, etc. Slowly, but surely, getting there.
Till tomorrow...
EDIT - Before I forget, wanted to point people to the blog of the 2d/3d artist helping me out, Archon.
http://my.opera.com/DarkSunsGlare/blog/
5/17/10 -Monday: DAMN MULTI BRANCHING PATHS! |
Today, I decided to add more branches/roleplaying options to this particular dialogue. It's amazing how one little branch can create that much more work for you. Really, I just keep coming up with little ideas of how things can pan out in the short term, as well as the long term, with the decisions you make. At the very least, it was fun :) I also did a lot of journal writing, as well as plot file making, that go along with the different outcomes.
I also did stick to my original plan, by handling a lot of the post dialogue scripting and such. As expected, it wasn't anything too special and/or difficult. One minor wrinkle I did run into was the fact that if a party member had never been added to your roster at least once, the approval functions won't work. Since I'm currently spot testing, I just had to modify the core script for the area to add then immediately remove said party member, so I could verify the approval changed accordingly. Also, I was happy to see that in one dialogue, if you add 5 points of approval, then remove 5 points, no popup is displayed at the end of it. I was expecting to see 2 pop ups, one showing the +5, one showing the -5. Good job, Bioware programmers!
I still need to add some post ambient popup dialogue, but besides that, I can safely say I am done with this sequence at the moment. Now, I'll move on to the gluing of all the various sequences.
-----------------------------------------------------------------------------
On the music front, I have been essentially listening to the same tracks from this new artist over and over again. It's weird, really. Sometimes, when I hear something once, it just has that sound to it, that vibe, where it's an instant classic. Then, there are other pieces of music that just take a long time to appreciate, but once you do, it's almost as good as the aforementioned instant classic. That is what is happening now. I'm already imagining certain cutscenes and scenarios with certain pieces. I haven't come to any conclusions, but there is potential!
-----------------------------------------------------------------------------
With regards to the laptop, I had to go through the arduous task of backing up everything on it, before I can reformat everything. Oh, and the CD drive doesn't pop out, so that needs to be fixed as well. I was hoping to have it up and running by Wednesday, so here's hoping!
Till tomorrow...
5/16/10 -Sunday: NEW LAPTOP!!! SORT OF... |
So, I have inherited my Mother's old laptop, until I get a new one. It's a Dell Inspiron 9200. It's a few years newer than my broken one, so perhaps it's a 2007? I can't be too sure. What I am 99.9% sure of is that Dragon Age won't run on it. It would be nice, because honestly, if I could just boot up the toolset itself, that would be great. Unfortunately, I simply doubt it.
At any rate, it's not a total loss. While I may not be able to develop, per se, I'll be able to do other things. First and foremost, I'll probably start writing my daily journal entires on the train now, instead of the night before. That'll give me a little more time at night. I'll also be able to write dialogue, even though it will be annoying as all hell copying and pasting it into the editor.
The biggest use I will get out of it is the ability to make upgrades to the website. When it comes down to making website changes, or game development, the latter always wins. However, now I'll have roughly 4 hours to devote to the site every day on the train, which is pretty good. At the moment, the site is definitely geared towards my NWN games, with the exception of this blog. That needs to change. I don't know how, but it needs to change nonetheless. I also want to start moving into the 21st century, and start rolling out some videos. I actually put a lot of effort last fall in creating various videos for the NWN games, then, they just never worked when uploaded to the site. That was literally the week I started my new job, and I haven't had the chance to look at it again. Now is the time. I may also invest in a new media player, perhaps this JWPlayer I've heard about. I've got other ideas, but I need to keep something to myself, you know!
-------------------------------------------------------------------------------------------
Development went pretty well today. It was definitely focused on one particular piece of dialogue, with new roleplaying choices added as I wrote it. In the beginning, there were to be 2 different ways to handle things, now there are 4. They're subtle choices, but choices I am proud of nonetheless. This is also, by far, the longest piece of dialogue in the game. I even get a little lost in all the expanding trees of it every once in a while :)
I pretty much tied up all the loose branches of it, and now, I just need some minor scripting to finish it off. I'll come back later and finish off adding animations, gestures, etc. I just need the core of it working, so I can move on to other things. What are those other things? Well, I need to essentially glue 4 sequences that I developed apart from the others. That will mostly involve scripting, so while I won't get stuck with anything, it may just be a bunch of busy work. What else is new.
Till tomorrow...
5/15/10 -Saturday: SOME STAGE/DIALOG WORK... |
Even I have learned my lessons from the past. I was thinking about having a short intro cutscene in the current area, and then thought that perhaps it would be overkill. I haven't totally vetoed the idea, but I definitely skipped it and got down to business.
First, I added the neccessary participants of the scenes. Easy enough. Then, I created the stage, and added them there as well. Then, I messed around with the camera angles a bit to get the right look I wanted. Again, easy enough.
Next, I got down to the nitty gritty: the dialogue. Turns out, I had a lot of fund writing it, for various reasons. For one, it's allowing me to establish the personality of a major character in the series. Throughout the game to this point, the personality has slowly evolved, and at this point, people should have a good, general understanding of this character, however, not neccessarily all their motives.
This particular dialogue also allows me to drop little gems here and there about major characters in the sotry, and the world in general. For old Rose of Eternity fans, names will be dropped where you'll be like, "Oh wow, I remember that person. That's what they've been up to during the past 20 years!". For new players, well, you'll just have the opportunity to get aquainted with said characters for the first time. As I've said many times before, it's hard to balance keeping old/new fans happy. I will try my best, nonetheless.
Finally, this scene shows how I've evolved as a game designer and story teller. Rose of Eternity has always had some level of gritty realism to them, but I'm taking things to the next level in this game. I've thought long and hard about how certain players will react to it, so I've carefully placed roleplaying choices to allow players to skip/change certain things. But, for this entire section of the game, I really need to drive a certain point home. This will all make sense once people actually play it!
The final thing was the integration of the music . This selection came to me relatively late. While I had been listening to it for years (no, seriously, since like 1998!), I never imagined it going with this particular scene. Now that I have it integrated, it's apparent that it fits extremely well. It's also going to double as the main theme of one of the major party members.
All in all, this was one of the better days of development I've had, if not for anything else, for how well things came out. Usually, things turn out different than I planned years earlier, but this came damn close. --------------------------------------------------------------------------------------
On the community side of things, there is a nice thread about lighting going on at the Social Site. I actually learned some things myself, such as about how to use bloom effects and such. I'm way too busy at the moment, but that is something I can look into during polishing time.
Also, it finally looks like were on the cusp of the release of a lot of modules (not that I am one to talk!). 2 in particular that I am looking at is Alley of Murders by Amstrad Hero and The Bloodworks by Alexandus. Previous events in history should show that I'll never get around to playing these, while I'm working on my own. However, since they are add ons to the OC, I may try them out, since I want to at least play a little of the OC a couple of times a week. In fact, I mentioned doing just that a week ago, but for whatever, something is overriding something in the Single Player campaign, because no one can attack at all. I'm sure I can trace the issue easy enough, I just didn't care enough to try. Regardless, the point is, people are working on stuff, and hopefully, by the end of the year, players will have a healthy selection to choose from.
Finally, just wanted to point out this link from Gameinformer. It shows the opening sequence for many SNES RPG's. When I first saw the link, I thought "Great, they'll have Final Fantasy 4, Final Fantasy Mystic Quest, Final Fantasy 6, Secret of Mana, Chrono Trigger, and more." Yeah, of all the games, I only cared for Secret of Mana. Still, it was a nice blast from the past to see how things were back then. Ah, good times.
Till tomorrow...
5/13/10 -Thursday: MAIN PROTOTYPE DONE... |
So, I got off to a later start than expected, mostly due to a bunch of work I had to do for... well... work :) When I work from home, I usually connect to the company network via our VPN. For the non-technical, our VPN allows me to connect to all things (machines, sites, etc.) at work, as if I was there. Then, I always have a VNC server installed on my laptop at work, that I can connect to from home. That allows me to run my laptop desktop at home, albeit, slower than if I was at work. Well, my company laptop has been acting up as of late, and the vnc server doesn't seem to work. Because of this, I've been forced to develop like it was the late 90's again :)
Essentially, I still connect to our company VPN, then I open up a putty window so I can directly connect to my laptop at work. Remember, this isn't like VNC, so I don't get a desktop screen or anything. Just a damn terminal. So, all the code that I've been writing has been in emacs or vi, which are just barebone editors, though some hard core people still swear by them. Luckily, I've been doing a bunch of Ruby scripting work, so those editors are just fine, as I don't need a debugger or anything like that. I even installed DBVisualizer on my desktop at home, so I can connect to our company database via the VPN, and everything worked out allright. It just took a hell of a time to get it all setup. If I get around to it, I'll actually checkout our code base on my machine at home through tortoise SVN, download and install eclipse, and just work like that from now on. I'd rather work on the native linux laptop, but windows is servicable.
Anyway, back to game stuff! So, since I got a late start, I was only able to finish the prototyping of the area. The exact structure is done, as well as the lighting. When I realized it was getting too late to start working on cutscenes, or dialogs, or stages, I decided to just start adding in props and whatnot. In fact, that is all that is missing from the level itself: just some more props.
As always, I'll leave that till later. Tomorrow, I will be able to focus all my energy on the aforementioned cutscene/dialog/stage.
Till tomorrow...
5/12/10 -Wednesday: LEARNING NEW STRUCTURE LAYOUTS... |
Tonight, I started on the new interior level I mentioned yesterday. Since I'm using a new set of structures for it, there was a little bit of a learning curve to get things working, much like the exterior level I worked on last week. Most of the pieces fit toegther quite well, which is a god thing. Unfortunately, some key ones do not, so I had to get inventive with it, to make it look realistic and whatnot. The biggest issue I deal with is filling in gaps between various structures, like a staircase, with a wall next to it. If the wall is too close or overlaps, you'll get a clipping effect. If it's too far away, then there will obviously be a hole. I won't bore evryone with what I did, but it looks well enough.
I also fixed the lighting issue I had yesterday. The light intensity was set to 0, which obviously means it won't reflect on walls or anything like that. I was actually running into the same issue with this new level, fixed it, then went back to the other level, and fixed it there as well. Anyway, I bumped it up to 0.5, so it at least shows up on the walls, but maintains the dark and gloomy-esque mood I'm looking for.
Tomorrow, I'll finish up the last few sections of the level, and then start on an extremely brief cutscene, followed by some stages, and conversation work. There will be at most, 6 people in this conversation, so I imagine I will spend a lot of time getting the cameras for the stage to be just perfect. I'm sure I'll also be messing with the lighting as well, to make sure everyone looks perfect. Man, I never had to deal with this level of perfection with the NWN toolset! Luckily, all the hard work will produce something many times greater than anything I could have done with the former toolset.
Till tomorrow...
5/11/10 -Tuesday: STEADY DAY... |
Nothing spectactular happened today, just a bunch of grunt work. Still, it's gotta be done at some point! So, I continued work on the new interior level. After creating the 2 sub rooms, I decided to split things up into logical interior rooms, not for anything else, so I could render lightmaps for particular rooms only, which speeds things up greatly.
I am having some weird issue where the lamps I have on the wall aren't changing the color of the surrounding walls. They are affecting the PC and other creatures, which is good, just nothing else. I have all the properties set, so it might end up being something in my packages directory again... what a shock... I'm not sure why this has been happening all of a sudden, but it's not annoying enough to make me spend the little bit of time I have after work on it.
With regards to the 2nd floor that I mentioned yesterday, I decided it's going to be another interior level. It will be in the same area list as the top floor, so there will be no loading screen when transitioning. I actually found the perfect set of stairs under a particular category of structures, but the damn thing isn't walkable. It's a shame really, but oh well. So, I spent the last few minutes of my night figuring out how to handle the transition itself. In the end, I decided to go with a simple trigger laid down at the top of the staircase. There will be no prompt, you will just be transitioned downstairs. I don't think it's a big deal, because the transition will be quick, and if the player went down there by mistake, going back upstairs will be easy, because of the aforementioned area list.
Tomorrow, I can start in earnest on this 2nd floor. It will be even smaller than the 1st floor, so it should be relatively easy to knock out. I'm going to try something new with the lighting in this particular level, only because I've had a specific idea of what it should look like for quite some time. Chances are, our current lighting solution won't accomplish what I want, but won't hurt to try.
Finishing this next level is quite a milestone for me, because dammit, I will finally be able to get back to some scripting/conversation writing/custom ability design/etc. I've been going on and on about it for some time, but this is it. This last level is all that needs to be done for the moment. Truth be told, I'm not actually burnt out on level design this time around, but there are funner things that I can be doing.
Till tomorrow...
5/10/10 -Monday: NEW MUSIC TO PLAY WITH... |
So, after listening to Pandora for a few days, I think I have found a candidate for an artist whose catalog I want to investigate further. I'm not giving any names away, but their name is very interesting. When I saw the name, I thought, "Wow, this person must make good music. Look at his name!" Damn marketing schemes... Anyway, I found some of their music on iTunes, got an album, and started listening to it tonight.
So far, it's a mixed bag. There are absolutely spectactular pieces on it. Then, there's a bunch of throw aways. Let's contrast that with the other artist I found via Pandora 2 years ago. I have all of their albums, and the majority of the songs are great. And this is across a 7+ album catalog. I still consider myself very lucky to have found them.
I'll stick with this particular artist, because what I do hear on Pandora is great stuff. I just need to keep up with my due diligence, and I'm sure I'll find something I absolutely have to have in the game.
As for actual game stuff, it was pretty straightforward. I started on the new interior level, which I might add, is incredibly easy these days, thanks to all the pain I went through months ago :) It's refreshing to know what I want, and just be able to do it without figuring out new things. I did have one hiccup, where I was still exporting the level from the Single Player module (which I was doing for the last exterior level, so water planes show up), and when I switched to my module to create the corresponding area that uses the level, any change I made to the level wasn't reflected in game because it was being overrided in the packages directory. Yeah, sucks to be burned by that, but it's something I figured out fast enough.
I'm still figuring out of this interior level will just be one small interior, or 2 extremely small interiors, mostly because there are going to be 2 floors, and I'm wondering if it's a cleaner soluton to just transition the player between the 2. I would like to keep it all in one level, but I'll have to do some more research on it.
Oh, and un-related to the new music I've been listening to, I need some new music for this area. Somehow skipped my mind. *Delves into 10,000+ songs*!
Till tomorrow...
5/9/10 -Sunday: DONE WITH PROTOTYPING... |
So, I was supposed to start on the interior level, but I was having too much fun working on the prototype, trying out things here and there, that I just scrapped it, and decided to have a go at it tomorrow. The main thing I did was actually create the outside version of the interior building I will create tomorrow. As always, consistency is the key here, so creating the outdoor version simply reinforced what I will have to do tomorrow with the interior version. I was also able to dress it up a little, giving it a sort of unique look to it.
All of that said, I'm done with this prototype. I have enough to continue the plot, and get to other parts of the story. I can do more polishing later on. Another reason I need to leave this level alone is because the biggest building in it hasn't been locked down yet. More specifically, I'm tinkering with adding some more areas to it, from an interior perspective. That of course will have to be reflected on the outside. Because of this, I don't know how much/little space I need to be able to show it, and since you cannot re-side levels after creation, I need to wait to make sure. In the end, I only want to have the level as big as needed. No superflouous stuff. I'm constantly thinking about performance and such.
Here's to a good week of development.
Till tomorrow...
5/8/10 -Saturday: LONG ASS DAY! |
What do you know, I actually kept my word. I got up early (well, earlier than usual), had breakfast, got a haircut, went to the gym, and was back home around 3pm. Besides having dinner, flirting with taking a nap, I was extremely focused on development. And what a day of development it was!
I started the day off by fixing that issue with the all black PC thing that was going on. I'm still not exactly sure what is going on, but when I exported the level from the Single Player module, all was well. In fact, the theme of the day was to just work out of the Single Player module when wokring on the level. Things seemed to go smoother that way :)
Once I was done with that, I contined adding some minor lighting related props. These lighting props actually consist of 4 components. The model, the fire vfx, and 2 types of light sources. Luckily, I have already saved these as groups a long time ago, so plugging them into new areas is a piece of cake.
After that, I began to mess with the atomoshphere settings again, to make the sky darker, and the clouds darker as well. Then, I successfully added a wind effect. Not sure why it never worked before... Nice to see the trees sway in the wind, and it will likewise be cool once I add in some banners.
Accompanying the wind was some nice sound effects I found. Even with my old games, I was always big on sound effects. For some reason, when playing a lot of older NWN1 mods, I always noticed a lack of sound effects... I guess it's at the bottom of many people's list of priorities. Anyway, I got a nice gusting effect going now, and I added some water effects near every part of the coast.
The cherry on top was the integration of the music that will play in this area, at least at night time. While I've had this piece of my iPhone for 2 years now, it wasn't until recently that one day on the train, I listened to it, and had one of my *light bulb* moments. I was even surprised at how well it fit with the area.
Once all of the above was added to the level, it just started feeling right. I've as good an imagination as anyone, but seeing/hearing is really believing, and it's nice to see the level really start to take shape. Especially since I was so down on it a few days ago.
After all of that was done, I added some placeholder creatures, and in particular, the one I created last month, that has gone from being a small NPC to perhaps a party member. Not content them just standing in the area, I started on some dialogue for them. Not a lot, but just a little something for the time being. As always, I will come back and clean it up later. Still, it's nice to start getting them fleshed out a bit. Since I'm on a roll, tomorrow, I will start on the next interior level, which should be pretty easy, seeing as it's quite small.
Oh, and I finally got around to checking in all my art resouces into my remote SVN repository, since my hard drive crashed. Call it laziness, but I just kept saying, "Oh, I'll do it later", and so on and so forth. Interestingly enough, I hadn't been back to the site that I setup the repo at since I initially did it months ago. So, I literally had no idea what hosting site it was, and what my SVN repo URL was. Luckily, I still had a private message from community member Sunjammer (he originally suggested the site to me), and was able to find the site (bookmark it this time!), and get the repo URL. All I had to do was re-download/re-install Tortoise SVN, and I was good to go.
In other related news:
--------------------------------------------------------------------------------------
Besides writing this blog, I frequent many blogs of my peers. I've been meaning to show some here for quite some time, so here they are. Bear in mind, I'll do something more permanent (i.e. put them on a side bar) later:
The last four our blogs courtesy of my fellow Ossianites, who worked on Mysteries of Westgate with me.
Finally, I am treating myself tonight. I'm about to load up my Mage origin save in Dragon Age, which just happens to be at the point when you enter Ostagr for the first time (my favorite part of the game). Hell, I developed for like 8 hours today, I deserve this!
Till tomorrow...
5/7/10 -Friday: NOW WE'RE TALKING! |
I admit I was in a bit of a slump the past week, mostly related to real world things, but today was a good recovery. I continued my work on this new level by adding some test props in different places, to see how they will look overall. Sometimes, it's hard to get an idea of how something will look, or even the scale of something, until you actually run the game, and that's exactly what I did. It was actually a lot of fun, going through the props in DaTool (for the 100th time!), mixing and matching things. I saw a lot of stuff I know I will end up putting into the final area, and I can't wait till I can see the final product.
After messing with props for a while, I decided to dive into atmosphere settings. Off the bat, one thing that was driving me crazy was everytime I created a new atmosphere setting, any time I tried to open it up, it would be set at the default settings. Turns out, I was hittng the "Create An Exportable Area" button, instead of the "Exportable Area Properties" button... *Smacks forehand in disgust* Anyway, one thing that is nice about it is, you can save the atmosphere settings, and apply them later. So, I can actually create a day version, and a night version of the atmosphere settings, and apply them when needed on the final levels. Still not as good as having day/night transition, but still workable nonetheless.
Now, all things weren't good (are they ever?). When I was testing the normal day level, things were fine. As soon as I switched to the night time version, like half the area was cutoff, and I couldn't see the PC. Not like, they were totally black or anything like that... They were just invisible. Not sure what I'm missing here, but I'm sure the solution will present itself at some point. EDIT - I'm writing this update while running some final tests on the area. Looks like it may be because I didn't define the area (essentially tells game what part of an area you can walk to, see, etc.)
Finally, I've been listening to Pandora as of late. Not sure if I ever mentioned it or not, but I would say an extremely important set of music features in the game is from an artist I just happened to come across when I first started using it back in 2008. I had sort of been stuck in my ways about music, and all of a sudden, I discovered this new artist, and I was blown away. I scooped up all of their albums (about 6-7+), and have been loving them ever since. Anyway, I sort of stopped using it for a while, but I think I will start again, to see if I can discover anyone else. Speaking of which, if anyone reading this blog has any ideas of any music they would like to hear in this game, feel free to drop me a line at gamecoder@optonline.net.
Well, that's it for me for the night. Tomorrow, I'll sift through some final props, then start adding in the neccessary creatures for this area, just for testing puroposes of course. I'll fill it in all the way when I get around to creating the real version of the level. From there, I'll move on to a smaller interior (woo hoo for a small level for once!), which the accompanying 30 second intro cutscene (woo hoo for short cutscenes), and the extensive dialogues (oh well, everything can't be short!).
Till tomorrow...
EDIT2 - Now the entire area is visible, the PC is just black. Yeah, I'm too tired to deal with that...
5/6/10 -Thursday: HANDLING VEGETATION... |
Today, I mostly focused on adding vegetation to the placeholder level, to get an idea of how it would look. I may be spoiled by Neverwinter Night's Community Expansion Pack, because I definitely think there's a lack of vegetation options. I mean, just being able to re-color them would be very nice, as far as I'm concerned. I may have to look into that, or even better, try to find someone to look into it for me, because I'm not good with all that technical art stuff :)
Anyway, once I started adding the vegetation, things started looking a lot better. It's weird, but after simply adding that stuff, I started coming up with all these ideas for minor NPC interactions and such. Nothing major really, just enough to give the world more depth and believability. This of course will be done last.
Tomorrow, I'll add more vegetation, but not too much, because as I've mentioned, this is just a prototype. Next, I'll need to mess around with the atmosphere settings, because I'll need to have 2 version of this level. One at night, one during the day. That's another gotcha with this toolset: No automatic day/night transitions. In the grand scheme of things, it's not all bad, because the times when it needs to be day or night depends on certain sequences in the game.
Some other atmosphere things I'll mess with in the sunlight direction, cloud color, and wind. I tried getting wind to work in the other exterior level I made, but I never saw anything. I mean, I didn't exactly look too far into the problem, so I'm sure I was missing something small, as usual. I'm also curious as to how the fog settings look as well, and more importantly, how they impact the performance. Speaking of performance, all of those issues are long gone. I've chalked it up to other programs running in the background while testing the game.
If I'm lucky, I can have this entire level done by the weekend, and have started on another interior level that is linked to from here. This particular interior will have a very crucial piece of dialogue early on in the game, which I'm still struggling how to handle. Some people are offended by certain things, and I may be crossing the line with this... Before even telling anyone about it, I'll just implement it, and see how ALPHA testers react to it.
Till tomorrow...
5/4/10 -Tuesday: HANDLING WATER PLANES... |
On to the next issue at hand: Water Planes :) So, surrounding this area I am creating is a huge lake. What I want to simulate is water just extending far into the horizon. First though, I needed to actually get the water in game.
Now, I already know of the hack you have to do to get it to show up in the game, which for those not in the know just includes exporting the level while you have the Single Player module open. For whatever reason, exporting from that module works, for any others, you just get blank space where the water should be. Not really sure when we'll get a fix for this, and really, while it's an inconvenience, for me it's nothing to really make a big deal about. If that's the worst bug, I would be happy :)
At any rate, even knowing of this hack, it still wasn't working for me. I exported everything in my module, then switched to the Singler Player module, and exported things there. Then, because Windows is annoying, I have to shut down the toolset so I can copy the files to the correct directory (Windows complains when you try to access a file that is opened up by the toolset, even if you closed said file). Still, I got nothing. Then, I tried it again, and it just worked. Very frustrating to have something start working, when you have no idea what you did to fix it. I hope this doesn't pop up again, that's for sure.
After I got the water in game, I realized I wasn't happy with the draw distance of it. You can still see the square-ish shape to it. I could of course try to increase it's size, but I don't want to go down that road. Looks like I will have to create some mountains or something like that in the background/horizon, to make it look a little more real. There are also lots of properties I can mess with for the water, but since I'm just in prototyping mode at the moment, I'll leave it till later.
Well, as always, tomorrow should be my big night of development. I hope to get a lot done, so I can actually show off some half-way decent screenshots. It'll be nice to finish up the prototyping as well, because filling the area in with the stuff it needs will be straightforward, and won't involve me having to learn how to do yet another thing.
Till tomorrow...
5/3/10 -Monday: EVERY DAY IS A LEARNING EXPERIENCE... |
And so, the level building continues. Today's issue (because there are always issues) was dealing with performance. So, I have a 96x96 area, that literally only has a bunch of structures. No props, no creatures, no scripts running, no nothing. Remember, I'm just doing my LEGO building, trying out this and that. Well, for whatever reason, the game just runs horribly.
Just confirm it was my level, and not my system, I loaded up a previous OC save of Lothering. I mean, I remember that level being quite huge, yet running just fine. Sure enough, I load it up, and the game is running perfectly. And there are no 2 ways around it. Lothering definitely has more going on in it than my level! On the positive side (or perhaps negative, since it would impact development), just running around in that town got me wanting to do another playthrough of the game. I beat the game once when it first came out, and I've been devoted to building ever since. The fact is, the game is so damned long, that I know it would suck up too much of my time. Oh well, I would rather wait for the next patch anyway, so I feel comfortable playing the expansion pack.
So, I figure I'm going to have to look into some of the properties of the level, as well as the area containing the level, to see about things such as LOD. I'm sure there's some property where you can set the distance before an object starts to render less detail. Well, I think I've seen it in there somewhere!
As for the rest of the level, things are coming along fine. I think I have good enough versions of the only other buildings that I will be needing, and from here, I can start changing the topography of the area, adding in vegetation, props, etc.
Heh, at some point, I'll be at a point in development where I will be able to just knock stuff out, without having to learn about something new. Because as the title of this update suggests, it's definitely a learning experience every time I boot up the toolset.
5/2/10 -Sunday: BACK TO MY OLD TRICKS AGAIN... |
So, for good or for worse, I never write down notes for things related to this game. Which is ridiculously weird, because when I first started back in 1999, all I did was write notes. I've got the old shopping bags filled with notes to prove it! For whatever reason, since 2004, I just keep it all in my brain. I've been saying that I need to change this for the longest time, and when I start collaborating with more people, I'm going to have to, that's for sure.
With regards to levels, I definitely don't pull out the grid paper and start drawing, or other such things that I've heard of people doing. It's definitely all in my head, most likely inspired by a scene I've seen in a movie, or even better, something I see in the country side where I live. Inevitably, whenever I start creating said level, other things start popping in my head, and before I know it, what I had in my head has changed ever so slightly. This was the case tonight. I definitely knew what this level should look like, but while listening to some music, ideas just started flowing freely through my brain, and as expected, the original design changed ever so slighty :)
As I mentioned yesterday, I am striving to make the outsides of buildings look as they should, when compared to their interior versions. What I spent most of my time on today was piecing together various structures in order to create what you see in the screenshot. It's sort of like an adult version of LEGO's, and fittingly, a lot of fun.
As I was creating these strcutures, I made use of a lot of groups, which just essentially allow you to group multiple structures into a single folder, so they can be moved, copied, pasted, etc. as one single unit. For instance, the roof, walls, and windows from the stairs leading to the tower are a single group. Then, creating the other 3 where as simple as doing a copy/paste, then moving it to where it needed to be. That big dome thing is actually 6 different strcuturs combined into one, and of course, I made it a group as well.
Now, all of this is essentially being done in a test area, so I can get an idea of how big things will be. Then, I will create the real level, to optimize things. No point in having a big good looking area if it slows the player's computer down to a crawl.
Oh, and finally, it should go without saying that the building is floating in the air at the moment, until I find the right solution for it. I was going to add some small strcutures to the bottom of it, but they didn't look too good. I also may just raise the ground around those areas. As always, I'll cross that bridge when I get there.
Till tomorrow...
5/1/10 -Saturday: BACK TO IT... |
Well, here we are, after another month of ups and downs. Mostly, the month was filled with positive events, soured by the events of the last few days. Well, it happens, and I am over it, so time to move on.
So today, I continued the effort to get back up and running. The issue of the day was getting the pre-gen character to spawn correctly. After pulling my hair out for a while, I realized the issue was that I had a bunch of stuff in the packages core override directory. I was extemely happy when that little issue was solved. Once I was done with that, I could get back to what I was supposed to start Wednesday night... Level design...
Now, this is the first exterior level I've done sinc the very first level I created back in January. That meant that I had to run through the tutorial on the WIKI page just to get a refresher. The WIKI strikes again :) The particular level doesn't need to be too big, it's really going to just be about finding the right combination of structures I need. This is the first time where I'm not exactly finding what I need, but I can definitely make due with what is there.
On thing I am constantly keeping in mind is making sure all buildings are consistent, inside and outside. What I mean is, if you exit an interior level, and can see the structure from the outside, it should be as close as possible to what it should look like from the outside, assuming the appropriate structures can be found. I think that goes a long way towards believability. I'm also working very hard on trying to display a sense of scale in the world. I never had to deal with it in my NWN games, so this should be a fun learning experience.
I'm not even going to jinx myself by giving a deadline, but it should at least take less time than the first one I ever did. As I mentioned, the biggest time sink will be constructing buildings out of the available strcutures, adding them in various places, testing the area, then rinsing and repeating until I get what I want. I won't even think about other props, creatures, ect. until I finish this first aspect of the level.
All in all though, it feels good to be back doing what I love. It took a little longer to get back into the swing of things this afternoon, since I had been away for so long (hey, those 3 something days is a lot!), but once I was back into it, it felt like I never left. I just hope I can knock out a lot of stuff tomorrow. Barring anything that pops up, I should be able to be home for the majority of the day.
Till tomorrow...
THANKS AGAIN TO EVERYONE FOR THE CONTINUED SUPPORT. LAST MONTH'S NUMBER OF VISITS WERE THE BIGGEST YET. I CAN EVEN TRACK UNIQUE VISITS, AND IN DOING SO, I CAN TELL MANY PEOPLE ARE COMING TO THE SITE MORE THAN ONCE, WHICH IS ALWAYS GOOD :) |