Creature Scaling  

This past weekend, I came to terms with WoW. Yes, I know - another post on WoW. Well, not really. I like the game. Like it so much I've already got the first two expansions and a game card to keep me playing till March. I also realized one important thing - there is no need to finish the game. In fact, it can't be finished! So, why devote all my time to playing it? Weekend nights are going to be WoW time but other than that, I'm going to focus on getting this module (and the second part) completed. I mean, this is just an assurance that I am not abandoning this module - the lack of regular posts recently might have given that impression and I just wanted to get the expectations straight.

So, what's been going on with BaL, you ask? Encounter design. More specifically, creature design. Even more specific, boss creature design.
Now, I am not a fan of this auto-scale system at all. Frankly, I think it's wasted effort. Now, some might argue that the non-linear design of the campaign made this a requirement but in my opinion, it wasn't needed even there. My recollections of the OC might not be 100% accurate but by the time you finish Lothering, you are already at level 7 or so. Looking at the area-data file, except for the final quest chains and battles, almost all areas are scaled between levels 7 and 10. Where's the need then?

I wouldn't be going on so much about this if I hadn't been disassembling the autoscale scripts over the weekend. There's just so much code in there for so little gain!
Just to determine the scaled level (let's not even go into the subsequent work done to actually initialize the creature),

  • check against the min/max level for the area
  • check against the player level
  • check against the LevelScale in autoscale sheet
  • check against the max level for that appearance
  • check against the min_level in the creature table
  • check whether appearance level limits are disabled in the module and area

Going through all those 2DAs and setting up the variables isn't something I wanted to do. It's just too much work!
If I want to remove auto-scaling, it pretty much meant gutting out the entire logic in there and writing my own creature core script. This is what I have started doing this weekend. My vision for BaL involves some complex boss battles, based on the difficulty level in-game and I don't want auto-scaling to botch it up. So, I need to add my own version of auto-scaling - the difference being only the difficulty level selected in-game counts. This way, regular players who don't want very involved boss battles can play on Normal while Hard will pose a definite challenge. Nightmare isn't in the plan yet since doing this IS a lot of work.

The result of all this will hopefully be a definitive combat experience that the hard-core players like because, let's face it, combat design in the OC was never a strong point for Dragon Age.


Preparing for the lull ahead  

The lull at work, that is. We have one more deployment this weekend which should take a couple of hours at the most but other than that, there's not much going on at work. I've started compiling a list of things to complete over the next 2 weeks since this will be the time when I can focus on developing.

Towards that, I've been concentrating on wrapping up Craggy Island as best as I can and barring one issue where ambient animation is not resumed once combat ends, everything is good to go from my end. Sometimes, even the smallest thing that you know you could probably get to work while you are asleep gives so much trouble and that was the case here with codex entries not appearing. After a lot of debugging, it was due to the infamous duplicate GUID bug. Anyway, all's good now.

The focus for the next 2 weeks is going to be tying things together in the new areas and creating NPCs and ambient behaviour for them. And then, finish up the remaining abilities for the custom classes since those will be needed to play-test these areas.
I do have to spend some time to finish my PBEM tourney for Shadow Magic. Now that I am at the semi-final stage, I want to make sure I go all the way through and regain my Championship crown! So, I'll have to spend some time to map out the strategy for the finals - assuming I win the semis, of course!

Till later...


Behind the Scenes Work  

Past few days have have seen a lot of behind-the-scenes work, both on Blood and Lyrium and Craggy Island and mostly on Skype.

I think I've mentioned this before, DahliaLynn is working on an important cutscene for BaL and so far, it's looking absolutely terrific! We've been going back and forth over it but it is mostly complete now except for some fine-tuning. Today, we got the revised voice samples for that scene and will be integrated into the conversation shortly. After this is done, I hope to retain her services for a few more cut-scenes; frankly, the ones I've done so far are not good. Of course, I've received a lot of suggestions and advice on cinematics from her but going back and re-doing them will not be a quick task and with the amount of things still left to be done, they will have to wait.

How do you know this is from the Toolset?

The good news on the progress side of things is that the Evermist re-work is complete (well, except for the final polish but that's true for all my levels) and I've started integrating the area work done previously. There is also an extremely cool side-quest in that area, if I do say so myself. One that's innovative in it's use of the game resources; I got caught up in implementing it and while it's not working as intended currently, it's just a question of hacking away at it because that's primarily what it is ;)

I also fixed most of the big issues with Craggy Island, including that auto-level up templates for companions. I was kicking myself for not double-checking everything after finding the causes - the character template had a min-level and preset abilities that was screwing up the final output. I was calculating the XP needed to level from Level 1 to 7 and the min-level was already set to 5. So, what happens? The game bumps her up to level 9. I tell you, I was pulling my hair out trying to figure this out.

In addition to the fixes, some more cool VFX effects have been implemented that gives the scene that authentic touch. I know I said this previously too but these ones are way better, trust me! One more day will be dedicated to CI to code in the character pre-set and fix some niggling issues but after that, it will be time to beta!

For those out there wondering, I have not completely succumbed to the temptations of WoW...yet! But the pull is strong! :p


Combat Design - The role of a Tank  

When Dragon Age was first released and players were talking about having a tank in the group and discussing whether Alistair or Shale was a better tank, I admit I really didn't understand why you'd need a tank in the group. In almost all encounters, a couple of mages in the party will wipe the opposition before the tank even has time to pull aggro. In rare cases when it is required and the tank goes in first to draw threat, the battle is anyway over soon enough. Couple that with the fact that party members cannot die and I didn't see any role for a tank in Dragon Age.

Now, most of my gaming has been with single-player games and the ones I have played multiplayer (Unreal and Shadow Magic), the concept of a tank is non-existent. Well, maybe a little in Shadow Magic but since that was PvP always, that didn't work as expected.

Enter World of Warcraft. Yesterday, I did my first dungeon run - two actually. Being the first time, I didn't even know every member had to talk to the quest-giver to get the quest to show up in the log; just assumed it was handled on a party basis. Even worse, I had a full inventory (I was out doing the regular campaign while queued) and couldn't pick up the items I needed. Second run, I died and couldn't remember the path to get to the other members (this was in Blackfathom Deeps). Anyway, the thing that really struck me about these runs was the importance of a tank. The tanks really played a part here - unless they maintain aggro, it usually leads to a wipe. The mages and other DPS had to make sure they are not drawing too much threat or it's back to spirit form - I learned this the hard way the first time.

Transposing this to Dragon Age, one gets similar skills in the Warrior Shield tree. However, the effectiveness is vastly reduced due to two important factors -

  • threat calculation missing/removed from a lot of rogue/mage talents. These classes, primarily DPS, can do damage without being at risk most of the time.
  • the mobs (and even bosses) are too weak or too few for the tank role to really shine.

I must say, those dungeon runs were a revelation. As I've said before, Blood and Lyrium will feature custom classes for the player and most companions. In fact, except for the Warrior least, till yesterday. The warrior class in BaL already has no access to the 2H tree so this gives a perfect excuse to maximise the utilization of the Shield tree and design the combat around the concept of a party as in WoW. Since the classes for most companions are fixed, I don't have to deal with the possibilities of a significantly gimped party due to player choice and can pretty much anticipate how strong the party is going to be at key points in the story. I tell you, this is going to become very interesting.


Steady Progress  

As mentioned in the last update, I've been working on two things primarily - finishing up the scripting for Craggy Island and reworking the Evermist level.

The work on Craggy Island is almost done. We've added some VFX to the final area to make things seem a little more coherent. The actual VFX that was to be implemented is not present in the default VFX_base worksheet. For now, a similar VFX has been added and while it does look fine, I think the original one (fxe_mist_p) had a 'blowing-out' animation that's missing from this one. In the end, we might just have to extend VFX_base and use the VFX that was originally intended to be in the area.
There is also an annoying issue with the auto-level up template for the companions - just doesn't seem to work. I'll have to spend some time tomorrow going over that and trying to fix it.

This weekend, I spent a considerable amount of time on the Evermist level. Even if I do say so myself, it is starting to look much more like a proper village than a random collection of houses on elevated ground. I've taken pains to bring in some distinction to the various areas within the level - for example, rich farmers will have shingled roofs on their houses and the immediate area around them will look better with cobbled pathways and bigger houses, the poorer sections will have thatch roofs, closer-spaced houses, patch-worked walls.

I had planned to take some before/after close-up shots to show the difference but didn't have time yesterday night. Maybe in the next post :)
Here is a screenie of one of the streets that is near the entrance; still need to add a few more props but I also have to make sure not to overdo it. As it is, the level is prop-heavy due to all the constructed structures!

Oh, and I managed to spend only a few hours on WoW - enough to advance my gnome by about 7 levels. Reading about the latest patch on the WoW forums, it appears that the initial leveling process has been made faster ;)


World of Warcraft  

That's right! THE drug, going by what I've read and I must say, it's true to an extent!

I saw a BF deal for a free monthly pass for WoW and decided I'll give it a shot. I got one of those 10-day trial invites so I can decide whether to sell that pass or not and it looks like I *might* subscribe instead. I should have taken a screenshot of the first time I entered Eitrigg. I guess it was a busy time in the realm - there were scores of characters around! That first glimpse sucked me right in though I couldn't log on to that realm after that (almost always full!)
Instead I created a gnome mage in Norgannon and it's been a blast playing that little 'un. I don't know about others but I find the graphics extremely appealing. It's so colourful and lively, compared to DA.

The starting area for a gnome character

The other thing I noticed was that even for unimportant quests - simply to go to another place, for example - you get a detailed reason. Far more detailed than any of those Chanter's Board/Blackstone Irregulars/many other side-quests in DA. I really liked that there is a story behind all these fights against the Troggs, Rockjaws and Frostmanes.
The other important distinction from DA that I immediately noticed were the ambient animations. Here is a screenshot (badly taken) of a guy carrying another. He actually goes and lays the guy down on a makeshift bed and goes back and waits for another survivor!

Anyway, as much as I am enjoying this game, I am making a conscious effort not to play for extended lengths of time. I still have a module to finish; make it two actually. I am in final stages of scripting for Craggy Island and after that, it's just going to be bug-fixing (which we've already done a lot) and polishing. Hopefully, it gets out around Christmas; last I heard, VO is in progress.

