Jump to content
  • Advertisement
  • entries
  • comments
  • views


Sign in to follow this  


Greetings all,

TLCoM is progressing well, in about a weeks time we should be starting a closed beta of part1, so if you want to be in it, I accept cash or charge ;)


First and foremost, here are two videos (spoilers) of two puzzle results from part1, they are particularly funny, so I thought you would get a kick out of them and enjoy seeing how things are going.

Rebecca and the TikiBar

Rebecca 'helps' Javas the Jellyfish Charmer


So given that I've spent a good amount of time on S3Engine and TLCoM, I figure now is a good time for a progress report, a mini post-mortem if you will.

Experience is the coin of the realm:
The best part about developing TLCoM is that even though the game is different from our previous game, Morning's Wrath, the experienced gained on that project has made it smooth sailing so far.

Effort spread has been perfect:
If I had to sum it up I would say this is the comparison to 'effort spread' between Morning's Wrath and TLCoM

Effort Spread (percentages of total time spent on an aspect of game development)
Engine Programming: 30%
Gameplay Scripting: 25%
Writing: 10%
Art: 35%

Engine Programming: 15%
Gameplay Scripting: 40%
Writing: 10%
Art: 35%

As you can see the notable improvements are that engine programming is half as time consuming as it was for MW.

Given the nature of Malathedra (it is a totaly story driven game) gameplay scripting is the highest effort point, with art coming in second, art effort has not changed much from MW, the change has been what to focus on however. Instead of rendering tons of tilesets and enemy animations, it has been switched to more in-depth animating and rendering of primary characters.

Writing has pretty much remained the same, except that with MW we did not finish the story before we started! this was overall a big mistake, it meant that we had to write, and script on the fly which made things very stressful not knowing exactly where the game was going. With TLCoM everyting was written beforehand in a design document, we spent about a month+ getting everything solidified, during this time the engine was being worked on as well, but very little game content was being produced.

Igor, throw the switch!
One of the hardest parts of writing a story driven game, is bringing the characters to life, we had a hard time doing this with MW because we were constantly hampered by engine development througout the cycle, and with an ever-changing story. From the beigining TLCoM's story has been designed to incorperate many facets of emotion and theme, the two strongest being comedy and tragedy. This balence of the good and the bad helps to keep the game feeling dynamic and closer to a real life situation. Secondary themes of love, friendship, courage, selflessness and selfishness also play a role and help to acentuate the primary themes. Parts of Malathedra will have you expelling chocolate milk from your nose all the way to gripping your mouse in rage.

From MW we've discovered many things that work in bringing a story to life and some things that don't.

Things that work:
1. Music - it can speak volumes about a scene and conjour up feelings that images and text can't
2. Visuals - simply talking about somthing cannot always convey the proper feeling
3. Dialogue - It is the primary source of information in a game, use it wisely
4. Voice Talent - If done well it can bring a game to life in ways text cannot
5. Little Details - While they can baloon the scope of a game, they add to the richness of the environment (being able to examine somthing through it's state changes is an example (tiki-bar, demolished tiki-bar))

Things that don't work:
1. Forced Emotion - just because a character says they are upset doesn't mean the player feels the same. Emotional response should be expressed subtly by the player character and should be mainly left up to the player to feel emotion on their behalf.
2. Tons of dialogue - dialogue should be finely crafted, kept relatively short, (10-20 lines per topic) and to the point, break it into multiple topics to keep things short and focused.

About the S3Engine
The best accomplishment to date has been the design and implementation of the S3Engine. Morning's Wrath which was built on our previous engine 'Flare 3.0' suffered from many issues, most of them however simply resulted in kludge after kludge, here is why.

It is practically unavoidable, as one is not experienced until they experience somthing. The Flare 3.0 engine was the pinacle of a long line of badly desingned engines spanning about three years.

NIH: (Not Invented Here)
Until about a year ago I (like many developers) suffered from a very bad case of NIH, this means that if I did not develop somthing then I did not want it 'desecrating' my project, while for me this was more driven by eagerness to learn it was also driven by ignorance and pride. My new motto is (whatever gets the job done quickest, easiest and most correct), I have put this principle to the test with S3Engine and it is the reason S3Engine was completed so quickly, smaller, performant, and more bug free than Flare 3.0

So instead of (Badly) writing everything ourselvs we have turned to various free software libraries that have simpliedied development and saved us from sleep-robbing bugs. Some of these are:

1. The C++ Standard Library (STL) - containers algorithims, file io, it's a must
2. Boost - Smart Pointers, Variant Types, Serialiaztion
3. TinyXML - XML Parsing (most of our data is in XML exept for image and sound resources)
4. Lua 5.1 - Lightweight, performant, well-tested scripting language
5. LibVorbis OGG - A great audio format with an easy to use C decoding interface
6. Direct3DX - (functions and ID3DXEffect) well-designed, functions and interfaces for image loading, matrix calculation, vector calculation, shaders and a ton more.

No clue of Data Driven Design:
While this could be classified as lack of experience, it is so important it deserves it's own topic. New programmers, tend to get really involved in what 'the code is doing' this results in many hard-coded solutions to problems. At the end of Morning's Wrath I had discovered that the engine need not be more than a controller, and interface and manager for the game world and that the real work should be done outside of the code, with resources and scripts. Some would argue that scripting is programming, but it affords the user (in most cases) a far simpler interface than the host language and certain features (co-routines) which make some tasks an order of magnatude simpler. In the end the S3Engine works off of these principles:

1. it's primary job is to manage the interface,gamestate(maps, entities, variables) and rendering
2. the engine always starts by asking the 'controller' what should be done (through a call to init.script) from there the script is in control
3. the engine calls various triggers and exposes commands to the controller which allow it to query and modify the gamestate.

You see, instead of having the developer deal directly with rendering, shaders and camera rotation, you give them higher level commands which are neccisary to create a scene. For instance:

A typical script for an entity:

--called when this entity is created
function onCreate(this)
--set the name
--set the verb actions for eye,hand and mouth
setKeyString(this,"verbMouth","Talk to");
--add a topic you can speak to this NPC about
addTopic(this,"onAskAboutTLCoM","Tell me about The Lost City of Malathedra.",true);

--called when the player uses the eye verb on this entity
function onEye(this)
--start the scene, deny interation
--make rebecca say somthing, and return a synchronization object
local w0;
w0=talk(rebecca,"It's some developer.");
--wait for the action to complete
--finish the scene, allow interaction

--called when the player uses the hand verb on this entity
function onHand(this)
--make me say somthing, and return a synchronization object
local w0;
w0=talk(this,"Hey! Hands off!");

--called when the player uses the mouth verb on this entity
function onMouth(this)
local w0;
w0=talk(rebecca,"Hi there!");
--enter topic choice sequence

--called when the player asks about malthedra
function onAskAboutTLCoM(this,state)
local w0;
w0=talk(rebecca,"So what's all this about The Lost City of Malathedra?");
w0=talk(this,"You should know, you're the star!");

In closing, the development so far of the S3Engine and TLCoM has been extremely easy and has resulted in quality output. The experience gained with Morning's Wrath paved the way to greater things, and I can only imagine that TLCoM will do the same.
Sign in to follow this  


Recommended Comments

OMG! Closed beta! I want to participate!

Where should I send teh money?

(or maybe, since my daugther may marry your son in a few years (let's say 25 years, once I'll have a daughter and once you'll have a son) maybe I don't have to pay anything. After all, ignoring this minor issue about having to have a son or a daughter and having to wait for a couple of years, we are nearly relatives)

Share this comment

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!