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.