Meanwhile, while re-working my Evermist level, I've also been taking breaks on and off (it feels like I've been working in the level editor most of the time!) and re-working dialogues to change references to the locations that have moved. I'm also working on fleshing out the setting with a lot of ambient dialogues during these breaks so it doesn't get boring - which is quite easy when re-working a level as huge as this one. I'm also making sure some of the buildings fit more into a village setting; an example is the marketplace which was very big and spacious under a huge tent-like awning previously. Now, the shops are more closely-packed and cluttered with make-shift roofs.

Re-worked market
Once I finish this, I have around 4 cutscenes I need to create in this area. That will definitely take some time! Till later...


Level Re-work  

It's been some time since the last update - I've been completely swamped with RL work and had to put Dragon Age stuff on hold. Hey, need that money to finance these hobbies! Still, I managed to finish the required work on Thursday itself so the past two days have been spent on DA - minus the time spent researching and buying stuff on Black Friday. I ended up buying some games that I will probably won't play for another 3-4 months (Alpha Protocol, Resonance of Fate) and even got myself WoW to try out for a month and some other stuff I didn't think I needed till I saw the price :)

With the aim of getting an alpha out, I started playing through Evermist which was the level I submitted for the Community Contest a while ago and which is a crucial area in BaL. When I was playing through it, I realized something was off. First, it was too big for what it's purpose was and when I say this, I mean way too big. The idea behind this area was a small farming village between Denerim and West Hill but that feeling of being in a village wasn't there. The roads were too wide, the houses spaced too far apart and while I really liked the different mounds from a level-building perspective, they were a little too high and too numerous.

After trying to patch the level for a few hours, I decided to bite the bullet and start reworking it. I redesigned the level on paper - first, removing superfluous stuff like the roads circling the village. This was a very bad design decision in hindsight - these roads provided numerous paths and almost all of them have no scope for interaction with the villagers or the environment. It's just a cliff face/forest/fence on one side and a smaller cliff face on the other side. As I said, a bad design decision.

Still a WIP but this should give a sense of scale (the height is 288 vs 256, btw)

Then, came the real re-work of re-arranging the houses and getting the houses closer together without feeling congested. One of the goals of this rework was also to reduce the level size. The previous one had a playable (green boundary) area of 5 x 7 which is way too huge. The reworked one will have a 4 x 4 playable area which is more than a 50% reduction in size. The main reason for this downsizing is the removal of those 'ring' roads. Without those roads, I can leave the structures outside the playable area.

One advantage of having a level as a basis for this new one is the ability to export and import selection groups. Since I had been fairly meticulous in organizing my structures (save for the last minute addition of numerous props), it was easy to copy a lot of the stuff over. I hope to finish this tomorrow and have a play through and finalize things.
Till later...


Slow Week  

This is just a short post to let everyone know that work is keeping me extremely busy. We had a go-live on Saturday that was aborted at the last minute due to data issues and that cost me precious time in rolling back changes and re-testing stuff. The kicker is - I will have to do all those changes again this week (yeah! during the Thanksgiving Holidays which I was counting on to make some serious headway with BaL). I also have one more go-live in progress currently that's expected to be done by tomorrow.
All in all, a totally shitty week and BaL will have to stay in the freezer till my time is freed up.

Till later...


Busy, busy, busy  

Things just got a little more exciting and a little more hectic! I've taken over a new role at work, managing the projects we are working on and with it comes a ton of admin activities. Being an individual contributor till now, I've never really appreciated the amount of work that actually goes into managing a large scale project such as ours and this was sort of a rude awakening. Still, I've jumped in with both feet and I've got to make this work!

On the BaL front, things are progressing slowly but steadily. The important cutscene Dahlia is working on is expected to be completed this week and I am recruiting a VO artist for the lines required for this cutscene. This will help in the visualization, I am told ( I tell you, I am a noob at cinematics!) and it will also give me a chance to get the whole voice-over related activities into my build workflow.

Are you the one I am looking for?

Currently, I am working on populating the different areas with ambient NPCs. Leeward, in particular, has this big campsite party that will have quite a few ambient NPCs and I am trying to find varied animations for them so they don't all appear as clones. This does involve creating new ambient patterns and I am trawling through the ANIM_base worksheet to see what I can cook up. After that, I have a couple more cutscenes to create (nothing complex but since I will be doing them, anything can happen!).

Then, comes the big activity - packaging and play-testing the alpha. I plan to do this on another computer to simulate a user playing it so that it's easier to identify missing resources, etc. This will also free up my desktop to tweak and run the lightmapping on the levels that need it - parallelism all the way! Now, if only I had 48 hours a day...


Getting back into the groove  

Of course, I wasn't away from the Toolset for that long that I need a break-in time to get back into the groove. In fact, I didn't even manage to keep my word that I'll not touch the Toolset till Thursday! We identified the pesky bug at work and while fixing it will take some time, we at least have the damn thing in our sights.

I spent a day brain-storming the talents and talent trees for one of the new classes for the companions. While the basic idea behind this class was established a long time back, it was time to go into the details -> finalize the ability names, what each ability will do, the various other information associated with abilities and most important, the specializations. I am extremely happy with the way the specializations have turned out - rooted in lore and distinct from what is currently offered in DA.
I am planning on having a separate page soon with all the new classes, abilities and trees so folks reading this blog can have a sneak peek at what's in store for them come February :)

