forums | blogs | polls | tutorials | downloads | rules | help

How to Scale Monsters?

Dungeon Siege Fanatic's picture

So, I've successfully finished the SKRIT code that checks the players level and selects a monster from a pool of monsters to spawn. That's all well and good. However, as I am making custom monsters for my map, I need a little help with leveling said monsters. What I've basically been doing is leveling the monsters based on previous dungeon siege monsters, however, with all the variants in my mod, this will take FOREVER.

Thus, I was wondering if there was some kind of formula for leveling monsters, one which could be easily followed. For instance, if the character is level 26, the monsters stats should be this, this and this.

Looking through the DSLOA .GAS code, it seems like the original GPG developers did this, as 70% is commented as 'auto-generated'.

Thanks in advance guys! And happy siegeing!

I'm not sure if there's an easy way to achieve what you want in DS1. You could make a curve for each parameter you need for reference but you'll still need numerous templates to get the variations in game.

That's why GPG extended the game engine in DS2 to support formulas in templates. Then they just needed to create root templates for various types of monsters ( trivial, weak, normal, rogue, tank and mini-boss, etc) upon which the monster templates inherited from depending on how powerful they wanted to make each monster. Then each monster's stats template declared the monster_level to be used in-game. This made it quite easy to make variants of each monster to appear in the game.

I don't know if DS1 would support such formulas in the template hierarchy. There's no indication in components.gas that it does and other major projects like Ultima 6 & Project Britannia still used the old system.

Dungeon Siege Fanatic's picture

Do you know if there is any way I could level the templates beforehand? Like some formula I could use to create each template by hand, then go load them in with the pre-written content already written up?

For instance, I've got three monsters, monsters A, B, and C. I know how to make monster A spawn for level 1-3, monster B spawn for level 4-7, and monster C to spawn for level 8-10. However, I need to know what stats to give said monsters to make them scaled to these ranges. I'm okay with coding it all up before hand, I just need to know what stats I should give them to make it balanced.

Unfortunately there's not much available data on-line that's organized in a table of list which I could find doing a quick search. The Dungeon Siege Wiki has stats on most of the monsters in DS1

Many of the templates in DSLOA have notations on what level the monsters were designed for which may help you. For instance in zaurask.gas; dsx_zaurask_fighter is noted as being balance for level 23, dsx_zaurask_fang is noted as being balanced for level 16, medium melee, zaurask_commander is noted as being balanced for level 16, hard melee, etc. That may help.

In my own work for Legends of Utrea, I just made clones of new monster templates that inherited from existing templates from DS1 and DSLOA, only creating base templates for new monsters not found in DS1 or DSLOA. There were several hundred leaf templates that had to be created and balanced, though since I was working with an existing map it was much simpler adjusting the stats.

So your idea of creating base templates adjusted for different levels beforehand and then changing a couple of lines (template name, specializes and name) could work.

Dungeon Siege Fanatic's picture

Thanks for the link. I guess I'll just have to base my monsters off of other Dungeon Siege monsters. Maybe I'll make a list of my own. Regardless, thank you for the help. It shouldn't be too hard to base them off of existing monsters.

I did do some digging in the components.gas of the DSLOA and there's some weird 'override' block inside of the skills block but it doesn't appear to actually do anything, sadly. If I do end up making a list I'll be sure to share it on this site for any possible future modders.

Once again, thanks for the response iryan, I'll be sure to dig through some of the DSLOA files for monsters to check the balancing.

I do not know how to get this to change.

		scale_base = 2.00; // double sized monster

This is the only way I know so far to change the size of a player character or monster.
I was thinking of making a potion that could change the size of a player.
I've never dived into that project yet.
Wish I knew more, sorry.

Dungeon Siege Fanatic's picture

What I ended up doing was making a generator that reads the player characters level and then scales the monsters stats based on nearest player characters Uber ability. The SKRIT reads in the player's Uber, then picks a monster accordingly, like so...

//Low Levels
if( level$ <= lowest$ )
child_template_name$ = child_template_name_lowest$;
else if( level$ <= low$ )
child_template_name$ = child_template_name_low$;
//Medium Levels
else if( ( level$ > low$ ) && ( level$ <= medium$ ))
child_template_name$ = child_template_name_medium_low$;
else if( ( level$ > medium$ ) && ( level$ < high$ ))
child_template_name$ = child_template_name_medium_high$;
//High Levels
else if( ( level$ >= high$ ) && ( level$ <= highest$ ) )
child_template_name$ = child_template_name_high$;
else if( ( level$ > highest$ ) && ( level$ < super$ ) )
child_template_name$ = child_template_name_highest$;
else if( ( level$ >= super$ ) && ( level$ < crazy$ ) )
child_template_name$ = child_template_name_super$;
else if( level$ >= crazy$ )
child_template_name$ = child_template_name_crazy$;

The generator (with the attached SKRIT block) then reads from a chosen list of monsters for that region within itself, and selects the correct monster, for example:

//Highland [t:template,n:island_gen_highland_leveled_melee] { category_name = "1W_evil_d"; specializes = island_generator_generic_base; doc = "island_gen_highland_leveled_melee";

lowest_level = 6;
low_level = 14;
medium_level = 21;
high_level = 27;
highest_level = 38;
super_level = 49;
crazy_level = 71;

Child_Template_Name_Lowest = island_wasped_green;
Child_Template_Name_Low = island_chomper;
Child_Template_Name_Medium_Low = island_troll_highlands;
Child_Template_Name_Medium_High = dsx_troll_masher;
Child_Template_Name_High = island_cyclops;
Child_Template_Name_Highest = island_rock_spirit;
Child_Template_Name_Super = island_drake_highlands;
Child_Template_Name_Crazy = island_rock_beast;
//Just in case the code chokes
Child_Template_Name = island_wasped_green;

For those of you who are interested, here ya go. It took me a while to figure out how to implement this, but it does work, I've tested it. On the off chance that you are still modding Dungeon Siege, feel free to use it how you wish. I gave myself a headache trying to figure out the commands needed, and I wouldn't want any of you guys to have to bang your head against a brick wall trying to do it yourselves.