WIP Shot
I've also started collaborating with DahilaLynn on cutscenes and we've been having a lot of discussions over IM on this one important cutscene (for now!) that she's directing for me. I must say, those chats have been extremely useful - showed me I still needed to go a-ways in the cutscene department (for example, she was talking about adjusting dof and I had to google it!). For those who haven't, check out her Alistair's Royal Wedding over on DragonAge Nexus - that should give an indication of her directing expertise.
...which reminds me, I need to do some lighting and stage work in the area where the cutscene is taking place and send it to her.

Till later...


What Bioware cannot do and I can...  

Write a better story? Check.
Create better levels with realistic lighting? Check.
Create more complex characters each with their own lives/opinions/agendas? Check.
Tie all these together into a module better than the official campaigns? Check.
Well, maybe :)
What Bioware cannot do and I can is take a break!

The past two days have been extremely hectic at work, so much so that work has spilled over into the evenings at home. I've ran into a bug that's driving me nuts and is likely to be a show-stopper for the project go-live if I don't get it resolved soon.

Added to that, I've been experiencing writer's block - totally! I guess it's because by the time I fire up the toolset, I'm mentally drained from work (don't you dare tell me otherwise! :P). The inspiration just doesn't want to come. So, I've decided to take it easy for a couple of days. No Dragon Age stuff - I am going to spend whatever free time I have in the evenings to catch up on all the books I've downloaded to my Kindle!

The way I figure - better a couple of days off and come back with a fresh mind rather than trying to plug away at the Toolset and develop stuff I will have to rewrite/redesign later. I wonder what David Gaider does when he gets writer's block? Or Laidlaw runs into a wall with a design idea? Definitely not take a couple of days' break, I bet!


Another Exterior Level Done!  

The weekend started off pretty quietly - for the whole of Saturday, I was not able to work on BaL though I wanted to.  Sunday looked to be turning that way - we had the daylight savings kick in and I realized I actually hadn't gotten up early :)

Still, I managed to finish the level I was working on - it is a fairly small level and will be used in one of the area transition encounters. It resembles a small clearing in a forest with a path winding through it - the sort of area where you'd stop to camp. It's so hard to create the illusion of a forest though, especially one around the rim of the clearing. For one, there is no terrain darkening tool and I wasn't able to find a suitable texture to substitute for that. Second, there is, as far as I was able to determine, no way to remove light from a particular area. This is very significant for forests as trees in Dragon Age do not cast shadows.

The view from near the entrance to the area
For now, the level has been marked complete which means it is 90% done. I will probably do the shadows later when I have time. I also tried using negative lights for this purpose but apparently, they have some other purpose.

I also managed to finish (read: 90%) an important cutscene that sets the stage for the plot beyond the first couple of areas. It is still a little rough around the edges at certain points but it's functionally complete and that's all that matters for now.

Till later...


Tutorial - Recoloring Trees  

One of the level prototypes that I did this month was for a forest area. This is a crucial point in the story and I wanted this area to be distinct from the forests you see in the OC or other mods. So, I thought, let's make it an autumn forest. With all the fall color variations, one can go really wild and the effect should be a totally different visual experience!

I love autumn!
So, I started exploring the SpeedTreeCAD.exe which the Toolset wiki claims can be used to customize the huge number of parameters a tree has, which it can do. Unfortunately, in the limited time I've spent fiddling with it, replacing textures seems a tad difficult. You can select your own diffuse map but for some reason, the individual leaf/frond textures don't update. So, I went about it in another way and the result is another tutorial - Recoloring Trees!

Tools you will need
  • SpeedTreeCAD.exe (strictly not necessary - XVI should suffice)
  • A hex-editor (I use XVI32)
  • An image-editing program (Gimp or Photoshop)
Before we go on, there are a few important points to note about the SpeedTree files. A tree is made up of different components - a bark texture, one or more leaf textures, one or more frond textures and an overall diffuse map containing the leaf and frond textures. In the below workflow, we will be modifying only the leaf and frond textures and frankly, that should be enough to present a different type of tree. Anyway, on to the workflow!

## Export from speedtreetools.erf

Open up speedtreetools.erf present in the packages/core/data_tools folder under the Dragon Age installation directory and extract all the resources to a folder of your choice. We will be using this as a reference.
Copy the .spt and .dds file for the tree you need to modify.
Examples for this workflow - a bush (bsh_c_boxwd) and a tree (tre_f_oaksmall)
You can copy the .tga files and edit them individually too - entirely up to your preferences. I will be generating them from the .dds file.

## Image Editing
  1. Open up the diffuse map in the image editing program. I will use Gimp as a reference for this tutorial. When asked to load mipmaps, select Yes.
  2. A simple way to adjust color is to go to Colors -> Components -> Channel Mixer and play around with the settings. Once you've settled on your choice of color, save the file to a different folder. The name should follow the following convention:
  3. [3-character tree type]_[1 character]_[anything]_diffuse.DDS Make sure the character length is constant Example: bsh_t_boxwd_diffuse.DDS or tre_t_oaksmall_diffuse.DDS

After editing the colors in Gimp - the left 2 are leaves and the one in the right bottom is the frond
  1. The next step is to generate the TGAs. We will resize the canvas to the appropriate TGA dimensions and save them.
  2. Bush DDS files are 512 x 512 and TGAs are 256 x 256 Tree DDS files are 1024 x 1024 and TGAs are 512 x 512
  1. Go to Image -> Canvas Size and change the size to either 256x256 or 512x512 depending on which tree type you are editing.
  2. Adjust the canvas setting - in Gimp this can be done by simply moving the image around so that the desired area is within the bold box in the Preview Pane. The objective is to do 3 exports - 2 for the individual leaves and 1 for the frond.
  3. Export these as TGAs and save them in the same folder as the modified DDS. File name doesn't matter for now.
## Open the .spt file in XVI32
  1. Search for diffuse (case-insensitive - some files have caps). There will typically be 2 entries for the diffuse DDS map. Change the file name referenced to the name you've saved your DDS file as.
  2. Search for tga (case-insensitive). There will be at least 3 references:
  3. BK_ - leave this as it is (unless you've modified the bark texture too) LV_ - note down the file name(s) FR_ - note down the file name(s)
  1. Go to your modified TGAs and name them in a similar format but change something to identify it as yours.
  2. Example: Boxwood bush: LV_t_boxwood1.tga, LV_t_boxwood2.tga, FR_t_boxwood.tga Oaksmall tree: lv_t_oak_1.tga, lv_t_oak_2.tga, fr_t_oak.tga As you can see, there is no naming convention for these. So, you have to open the .spt in a hex-editor to find out these names. An alternative is to open the .spt in SpeedTreeCAD.exe and note down the names from Global (Diffuse name), Leaf (leaf names) and Frond (frond names) tabs. 
  1. Go back to the hex-editor and replace the names present with your names (make sure length is constant!)
  2. Once the changes are done, save the .spt with another name. This should follow the same conventions as the diffuse DDS file
  3. [3-character tree type]_[1 character]_[anything].spt The name length doesn't matter here

## DA Toolset
Copy the modified TGA, DDS and SPT files to the core/override folder you use - I do level-building from the Single Player module so these have to go under packages/core/override while building. Once the level layouts are done and moved to your module's core/override folder, you can move these files there.
Open up DA Toolset and insert a new Tree Controller. If you've done everything correctly, you should be able to see and place the new trees in your level.
Toolset shot
Do the regular export process and you should be able to see it in-game without issues -
In-game shot
If you see blocky leaves in-game, then, it is possible that you've messed up the TGA editing.
One obvious thing to note here is that you do not want to replace the textures in the existing speedtree files -> not unless you want those modified trees in all your levels where that tree is placed.

Well, that was a long one to write and format. If you have any questions, post them here or better, in the BSN Custom Content Forum thread


Conversation Choices + The DT:CoM release  

One of the biggest time sinks in module-making in Dragon Age after level building is writing dialogue. Even when you start with a concrete story and well-defined NPCs and companions, writing dialogue is not so easy. The most basic issue, at least for me, is trying to keep in mind that I am not writing a story but an interactive adventure.

What does this mean? Let's take an example - I was writing a conversation today and at one point a companion says the following line: "I don't want to talk to you. Ask him what he wants". Now, this interjection is not completely necessary to the conversation but it helps the flow and builds on an already established relationship between the companion and the conversation owner. Only when I was reviewing the conversation did I notice the "him". A few copy-paste as links and plot flags later, the conversation was complete.
Now, the above is fairly simple but this is one area I wish the DA conversation system was a little more flexible and allowed us to use tags to reference race/gender/class/background/specialization/etc. It seems almost unintuitive to write multiple lines just to change one word.

The bigger problem (and unrelated to the conversation system) is trying to come up with dialogue options - the backbone of an interactive conversation. Now, in some cases, these options just flow organically. I was writing a conversation for a minor NPC and multiple choices at each node was so easy. Then, I started writing another piece for a companion and ended up being stumped. Offering choices while maintaining the flow of dialogue is extremely important - irrelevant options can easily destroy that flow and tone set previously.

I take pride in my writing skills in English even though it is not my native tongue. However, I've lost track of the number of times I've referred to an online dictionary/thesaurus to make sure I am using a particular phrase or idiom in the correct way. And I don't even want to talk about writing emotional scenes - I just plain suck at those, a fact I've come to accept. I spent over half an hour today writing eight lines, eight lines with no options at all and it's still not final. Anyway, the journey continues and hopefully, these efforts help to bring the story together in a cohesive manner in the end.

Lastly, good news for the DA community - the first installment in the Dark Times: Confederacy of Malkuth saga has been released. Check out the details in the official announcement thread. I haven't had a chance to play it yet (have set aside time during the weekend for it) but it appears to be fairly long and involved and most important, it is, as far as I know, the first significant addition to the Official Campaign...and this is just the first part! For those ruing the fact that Bioware won't be releasing DLCs for DA:O anymore or that they can't continue their Warden's story (seriously, what's with this Warden fixation? If you don't believe me, go check out how many threads in the DA2 forums refer to this), head over to the DT:CoM thread and fill that void up!



Some of you might have noticed that the header image on this blog has changed ;)

It's an extension of the project image I posted over at BSN a few days back. Basically, I wanted to extend the width of the blog layout since even on my 14" inch work laptop, there were gaps on either side. When I did that, the previous header image didn't fit and I thought it is high time I change that image from a more generic DA one to something more specific to what I am working on currently.

It's a blend of three images I found over on

On to more interesting stuff!

My 2D Art progress has been at 0% for a few months now - not something I was proud of, I can assure you ;)
Yic17, after seeing my October Monthly Report post, kindly offered to help me in this area. This was yesterday and I promptly added him to the developer group I created for BaL (for some inexplicable reason, BSN still shows discussions in private groups in the public profile feed - though as it turned out today, that is not always a bad thing - more on this later!) and created some threads to explain what I wanted.

One of the things that had always been at the back of my mind was to lend some distinction to the Dalish clans in my module of which there are 2 primary ones. One way I thought of doing this is to have customized clothing for each of them with their own logos/emblems/heraldry - similar to how you can see the Chantry sun in the standard Chantry robe in vanilla DA:O. In BaL, the player is a member of The Silver Claw clan and I wanted something along a claw-gauntlet hybrid for this purpose. Yic17 came up with some stunning designs in a very short time (less than an hour!). Here's a sample -

I was simply floored! Of course, a couple of them are too abstract for Dragon Age but the work is just fantastic! Now, I am confident that at least one area will show progress in the next monthly report :)

There's also been a slight change of plans in what I planned to do this month. Now, I have to do some research and finalize the workflow to get these images into the game's clothing and armor. I can't ask for help and refuse to do my part of the job, can I? Hopefully, it shouldn't be too difficult to do that.


Blood and Lyrium - Monthly Report - October  

The past week has been extremely hectic - with the Scripting contest coming to a close today and my projects at work throwing up nasty bugs, I haven't had time to work on BaL as much as I wanted to. I have a couple of go-lives this month too - one on 15th and another on 29th so this is going to be another busy month! I have decided one thing though - no more Community Contest stuff till BaL is done. Well, unless it is an exterior level contest, in which case I can submit one of the levels I am currently working on.

I did manage to finish up my entry for the Scripting contest - The Cranky Harem and you can download it from DANexus or BSN.

A 7x7 game board with highlighting turned on when you place game pieces

With that out of the way, on to the Monthly Report.
In the October monthly report, I had mentioned how I need about 6 small exterior levels to serve as entry points into other areas. I am happy to say these are done! They are primarily reworked OC levels but it did take a fair amount of time to edit those levels and get the lighting right.

I am also close to completion on the first custom class for BaL. This will be the class the player will play. I know I have mentioned previously that the player will be allowed a choice of 2 custom classes but I've restricted it to one now. Why? The whole module now integrates the background of this class as an over-arching story within and will continue to do so in the next iteration of this module. The second custom class will now be restricted to a particular party member.

The prototypes for 2 other external areas are also complete and I will start building the levels this month. It's going to be a fairly intensive process, as level building always is but it should go much faster now that I am comfortable with this aspect of the toolset. Also, all the interior levels for the alpha release are done! I made an excel workbook to keep track of areas, creatures, conversations, etc and realized BaL will have 57 areas! I can tell you, it took some time to digest that as I had never quantified that - in my mind, it was always the the function of that area that was predominant.

On to the percentages then!

Story - 100%
Quest Design - 90%
Companion design - 40% (no change!)
Custom Classes and Abiltities - 50%
2D Art - 0% (again, no change!)
Level/Area Design - 90% (just one more level to go!)
Level/Area Implementation - 40%
Conversations - 30%
Scripting - 20%
Cutscenes - 10% (no change!)
Monster/Encounter Design - 0% (I should really start on this)
Custom Systems - 40%

Overall, the module is around 30% complete. I was hoping to make big gains in October but sadly, that didn't materialize.  Here's to hoping November is better!

Plan for November:
  • Finish up the alpha release for testing - target: Nov 15th
  • Finish the 2 prototypes exterior levels
I am going to keep it simple this time so I can report more-than-expected results next month! The things one has to do...

Till later!


The Cranky Harem  

As most of the readers of this blog might know, I've been promoting the Community Contests initiative whenever I can. Currently, we have a mini-game/puzzle scripting contest running - basically to create a short, reusable mini-game or puzzle. The focus, as the title of the contest suggests, is on scripting and related features like plots and vfx.

A couple of weeks back, we had only three potential contestants (including me!). Potential, I say, because no one had confirmed their participation at that time. These past two weeks though, there have been a number of confirmed entries - a nug chase by BloodySongVengeance, Weighted Rock-Paper-Scissors by Mengtzu, a scavenger hunt by shadow5973, an 'assembly' mini-game by mikemike37, a capture-the-flag by Noob766 (who works on DT:CoM) and a chess-rules-based game by yours truly. Things are looking up, I say!

Now, many people won't like it if I tell them this is a chess game! So, I had to present it in a way that is more appealing. So, here's the backstory for that -

Once upon a time, Lord Oneisall of Chessdom, a city-state in the Free Marches was host to a dignitary, Har'emaal, from lands across the eastern sea. In spite of the grand ceremony put forth to welcome him and the lavish quarters prepared for his stay, Har'emaal was extremely contemptous of Lord Oneisall and refused to even sit at the same table with him for supper. Initially, Lord Oneisall ignored this obvious rude behaviour but as the populace started talking about the supposed disregard for their Lord by a foreigner, he decided to put an end to it and went to meet Har'emaal.

Har'emaal refused to meet the Lord and instead sent a note through a steward stating 'I will not treat a lesser man as an equal, even if he is the king of these entire lands you call Thedas'. Incensed by this summary dismissal, Lord Oneisall confronted Har'emaal with the point of his sword at the latter's throat - 'I have given you a royal welcome and treated you as I would an equal; what do you find lacking in me that you would call me a lesser man?'

Oblivious of the sword at his throat, Har'emaal proclaimed - 'A man who can satisfy only one woman is no man at all! Where I come from, a man's stature is determined by the women he can call his own and even the lowliest of nobles have at least twenty women!'

Stunned by this revelation but obviously excited (for he was a man!), Lord Oneisall published an edict allowing all men to have more than one woman and to set an example, he himself picked the most beautiful in his lands and built a separate palace to house them. To honour the memory of the person who gave him the idea, the palace was called a Harem.

In the present day, Chessdom is ruled by Lord Allaremine and he is facing a unique problem. While it was customary for the men to play favourites amongst his harem to elicit extra 'favors', matters have spun out of control in the Royal Harem. The mistresses are killing each other and only a few survivors remain. The few guards allowed inside the palace cannot keep watch over all of them.

You are an adventurer from another land and are on an important mission to save the world from an ancient evil. You have come to Chessdom to get something done - the details are irrelevant. However, you have to help Lord Allaremine before you can proceed.

I wanted some custom models to simulate the harem - it has to look like a bedroom (it's a harem!) but be small enough to see the whole mock-up. So, I bugged Mike and used up my points from the previous contest to get some models done.

A mock-up of the harem rooms
It took a lot of time to place those things down and align them and tag them. Now, the actual work - scripting - is underway. I am trying to present it in such a way that the player won't feel like it is a chess game - board size variations, game mode variations, game difficulty variations - all are being coded in. Further, the whole game should *hopefully* be very visual if I can find the right VFX for the rooms.
A close-up of one room

Going back to coding now...more later!
Oh, and if you can spare an hour or so, check out the two entries I've linked at the beginning of this post - there's still time to play them and give feedback to the authors.


Level Completion Process  

As part of the Community Contests initiative, I had submitted a level for the Settlement Contest. One of the comments reported by the judges was that terrain collision was not properly built (in all those sloping areas). That was something I had definitely planned to do - I could walk all over the place! - but I forgot. Yesterday, I was testing one of the night versions of my levels and forgot to build the collision for the water planes in that level. Sigh!

So, I decided to put together a list of things to do before calling each level complete. I've gone through the level editor and through my level building process and compiled this list. If I've missed anything, let me know - this is going up behind my monitor as a sticky and will be my level processing mantra from now on :)

If an exterior level,

  • Build Terrain Collision where needed
If exterior level and has water,
  • Auto-tessellate water planes
  • Generate water collision geometry for all water nodes
If an interior level,
  • Make sure Room Properties are set for each room
Make sure Single Player module is active
  • Render Lightmaps
  • Render Light Probe
  • Place Start Point after naming the exportable area - if name is changed, delete and place Start Point again 
  • Clear out the SpeedTreePackage Temp folder [for some reason, I've had the billboard tree issue only when there are files here - deleting these files and posting trees again always gives me good trees]
  • Do All Local Posts
Have I missed any other steps?


Baldur's Gate Release and the Scripting Contest  

First, the news...
What is the most important happening in the Dragon Age modding community this week? The release of Baldur's Gate 2 Redux! The BGR team has put together one awesome module - check out the details here if you haven't had a chance. It's expected to be released later today and can be downloaded from their DANexus page.
If I were to pick one area of Dragon Age modding that I am really comfortable with, it would be scripting. It might be due to the fact that I do a fair amount of LUA and Perl scripting at work but DAScript itself is a fairly complex system with hidden nuggets waiting to be unearthed. So, when the Mini-Game Scripting Contest was announced, I was excited - finally, a contest catering to my strengths! I didn't have a chance earlier to spend time on it but this past week, I've been doing some prototypes at work.

The 8-queens problem

The game I am designing is loosely based on chess - no, not the chess game but logic games within the chess rules framework. If you are familiar with chess, you might have heard of or even played the game where you have to place 8 queens on the board such that they do not attack each other.

Now, there are a lot of variations to the above 'standard' game. In fact, a quick search will show you hundreds of math papers written on this subject dealing with unique solutions, solutions for generic NxN boards, 3-dimensional boards, n-dimensional boards (n dimensions! brings back memories of my Differential Geometry course...where nothing can be visualized as in the real world).

What's this? A triangle immersed in a saddle-shaped plane (which is a hyperbolic paraboloid) as well as two diverging ultra-parallel lines. Math! You gotta love it.

For this contest, I've put my own spin on it and attached a simple story to it so that the game can be played in that context. The number of variations that can be played are currently at 25. The real problem was putting down solutions on paper so that I can provide hints if the player is stuck. Now that that part is complete, on to coding. One of the most useful script add-ons released is, in my opinion, is Craig Graff's Variable Storage System. Terribly useful when you have to keep track of a lot of stuff and plots either won't work or are too cumbersome to implement. I will be making extensive use of this in my contest entry.

I am also resizing some models and changing them a bit to provide a good layout where the game plays out. I plan to release this as a stand-alone game too so it has to look polished enough. Will it win? I don't know but I certainly hope so. Will it be well-received? I honestly don't know. Some players might approach it as a chess game in which case it will lose some of it's charm. If taken purely as an interactive game, it might work out better. The model-work that I am doing is in part to distance the setting from the chess board as much as possible. Let's see if it succeeds.


Backup system in place  

It's one of those things that every self-respecting software engineer knows must be done but never is - versioned backup. I've been guilty of that myself - I've been putting off doing a full backup for a long time now. Many a time, when I know I am going to try something that might break what's been written/directed till now (because I don't know what exactly that is going to do), I check in the script/conversation/cutscene into the database but that's only for designer resources. For art resources, I've been sticking to having multiple copies and rotating through them on each save.

Now, I've run into issues with my levels in the past which made me up the number of copies from 5 to 10. Still, it's always been in the back of my mind to get a good backup system in place. I finally bit the bullet and did that yesterday.

Since I am just one developer, I wanted something that was simple to set up and use and that I'll never have to worry about. After some research, I decided to use AutoVer. It's free, folder-based backup with customizations that can be applied to each folder and most important, comes with a basic versioning system. I downloaded it and added the folders used for Dragon Age modding to it first

  • Levels folder
  • Level layouts - it takes way too long to export everything again
  • BaL root folder that contains all other work (2DAs, images, icons, etc)
  • BaL module override folder - containing all the other mods that I plan to use
  • Tools folder - different DA:O and other games' tools that I currently use (I don't even know where I got some of these)
I also checked in all my designer resources and exported the database and backed that up too.

Now, the funky thing about AutoVer is that it constantly watches those folders and backs up any change you make! While that's a good thing for certain resources like 2DAs or scripts and you can customize how often you want the backups to be done, I still didn't want to go that route. So, I set up a scheduled task to export the database every Sunday evening and start AutoVer to do an incremental backup at that point. So, I'm all set now - the only thing remaining is to do an automated backup to Skydrive (25 GB free space!) every month or even every week. There is a nifty way to create a mapped drive of your Skydrive folders but haven't tried it yet.

In between, I also managed to submit a head morph for the Mini Character Contest. It's for a character who will be making an appearance fairly early in BaL and who has an interesting back-story too - not a companion though.

Vaelina - my entry to the mini character contest

Other than this, I've been tying up a lot of loose ends and placeholders I had in place for testing. While I was doing that, inspiration struck and what was originally a mundane battle in one of the starting areas is now more tightly integrated with the lore and the combat setup is also a little more complex. It should now provide a satisfying finale to an area where almost every dialogue and action is heavily lore-oriented.


A productive weekend  

So, it turned out to be not so bad after all.

I managed to finish the scripting required for Craggy Island on Sunday morning. There is still a niggling issue where a particular item is not getting added to the player's inventory - there is no fancy code in the back end, just a simple call to UT_AddItemToInventory. It is working in other places so I am not sure why it is not working here. The only difference is that this is an equippable item and the initial testing was with an uninitialized character (Jaden). However, even after generating the correct player character, it is not working. Not a really big deal but I am curious to find out why it is not working in this case.

Out of the 2 cutscenes I had planned to finish, I managed to finish only one. I don't know whether to call it fairly short or lengthy since it is only 20 seconds but it is lengthiest one I've created so far and also the most complex. It has around 9 characters and 2 creatures and a bunch of VFXs. The hardest part was finding the animations for the bears and in the end, I couldn't find anything suitable. I had to resort to taking a small portion of an existing animation and repeating it a few times.

The doors can only be opened by the bears!
In the end, it didn't turn out all that bad. I figure I still have some tweaking left to do with the weights and transitions but I am happy for now! I also have to start investigating the facial expressions for the characters as, right now, they are a little bland and static.

I tried to use Sunjammer's new tool - the Cutscene Companion - but I wasn't able to capture anything. Then, I tried to use Fraps but in-game, the cutscene was playing at location (0,0,0) in spite of having a stage assigned to it. I was hoping to generate a movie and club it with some other shots and create a sort of trailer but I guess it will have to wait for another day.

The target for this week is to complete the remaining cutscenes while I still have that directing bug and create/modify some VFXs for my custom classes and integrate all that into the module. A big task, I admit, but it has to be done at some point and the sooner the better.

Till later....


Back to writing dialogue  

I've been really focused the past couple of days - writing lots and lots of dialogue. Some introductory ones to the different areas were finalized but I've taken care to make each one of these expositions distinct. No walking up to the know-it-all inn-keeper and getting all the information from him. Since most of these will involve some animations at least while transitioning in and out of dialogue, the next step is cutscene work, which I'm not too thrilled about since that is one area I'm not really good at.

I've also been adding 'bark' nodes to the existing dialogues so that the NPCs have something to say when none of the other conditions are met - like between the nodes where a quest is given and the one where the quest is complete. Or even as simple as having different nodes during different stages of the main plot and having something to say when that particular conversation option for that stage is exhausted.

Next step is to work on the cutscenes and finish that monumental task. To realize the goal of releasing an alpha of the first few areas by the end of October, I will have to create about 5 cutscenes and at least 3 of those are fairly intricate ones (for me!). I hope to finish up at least a couple of them this weekend but that is after I complete the work required from my side for Craggy Island. That involves just a few minor scripts but that's holding up the development of the next stage for CI so best to get it out so Daeltaja can continue working on it. We'll see how the weekend goes...


Bioware talks Community Contests!  

If you had been visiting this blog regularly, you would have noticed the new Community Contests banner on the right. This was part of a...campaign of sorts to promote the Community Contest effort further so as to pull in new faces. We pinged a lot of our forum friends who had blogs or websites asking them to put a similar banner up on their sites; mikemike37 talked to and I was still thinking we could do more!

Then, Challseus came up with the idea of talking to Fernando Melo, who is sort of like a community representative over on BSN, about posting in the Bioware Blog. So, I messaged him and he forwarded the request to 'Evil' Chris and Victor Wachter. The result - a post on the Bioware Blog about the Community Contest and an announcement by Victor in the Dragon Age forums.

The significant part though is this sentence from that blog - Starting this week, I’ll be taking a look at the toolset community and the mods they create, and featuring them on the BioWare Blog. It will be a big boost to the mods that have been released if they are featured in the blog. As it is, with the Featured Projects section broken and the popularity system not so popular among modders, they need some other avenue to promote their content and this might just be the shot in the arm some of them need. Here's to Bioware! *cheers*

One other thing we've done over at the Community Contest group is to create an Info thread which summarizes the salient points about the contests and how people can help out. If you are interested in helping out or just want to know more about the group without having to go through all the threads out there, this should help you out.

Till later...


Working with images  

As mentioned earlier in my Contests post last month, I'm taking part in the Shadow Magic 1-vs-1 Tournament this year. Since I am a moderator for the PBEM forums over there, I've also been doing some organization work for the tourney. One of my areas of responsibility has been designing the scorecards for the different rounds.
The first round was easy enough to do as I just applied a watermark to a scroll picture and copied the text from Excel. For the subsequent rounds, I spent some time trying to create something that was different from what we've used so far and in that process, learned a lot more about layers and effects and how to manipulate them. The end result was something I was really pleased with -

Shadow Magic Tourney Bracket
Running high on the feeling of satisfaction from creating the above image, I decided to take a shot at doing one of the first maps for Blood and Lyrium. Creating a nicely textured map from scratch is a lot of hard work and requires far more time and expertise than I have so I decided to use the Thedas map as a base. At some point in the past, I found a link on the EA site to a really high resolution map of Thedas (6680 X 5010) and I used a small portion of that map to create mine.

Blood and Lyrium Map 1

I still had to do some work to remove all the existing text and if you notice, even at full resolution (you can click the image to get there), it is almost impossible to find out where the original text was and I am really pleased with that.
Next step is to start integrating this into the module and hopefully, people will be surprised when they actually encounter this map in-game. Why? Well, you'll have to see for yourself!

In this process, I accidentally solved the issue with the 24-pixel border on the maps but was not able to replicate it. The accidental solution was to have a black canvas around the image but doing that again didn't work on this map. Need to investigate that more!


Dialogue (woes)  

These past few days, for some reason or the other, I didn't feel like scripting at all. I know I have a lot of things to finish up on that end; hopefully, I'll hit the spot sometime this week. Instead, I've been writing...a lot, in fact.

First, I've started work on a concise story document that I will be able to use in the future as a reference when I need to discuss the module with anyone. This also helps me to view it from a high level and decide whether there are further opportunities to flesh out the story or add side-quests.

Next, I've been writing a lot of dialogue - completely new ones and changing/adding to existing ones too. One of the most complicated ones I wrote in the past week revolves around a game the player can choose to play - it has only a little over 1000 words but the amount of link-backs numbers in the hundreds.

It is an interesting game, I tell you...or rather, would have been. I forgot one tiny little thing - the Dragon Age engine will show only the first six options. And mine had 10 most of the time. I was kicking myself for not play-testing the conversation earlier. I was feeling more frustrated due to the back-end scripting that was also completed for the game but the testing was broken due to the choices not available to be selected. That could possibly be the reason why I am feeling a certain apathy towards scripting now. Oh well...

Now, I have to either (a) break the choices down into 2 sets, which would make the game extremely cumbersome or (b) find an alternate way to play it or (c) ditch the whole idea. Sometime back, FollowTheGourd posted an interesting idea for text-centric dialogues in the Alternate Dialogue Modes thread. I'll probably do a quick check with him to see if that allows for more options and if so, use it for this conversation. After all, even if I do plan to get my module voiced, I don't have to do VO for every single line. I'm thinking more BG2 style where the first line and important conversations are voiced but the rest are just texts. I think VO is highly over-rated anyway...

In other news, the judging for the Community Contest 2 - Prop Model finished on Thursday and the winners have been announced. You can congratulate the winners here and read about/grab the entries from the links on the Community Contest 2 Page. Show them your support, folks!


Building a settlement.... more than just creating a level or an area.

This new area I am working on is based on the level I submitted for the level-building community contest and it is a huge one! With a huge area, especially that area being a village comes the added task of populating it. Now, I have the plots for this village all written down but it is variable enough that the actual populace placement has to be finalized and additional things like ambient movement, non-critical NPCs, sub-plots, stages set up. What I've started doing nowadays is - as soon as each level is sort-of finalized, I export the minimap and put it into my Dropbox folder. Whenever I have free time at work, I open the level and start jotting down things on the image itself.

Plot-critical populace

Obviously, everything can't be fit into a single image so I use one for NPCs and any ideas I come up with when putting them down, another for quest flow and one for ambient movement. It varies with each area but I've felt a lot more focused when I am back home and open these images to translate the jottings into actual implementation. All the thinking is done during lunch and smoke breaks and once the toolset is opened, the goal is only to get as much of those thoughts implemented and nothing else.

Sometimes, I do get diverted. For example, I've been putting off tinting/recolouring items since the beginning and every now and then, I decide to start on it and go to the wiki. I still haven't managed to get through that tutorial, unfortunately so it just ends up as a wasted few minutes of diversion. I'm trying hard to stick to my plans for October and so far, it's going well. Still, a lot of days to go...

Till later,


World Map Tutorial - Part 2  

In Part 1 of this tutorial, the basic setup for custom world maps was covered. In this tutorial, we will unravel the event flow when using world maps and the functionality that can be embedded in each of those event handlers.

First, a short illustration on the event flow tied to world map usage:

Event Flow related to World Map usage

It is good practice to define a primary world map in the EVENT_TYPE_MODULE_START event just to avoid any gotchas later. This just makes sure there is a world map displayed if the player initiates an unforeseen transition ;)
object oWorldMap = GetObjectByTag("<world map tag>");

If you want, you can also set a secondary world map using:
WR_SetWorldMapSecondary(object oMapID);

What is the difference? A secondary map enables the second icon in the World Map allowing you to see both world maps. To give an example in the OC, it would be like Denerim and the Wide Open World. When in Denerim, doing a transition would take you to the Denerim map. Clicking the secondary map button would take you to the Wide Open World.

EVENT_TYPE_TRANSITION_TO_WORLD_MAP is the core event where you evaluate plot flags or put in checks to determine which world map to show and actually show the map.

Two important checks (if you have the associated features in your module) that must be done here are:
If the player is exiting out of a random encounter, you have to make sure that the player continues on his way rather than selecting a new destination (this is just for the animation part)
if (GetEventString(ev, 1) == RANDOM_ENCOUNTER_TRANSITION_ID)
// exiting random - encounter - finish travel animation

If the player is exiting out of a party camp and you want the Party Picker to be shown, you do it here
if(GetEventString(ev, 1) == CAMP_EXIT_TRANSITION_ID)

The constants used above are defined in the world_maps_h which is a core include and hence, can be included directly in your script - unless you want to change some of the functionality.

Once you show the World Map, the player can select a Map Pin to travel to. This triggers the EVENT_TYPE_BEGIN_TRAVEL where all the grunt work related to area-related plots, random encounters, camp travel is done. Finally, the WorldMapStartTravelling function is called to start the travel animation (important when random encounters are specified; otherwise they will not work)

A few important checks that are usually done here would be -
  • Check if waypoint overrides are set for the map pin (this is actually passed as an event parameter - GetEventString(ev, 2)
  • Handle random encounters - this is basically handled via plots unless you want really random encounters. In any case, this is scripted independently
  • Store the target map pin's area and waypoint tags - the area tag is passed as GetEventString(ev, 1) and the waypoint tag is determined from the waypoints 2da unless a waypoint override is present. This is important if you have random encounters (see EVENT_TYPE_WORLDMAP_PRETRANSITION event below)
  • SetLocalString(GetModule(), WM_STORED_AREA, sTarget); SetLocalString(GetModule(), WM_STORED_WP, sWP);
Camp related checks
  • Store the current location from which the world map was accessed so that when transitioning back, you can jump the party straight back
  • If source area is camp and, then basically don't do the animation trail. Jump the player back to the previous area (tied directly to the point above)
  • If the target area is camp, again, don't play the animation but do a direct transition
  • If source and target are both camps, empty the party and place the followers in their positions
EVENT_TYPE_WORLDMAP_PRETRANSITION is a pretty basic event that is called at the same time as the animation trail starts. All you do here is do the actual transition to the target area - except when the target area is the party camp, in which case it is done in EVENT_TYPE_BEGIN_TRAVEL itself. No fancy stuff here.
The one important thing to remember here is - the player will not be able to click on a map pin when exiting from a random encounter. Hence, you cannot get a target area from the event parameters. This is the reason why you store the target area and waypoint in the module variables in the EVENT_TYPE_BEGIN_TRAVEL event.
string sArea = GetLocalString(GetModule(), WM_STORED_AREA);
string sWP = GetLocalString(GetModule(), WM_STORED_WP);
UT_DoAreaTransition(sArea, sWP);

EVENT_TYPE_WORLDMAP_POSTTRANSITION is an optional event in the sense that it need not be handled for the world map to work correctly. However, this is a great area to do all those 'whats-happening-in-the-evil-genius'-lair' type of cutscenes. Remember the cutscenes with Loghain in the OC or the ones with The Valsharess in NWN-HotU? These can be done in this event.

EVENT_TYPE_WORLDMAP_CLOSED is also not a compulsory event unless you have a party camp in your module or multiple primary/secondary map combinations. The important (and only?) event parameter here is the first integer parameter:
  • 0 when the world map action is cancelled by the player
  • 1 when it is closed after a travel is completed
Obviously, the above events can be analyzed and dissected even more but I don't plan to do that. The above information is enough to get world map transitions working in your module.

Now, let's get to the interesting part - customizations/changes from what's done in the OC.
  1. The waypoints 2DA is not an integral part of the world map functionality. It is deduced via scripting through the WM_GetWorldMapTargetWaypoint function in world_maps_h. All it does is go through the 2DA line by line to compare the area tags and then, get the waypoint tag. You can, instead write your own 2DA to put in waypoint tags based on plot conditions or specify a list of random waypoints from which one is picked to jump to (a diablo-esque dungeon with multiple entry points?) or if you have just one entry point in your areas, skip this 2da altogether, keep the area and waypoint tags same and use GetEventString(ev, 1) from EVENT_TYPE_BEGIN_TRAVEL for both.
  2. The first 2 integers in EVENT_TYPE_BEGIN_TRAVEL are used in the OC to determine random encounters based on terrain. That's not a hard and fast rule since random encounters are scripted and there are no core functions tied to them. What does this mean? Random encounters have to be entirely scripted by the module maker and as such, can be entirely different systems. In that case, you can use these 2 integers coupled with the waypoint changes above to get a more extensive waypoint handling system.
  3. Let's say you want to show something to the player - a written scroll with hidden clues (National Treasure, anyone?) or a picture clue. You could create a map with that scroll/picture and show that to the player with OpenPrimaryWorldMap (after setting it to the Primary map, of course) - basically, it can be used to show any image. 
I actually had a couple of other ideas but haven't explored the system yet to see if they would actually work. You think you know everything and then, the game throws a googly at you by hard-coding something within the engine or the GUI (the blight animation in this case).
I hope this tutorial proves useful to you. I will be posting the tutorial on the social wiki soon so if you find something that needs further explanation or if you uncover anything else related to the map-making process, please add it to the page. Feedback is also welcome here, if you need further clarification on any of the points above.

One last thing - the process to integrate custom world maps into the OC/Awakening is the same process as described in Part 1 of the tutorial. The only difference would be that you will have to intercept the above events prior to them being called by the official game and prevent them from being handled if you so desire. Since these are all module events, it is pretty straightforward to override them in your custom module script.


    Blood and Lyrium - Monthly Report  

    So, I decided to do some accounting today to see where I am at with the overall module progress. Seeing as my target is to release the module before Dragon Age 2 ships or more accurately, at least a month before Dragon Age 2 ships, the latest I can shoot for and still hope to have a decent-sized audience would be the beginning of February. That is just 4 months away and I still have a ton of work left to do!

    Levels: The biggest time sink for my module will be building the required levels. At this point, I've realized I cannot build every level I require from scratch so I'll end up reusing some of the official levels for the house/tavern/etc interiors. Sure, they won't exactly match up with the exterior layout in many cases but I think it is a small price to pay for an early release date. Even with that, I still have a few levels, mostly exterior, to create (it's unfortunate that none of the Community Contest entries really fit in with what I want):

    • Small exterior levels - usually as entrances to other areas or for encounters - 6
    • Big exterior levels - full-blown villages/town - 3
    • Interiors that cannot be reused from the OC - 5
    Given that, if I break up the work done so far and try to assign percentages (not really a good indicator but let's do it anyway)

    Story - 100% (I am really happy with this!)
    Quest Design - 80% (need to check the feasibility of certain ideas)
    Companion design - 40%
    Custom Classes and Abiltities - 30%
    2D Art - 0% (icons mostly but there are a lot of them + some other stuff)
    Level/Area Design - 80% (on paper ;))
    Level/Area Implementation - 25%
    Conversations - 20%
    Scripting - 10%
    Cutscenes - 10%
    Monster/Encounter Design - 0% (I should really start on this)
    Custom Systems - 20%

    Overall, I would say the module is about 20% complete. Now that the story is set and the overall quest arcs are almost finalized, I can start focusing on the implementation. Of all the things above, 2D Art is really not my forte - I will have to ask if anyone from the Community Creations forum can help out. I also wish we could hold an interior level Community Contest so I can get some free levels :p

    Plan for October:
    • Test and finalize quest design
    • Finish the custom classes' implementation
    • Finalize level design on paper
    • Finish the small exterior levels and at least one big exterior level
    • Complete quests/conversations/plots/etc for the areas designed till today.
    That is a pretty ambitious list, I know (*cough* I think I am coming down with something and won't be able to go to work for a week or so ;)) but if all goes according to plan (does it ever?!!), I hope to have an alpha of the first few areas out for testing so I can start getting some feedback. Here's hoping!

    One last thing I'd like to point out to potential modders (not just for Dragon Age) - Mengtzu has made an excellent post on encounter scaling and learning curves for the player when playing a module and how modders can try to avoid some of the pitfalls related to those. I will definitely be re-reading that blog post when I start my encounter designs and monster tactics.


    World Map Tutorial - Part 1  

    Well, I know we already have a Map Tutorial on the Bioware wiki (which will be updated shortly by yours truly) but as far as I know, no one has been successful in getting a custom map to work in a stand-alone module. Or, if someone did, no one has come forth on the forums to help those who've had problems. So, here is a step-by-step tutorial on getting custom maps to work.

    Step 1: Map Image

    The map can either be in .tga or .dds formats.
    TGA: You can use a freeware image editor like Irfanview or Gimp to convert a .jpg/.jpeg file to the .tga format.
    DDS: You can use nvdxt.exe present in the <Dragon Age Install folder>\tools\ResourceBuild\Processors folder to generate a DDS file. nvdxt.exe is a batch utility and to use it you need to open a command prompt (Start -> Run -> cmd) and enter your command. An example to convert x.tga to is:

    nvdxt.exe -file x.tga -output -nomipmap -8 u8888 -prescale length width

    -prescale length width lets you put in the size (should be multiple of 4) to which the x.tga should be scaled before conversion

    If you are using Photoshop, you first need the Nvidia Photoshop plug-ins and if you are using Gimp, you need the Gimp DDS plug-ins. In Photoshop, I saved my DDS as DXT5 ARGB 8bpp with Interpolated Alpha and No MipMaps.

    The game requires the image to be with the client's localized name but the toolset reads the actual image so you need both <image_name> and <image_name_en-us> (for English clients). You have to place both images in your addin's module\override folder.

    The game's world map (both OC and Awakening) is 912 x 687 pixels - this is the canvas size. The images have a 24 pixel transparent border which would make the actual image 864 x 639 (640 if you are using your own map)

    Why is this important?
    The map is anchored at the top-left corner of the book image and this corner is actually slightly above the book border. Without this transparent section, your map will never be aligned exactly in the center of the book.

    Sample map in add-in module with DDS extension
    There are ways to work around this but I will cover them in Part 2 if I am unable to figure out the transparent border.

    Step 2: Building the m2DAs

    You need to extend two 2DAs for the worldmap to function correctly in-game and create as many worksheets as you need based on the TargetWpTable entries (see below). All these 2das go into your module\override folder.

    worldmaps from worldmaps.xls: A few things to note here:

    worldmaps_tut 2da
    • The ID has to be between 0 and 255. Anything over that and the map will not work in-game and you will see the infamous grey square at the top left.
    • Bioware uses 1-5 for the OC and 10 for Awakening. I doubt the other DLCs use different world maps - if anyone has played them and has seen a different map, let me know.
    • The TargetWpTableID should match the IDs used to extend the m2da_base 2DA
    • The TargetWpTable entries should match the different worksheets containing the Source/Target waypoint information. I have yet to test whether this is actually used.
    • The MAP column contains the names of your map images
    • The Label column is the one used by the Toolset
    • As far as I can determine, the NameStrRef is not used anywhere so you can keep that at 0
    m2da_base from 2da_base.xls: Create a new entry for each of the TargetWpTableID used in the worldmaps 2da extension. Keep in mind that the m2da_base is, in itself, a m2da so you need to only have a worksheet with the new rows.

    source-target waypoint 2das: You can copy the existing target_wps_* worksheets and edit them if you so wish. It is basically a table with source and target areas on the rows and columns respectively. Their intersection contains the waypoint tag you will be transitioned to when traveling from the source to the target area.
    test_map_1_wp 2da

    Step 3: Setting up the map in the toolset

    This is probably the easiest part. Fire up the toolset, navigate to the Maps tab, right-click and select New -> Map.

    TIP: If you didn't know, going to the appropriate tab (Maps, Scripts, etc) and then selecting the New option by right-clicking there automatically positions the corresponding resource at the top of the menu. Selecting a folder and doing this creates the resource within that folder.

    If you've done the previous 2 steps, you should see the map name (Label) in the drop down list for the Map within the toolset and the image should appear correctly.

    To test what you've done till now in-game, just create a couple of map pins, save and export without dependent resources. Create a placeable using one of the Area Transition type placeables and set the PLC_AT_DEST_AREA_TAG to world_map (this is a hard-coded value inside the utility_h script). You can use any placeable for a transition but it is not as simple as this and I want to keep things simple till I start Part 2 of this tutorial :)

    Fire up your module script and add the following lines of code:
    #include "events_h"
    #include "global_objects_h"
    #include "sys_chargen_h"
    #include "sys_rewards_h"
    #include "world_maps_h"

    void main()
        int nEventHandled = FALSE;
        event ev = GetCurrentEvent();
        int nEvent = GetEventType(ev);

             case EVENT_TYPE_MODULE_START:
                object oWorldMap = GetObjectByTag("<Tag of the placeable>");


        // if this event wasn't handled by this script fall through to the core script
            HandleEvent(ev, RESOURCE_SCRIPT_MODULE_CORE);

    Export the resources for your module, start Dragon Age and launch your module. Once you click the Area Transition placeable, your map should be displayed.

    Lastly, to show that this works with more than one custom map in the same add-in, another image. This one uses a .tga file as the world map and is bigger than the other one - just to show that there is no limitation on the size of the image - but you can notice the icons inside the map area -> the underlying book size is hard-coded.
    Sample map in add-in module with .TGA extension
    Part 2 of the tutorial will cover the scripting behind transitions, how to bypass/override certain events, customizations possible within the existing event framework and an explanation (or workaround) of the 24-pixel border. Stay tuned!

    I did my testing as part of my module so if any of you who read this run into issues or find something inadequately explained, let me know and I will see what I can do.