<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://www.datoolset.net/mw/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=FollowTheGourd</id>
		<title>Dragon Age Toolset Wiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://www.datoolset.net/mw/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=FollowTheGourd"/>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/wiki/Special:Contributions/FollowTheGourd"/>
		<updated>2026-04-09T12:32:36Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.25.6</generator>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=2DA_ranges_in_use&amp;diff=16117</id>
		<title>2DA ranges in use</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=2DA_ranges_in_use&amp;diff=16117"/>
				<updated>2011-05-08T16:41:02Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: /* M2DA_base */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is meant to enumerate row ID ranges that are used by the main game and by various popular addins, to avoid accidental overlap. See also [[Prefixes in use]] and [[Compatibility]].&lt;br /&gt;
&lt;br /&gt;
Note that there's no need for 2DA row IDs to be sequential, so you can use very large row ID numbers to reduce the chances of collision.&lt;br /&gt;
&lt;br /&gt;
Version 1.0 of the toolset had a bug in ExcelProcessor that caused problems with high row ID numbers, but this has been fixed in subsequent releases. See [[Bug: ExcelProcessor doesn't handle row IDs above 8.3 million correctly|the bug report]].&lt;br /&gt;
&lt;br /&gt;
As of now there is a bug that prevents ID's above 255 to be used for some M2DA's. See [[Bug: High M2DA ID ranges might work in the toolset, but not in game|Bug report]] for a list of tables affected.&lt;br /&gt;
&lt;br /&gt;
Another [[Bug: DLC conflicts with standalone campaigns|bug]] affects the rewards M2DA.&lt;br /&gt;
&lt;br /&gt;
== ABI_base ==&lt;br /&gt;
&lt;br /&gt;
According to the [[ABI_base]] page under the ''tooltipstrref'' column, anything over 500000 is considered a debuff. This would limit the range a fair amount.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 200262'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000 - 38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 50000 - 50001&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/861/ Advanced Tactics]&lt;br /&gt;
|-&lt;br /&gt;
| 51000 - 51002&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/1888/ Advanced Quickbar]&lt;br /&gt;
|-&lt;br /&gt;
| 450000 - 450300&lt;br /&gt;
| ladydesire's [http://social.bioware.com/project/815/ Tevinter Warden class]&lt;br /&gt;
|-&lt;br /&gt;
| 466000 - 466100&lt;br /&gt;
| Apolyon6k's [http://social.bioware.com/project/3842/ The magic of innocence]&lt;br /&gt;
|-&lt;br /&gt;
| 901974-903000 and 401974-403000(modal)&lt;br /&gt;
| Idomeneas' [http://social.bioware.com/project/3152/ Valeria Addon]&lt;br /&gt;
|-&lt;br /&gt;
| 1337000 - 1337008&lt;br /&gt;
| amcnow's [http://social.bioware.com/project/3823/ Respecification]&lt;br /&gt;
|-&lt;br /&gt;
| 2560000 - 2560500&lt;br /&gt;
| Timelord's [http://social.bioware.com/project/1845/ Blood and Lyrium]&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680250&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000 - 40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 300000-300047&lt;br /&gt;
| rebel5555's [http://social.bioware.com/project/2646/ 2 Handed Weapon Abilities for Arcane Warriors]&lt;br /&gt;
|-&lt;br /&gt;
| 300000-300047&lt;br /&gt;
| rebel5555's [http://social.bioware.com/project/3637/ Dual Weapon Abilities for Arcane Warriors]&lt;br /&gt;
|-&lt;br /&gt;
| 300000-300047&lt;br /&gt;
| rebel5555's [http://social.bioware.com/project/2644/ Weapon and Shield Abilities for Arcane Warriors]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== AI_TacticsPresets ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 9'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| 10 - 15&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/861/ Advanced Tactics]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
== ambient_ai ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| 1000000-1001000&lt;br /&gt;
| [http://social.bioware.com/project/178/ Crown of Creation]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== ANIM_base ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| 65000 - 65002&lt;br /&gt;
| BioSpirit's [http://social.bioware.com/project/1647/ Hilltop Under Siege]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== APR_base ==&lt;br /&gt;
&lt;br /&gt;
Note that there is a bug involving this 2DA: [[Bug: APR base maximum M2DA row ID is 65535 in the toolset]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 90'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000 - 38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 40000 - 40010&lt;br /&gt;
| Alschemid - [http://social.bioware.com/project/3175/ Horses] and [http://social.bioware.com/project/3666/ Sandbox]&lt;br /&gt;
|-&lt;br /&gt;
| 65000 - 65001&lt;br /&gt;
| BioSpirit's [http://social.bioware.com/project/1647/ Hilltop Under Siege]&lt;br /&gt;
|-&lt;br /&gt;
| 55000 - 57000&lt;br /&gt;
| World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 65010 - 65025&lt;br /&gt;
| Mutantspicy Oracle and Enchanted Armor [Dragonage Nexus]&lt;br /&gt;
|--&lt;br /&gt;
| 1000001 - 1100000&lt;br /&gt;
| DA Workshop / by frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== areadata ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== armor_massive_variation ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 8'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| 50-50&lt;br /&gt;
| Alschemid - [http://social.bioware.com/project/3666/ Sandbox]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: the highest working tested ID for this variation is 141. See [http://social.bioware.com/wiki/datoolset/index.php/Bug:_High_M2DA_ID_ranges_might_work_in_the_toolset,_but_not_in_game bug report]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== BITM_base and ItemStats_ ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 30000 - 30500&lt;br /&gt;
| Ambaryerno - [http://social.bioware.com/project/415/ Arms and Armor]&lt;br /&gt;
|-&lt;br /&gt;
| 37000-38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 40000 - 40200&lt;br /&gt;
| DA Workshop / by frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
| 57000-59000&lt;br /&gt;
| [World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone]&lt;br /&gt;
|-&lt;br /&gt;
| 77000-79000&lt;br /&gt;
| [Sanguine Sunrise by LukaCrosszeria [http://social.bioware.com/project/4024/ Sanguine Sunrise]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 50000 - 50100&lt;br /&gt;
| Feline Fuelled Games - (by Silk) [http://www.felinefuelledgames.de/ Feline Fuelled Games]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== CLA_base ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 25'''&lt;br /&gt;
| '''Bioware&lt;br /&gt;
|-&lt;br /&gt;
| 10000 - 10012&lt;br /&gt;
| Ladydesire&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== crafting_recipe_types ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 7'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680020&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== crafting_recipes ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 91'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5682000&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== engineevents ==&lt;br /&gt;
&lt;br /&gt;
Those ranges relates to custom events types/ID and not to engineevents based [[Event_override|events overriding]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 500 - 500&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/861/ Advanced Tactics]&lt;br /&gt;
|-&lt;br /&gt;
| 510 - 511&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/1888/ Advanced Quickbar]&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680050&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== guitypes ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 600 - 600&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/861/ Advanced Tactics]&lt;br /&gt;
|-&lt;br /&gt;
| 601 - 601&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/1888/ Advanced Quickbar]&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 666000 - 666020&lt;br /&gt;
| Apolyon6k's [http://social.bioware.com/project/3842/ The magic of innocence]&lt;br /&gt;
|-&lt;br /&gt;
| 1337000 - 1337001&lt;br /&gt;
| amcnow's [http://social.bioware.com/project/3823/ Respecification]&lt;br /&gt;
|-&lt;br /&gt;
| 1974100-1974200&lt;br /&gt;
| Idomeneas' [http://social.bioware.com/project/3152/ Valeria Addon]&lt;br /&gt;
|-&lt;br /&gt;
| 2560000 - 2560050&lt;br /&gt;
| Timelord's [http://social.bioware.com/project/1845/ Blood and Lyrium]&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680010&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Heraldry ==&lt;br /&gt;
There is a [[Bug:_High_M2DA_ID_ranges_might_work_in_the_toolset,_but_not_in_game | bug]] with this table. The range 0-255 is known to work.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 1000001 - 1001000&lt;br /&gt;
| [http://social.bioware.com/project/178/ Crown of Creation] (using 201 onwards temporarily) &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== itemprps ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 10022'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000-38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 77000-79000&lt;br /&gt;
| Sanguine Sunrise by LukaCrosszeria [http://social.bioware.com/project/4024/ Sanguine Sunrise]&lt;br /&gt;
|-&lt;br /&gt;
| 1000001 - 2000000&lt;br /&gt;
| DA Workshop / by frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
| 2555000-2555010&lt;br /&gt;
| PavelNovotny - [http://social.bioware.com/project/517/ Gay Bars of Ferelden]&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680050&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
| 7570000-7770000&lt;br /&gt;
| [World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone]&lt;br /&gt;
|-&lt;br /&gt;
| 536873321 - 536873322&lt;br /&gt;
| Elys' [http://social.bioware.com/project/522/ Mysterious Gifts]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 2560000-2560050&lt;br /&gt;
| Timelord's [http://social.bioware.com/project/1845/ Blood and Lyrium]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== itemsets ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 30'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 2555000-2555010&lt;br /&gt;
| PavelNovotny - [http://social.bioware.com/project/517/ Gay Bars of Ferelden]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680500&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
| 7570000-7770000&lt;br /&gt;
| [World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone]&lt;br /&gt;
|-&lt;br /&gt;
| 1405261000 - 1405261999&lt;br /&gt;
| nezroy - [http://social.bioware.com/project/1834/ Warden Shields], [http://www.dragonagenexus.com/downloads/file.php?id=793 Leliana Item Set]&lt;br /&gt;
|-&lt;br /&gt;
| 1000001 - 2000000&lt;br /&gt;
| DA Workshop / by frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
| 7771000 - 7771500&lt;br /&gt;
| [http://social.bioware.com/project/2157/ Dark Times: The Confederacy of Malkuth] (reserved by Starlight on Questorion's behalf)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== ItemVariations (all) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 30'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000'''&lt;br /&gt;
| '''Bioware - reserved (guessed)'''&lt;br /&gt;
|-&lt;br /&gt;
| 12000 - 12100&lt;br /&gt;
| [http://social.bioware.com/project/1923/ Adonnay's Weaponry] (reserved by mikemike37 on his behalf)&lt;br /&gt;
|-&lt;br /&gt;
| 77 - 99&lt;br /&gt;
| Sanguine Sunrise by LukaCrosszeria [http://social.bioware.com/project/4024/ Sanguine Sunrise]&lt;br /&gt;
|-&lt;br /&gt;
| 140 - 160&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 101000 - 400000&lt;br /&gt;
| [http://social.bioware.com/project/2157/ Dark Times: The Confederacy of Malkuth] (reserved by Starlight on Questorion's behalf)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
note: ItemVariations are affected by the bug which prevents ID's above 255 from appearing properly in the game. See [[Bug: High M2DA ID ranges might work in the toolset, but not in game|Bug report]].&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== M2DA_base ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1016, 2000 - 2010, 10011 - 10142, ...? '''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 5000 - 5014&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/861/ Advanced Tactics]&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000 - 38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 77000 - 79000&lt;br /&gt;
| [http://social.bioware.com/project/4024/ Sanguine Sunrise] by LukaCrosszeria &lt;br /&gt;
|-&lt;br /&gt;
| 100000 - 100000&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/1907/ Event Manager]&lt;br /&gt;
|-&lt;br /&gt;
| 690000 - 690100&lt;br /&gt;
| [http://www.dragonagenexus.com/downloads/file.php?id=1617 Karma's Origins Companions]&lt;br /&gt;
|-&lt;br /&gt;
| 1000001 - 1100000&lt;br /&gt;
| DA Workshop / by frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
| 1337000 - 1337001&lt;br /&gt;
| amcnow's [http://social.bioware.com/project/3823/ Respecification]&lt;br /&gt;
|-&lt;br /&gt;
| 2300000 - 2300100&lt;br /&gt;
| [http://social.bioware.com/project/178/ Crown of Creation] (M2DA prefix: COC)&lt;br /&gt;
|-&lt;br /&gt;
| 2560000 - 2560050&lt;br /&gt;
| Timelord's [http://social.bioware.com/project/1845/ Blood and Lyrium]&lt;br /&gt;
|-&lt;br /&gt;
| 5000000 - 5000010&lt;br /&gt;
| Noob766's [http://social.bioware.com/project/3827/ Companion Compatibility pack]&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680050&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
| 5680050 - 5680055&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/3185/ Flexible craft UI]&lt;br /&gt;
|-&lt;br /&gt;
| 5681000 - 5681005&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/2896/ DACrafting framework]&lt;br /&gt;
|-&lt;br /&gt;
| 6000000 - 6000050&lt;br /&gt;
| TreDawn - [http://social.bioware.com/project/1750/ Nesiara Companion]&lt;br /&gt;
|-&lt;br /&gt;
| 6660000 - 6660050&lt;br /&gt;
| Apolyon6k - [http://social.bioware.com/project/3842/ The magic of innocence]&lt;br /&gt;
|-&lt;br /&gt;
| 7000000 - 7000050&lt;br /&gt;
| FtG - [http://social.bioware.com/project/1688/ UI Mod]&lt;br /&gt;
|-&lt;br /&gt;
| 7000051 - 7000055&lt;br /&gt;
| FtG - [http://social.bioware.com/project/3663/ Custom Loading Screen]&lt;br /&gt;
|-&lt;br /&gt;
| 7000056 - 7000071&lt;br /&gt;
| FtG - [http://social.bioware.com/forum/1/topic/75/index/5569843 Portrait dialogue and custom tokens (test release)]&lt;br /&gt;
|-&lt;br /&gt;
| 7000075-7000080&lt;br /&gt;
| FtG - [http://ftg.wikidot.com/ftg-quickbar Quickbar]&lt;br /&gt;
|-&lt;br /&gt;
| 7570000 - 7770000&lt;br /&gt;
| [World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone] &lt;br /&gt;
|-&lt;br /&gt;
| 7777770 - 7777799&lt;br /&gt;
| Magic - [http://social.bioware.com/project/1429/ Void Walker] (M2DA prefix: VWK)&lt;br /&gt;
|-&lt;br /&gt;
| 9000000 - 9000050&lt;br /&gt;
| Ambaryerno - [http://social.bioware.com/project/415/ Arms and Armor]&lt;br /&gt;
|- &lt;br /&gt;
| 30000000 - 40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 1140150041 - 1140150091&lt;br /&gt;
| DLAN_Immortality - [http://social.bioware.com/project/789/ Ser Gilmore NPC]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== materialrules ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000-38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 536873321 - 536873323&lt;br /&gt;
| Elys' [http://social.bioware.com/project/522/ Mysterious Gifts]&lt;br /&gt;
|-&lt;br /&gt;
| 1405261000 - 1405261999&lt;br /&gt;
| nezroy - [http://social.bioware.com/project/1834/ Warden Shields], [http://www.dragonagenexus.com/downloads/file.php?id=793 Leliana Item Set]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== materialtypes ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 88'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000-38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680300&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
| 536873321 - 536873340&lt;br /&gt;
| Elys' [http://social.bioware.com/project/522/ Mysterious Gifts]&lt;br /&gt;
|-&lt;br /&gt;
| 1405261000 - 1405261999&lt;br /&gt;
| nezroy - [http://social.bioware.com/project/1834/ Warden Shields], [http://www.dragonagenexus.com/downloads/file.php?id=793 Leliana Item Set]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== PartyPicker ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 11'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''????'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 101-199&lt;br /&gt;
| [http://social.bioware.com/project/178/ Crown of Creation]&lt;br /&gt;
|-&lt;br /&gt;
| 200 - 299&lt;br /&gt;
| DA Workshop / Author: frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
| 300 - 350&lt;br /&gt;
| [World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone]&lt;br /&gt;
|-&lt;br /&gt;
| 1974-1980&lt;br /&gt;
| Idomeneas' [http://social.bioware.com/project/3152/ Valeria Addon]&lt;br /&gt;
|-&lt;br /&gt;
| 5711-5720&lt;br /&gt;
| [http://social.bioware.com/project/3926/ Castle Drakhaoul] by Marshal57'&lt;br /&gt;
|-&lt;br /&gt;
| 6660 - 6665&lt;br /&gt;
| Apolyon6k's [http://social.bioware.com/project/3842/ The magic of innocence]&lt;br /&gt;
|-&lt;br /&gt;
| 77000 - 79000&lt;br /&gt;
| [http://social.bioware.com/project/4024/ Sanguine Sunrise] by LukaCrosszeria &lt;br /&gt;
|-&lt;br /&gt;
| 6900000 - 6900200&lt;br /&gt;
| [http://www.dragonagenexus.com/downloads/file.php?id=1617 Karma's Origins Companions]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== PRCSCR ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000 - 38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 77000 - 79000&lt;br /&gt;
| [http://social.bioware.com/project/4024/ Sanguine Sunrise] by LukaCrosszeria &lt;br /&gt;
|-&lt;br /&gt;
| 690000 - 690100&lt;br /&gt;
| [http://www.dragonagenexus.com/downloads/file.php?id=1617 Karma's Origins Companions]&lt;br /&gt;
|-&lt;br /&gt;
| 1000001 - 1100000&lt;br /&gt;
| DA Workshop / by frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
| 1337000&lt;br /&gt;
| amcnow's [http://social.bioware.com/project/3823/ Respecification]&lt;br /&gt;
|-&lt;br /&gt;
| 2000000 - 2000050&lt;br /&gt;
| [http://www.dragonagenexus.com/downloads/file.php?id=942 Oracle,mutantspicy's magic vault, and other custom armors]&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680020&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
| 6000000 - 6000050&lt;br /&gt;
| TreDawn - [http://social.bioware.com/project/1750/ Nesiara Companion]&lt;br /&gt;
|-&lt;br /&gt;
| 7570000 - 7770000&lt;br /&gt;
| [World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone]&lt;br /&gt;
|-&lt;br /&gt;
| 10100000&lt;br /&gt;
| Camp [http://social.bioware.com/project/463/ storage chest]&lt;br /&gt;
|-&lt;br /&gt;
| 10100011 - 10100013&lt;br /&gt;
| Didymos' [http://social.bioware.com/project/2620/ Camp Merchant Chest]&lt;br /&gt;
|-&lt;br /&gt;
| 10100014 - 10100016&lt;br /&gt;
| Didymos' [http://social.bioware.com/project/2717/ Item Sets Fix]&lt;br /&gt;
|-&lt;br /&gt;
| 10100100 - 10100110&lt;br /&gt;
| Eshme's [http://social.bioware.com/project/1929/ Sleeping Tent]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000 - 40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 42006090 - 42006100&lt;br /&gt;
| [http://www.dragonagenexus.com/downloads/file.php?id=1120 Morrigan Restoration Patch]&lt;br /&gt;
|-&lt;br /&gt;
| 1000197400 - 1000197410&lt;br /&gt;
| Idomeneas' [http://social.bioware.com/project/3152/ Valeria Addon]&lt;br /&gt;
|-&lt;br /&gt;
| 1109197751 - 1109197799&lt;br /&gt;
| Schwinni - [http://dragonagenexus.com/downloads/file.php?id=1020 Awakening Runes Fixes], [http://dragonagenexus.com/downloads/file.php?id=1112 Awakening Blackblade Armor Dragon Drop Fix]&lt;br /&gt;
|-&lt;br /&gt;
| 1140150041 - 1140150091&lt;br /&gt;
| DLAN_Immortality - [http://social.bioware.com/project/789/ Ser Gilmore NPC]&lt;br /&gt;
|-&lt;br /&gt;
| 1405261000 - 1405261999&lt;br /&gt;
| nezroy - [http://social.bioware.com/project/1834/ Warden Shields], [http://www.dragonagenexus.com/downloads/file.php?id=793 Leliana Item Set]&lt;br /&gt;
|-&lt;br /&gt;
| 1553521700 - 1553521710&lt;br /&gt;
| Alschemid - [http://social.bioware.com/project/3666/ Sandbox]&lt;br /&gt;
|-&lt;br /&gt;
| 1672464532 - 1672464542&lt;br /&gt;
| DLAN_Immortality - [http://social.bioware.com/project/2991/ Ser Gilmore NPC Awakening]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== placeable_types ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 14000 - 16000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 17000 - 19000&lt;br /&gt;
| Standalone modules (see discussion tab)&lt;br /&gt;
|-&lt;br /&gt;
| 37000-38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 43050-43061&lt;br /&gt;
| Eshme's [http://social.bioware.com/project/1929/ Sleeping Tent]  (Greater 65535 is showing bugs so this is until it is fixed)&lt;br /&gt;
|-&lt;br /&gt;
| 43062-43065&lt;br /&gt;
| BioSpirit's [http://social.bioware.com/project/1647/ Hilltop Under Siege]&lt;br /&gt;
|-&lt;br /&gt;
| 56000-56200&lt;br /&gt;
| [http://social.bioware.com/project/2472/#details Mikes Invisible Boxes]&lt;br /&gt;
|-&lt;br /&gt;
| 2696549 - 2696700&lt;br /&gt;
| PavelNovotny - [http://social.bioware.com/project/517/ Gay Bars of Ferelden] (NOTE: I'm using the 6000-6200 range until Bioware fixes the bug which prevents m2da ID ranges above 900000 from showing up in game.)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 7570000-7770000&lt;br /&gt;
| [World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 1000001 - 1100000&lt;br /&gt;
| DA Workshop / Author: frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
| 1974-1978&lt;br /&gt;
| Idomeneas' [http://social.bioware.com/project/3152/ Valeria Addon] (They are low so they'll show in game, recall the toolset bug)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== popups ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 1000001-1001000&lt;br /&gt;
| [http://social.bioware.com/project/178/ Crown of Creation]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== PRJ_base ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680050&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
== String ID ==&lt;br /&gt;
It is not generally necessary to register String ID ranges here. The values generated by the toolset are sufficiently random to minimise the risk of collision. Exception : the Community Contest reserved the range below so that the builders will stick to that and can import VO without having to renumber the VO files.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 10000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 89000000  - 89999999&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== tint_override ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| 500 - 520&lt;br /&gt;
| PavelNovotny - [http://social.bioware.com/project/517/ Gay Bars of Ferelden]&lt;br /&gt;
|-&lt;br /&gt;
| 6900 - 6920&lt;br /&gt;
| [http://www.dragonagenexus.com/downloads/file.php?id=1617 Karma's Origins Companions]&lt;br /&gt;
|-&lt;br /&gt;
| 1000001-1001000&lt;br /&gt;
| [http://social.bioware.com/project/178/ Crown of Creation]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 1109197701 - 1109197750&lt;br /&gt;
| Schwinni - [http://dragonagenexus.com/downloads/file.php?id=1064 Helmets without wings and retints]&lt;br /&gt;
|-&lt;br /&gt;
| 1553521700 - 1553521750&lt;br /&gt;
| Alschemid - [http://social.bioware.com/project/3666/ Sandbox]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== ts_material ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| 1405261000 - 1405261999&lt;br /&gt;
| nezroy - [http://social.bioware.com/project/1834/ Warden Shields], [http://www.dragonagenexus.com/downloads/file.php?id=793 Leliana Item Set]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== TS_Category ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680005&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
| 1000001 - 1100000&lt;br /&gt;
| DA Workshop / by frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
| 7570000-7770000&lt;br /&gt;
| [World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== vfx_base ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000-38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680010&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
| 5680011 - 5680019&lt;br /&gt;
| BioSpirit's [http://social.bioware.com/project/1647/ Hilltop Under Siege]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== worldmaps (has to be less than 256) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 6'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| '''210 - 220'''&lt;br /&gt;
| [http://social.bioware.com/project/1845/ Blood and Lyrium]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=UI_Tutorial_(draft)&amp;diff=16116</id>
		<title>UI Tutorial (draft)</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=UI_Tutorial_(draft)&amp;diff=16116"/>
				<updated>2011-05-08T16:28:11Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: /* Bugs and getting sources to compile */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Author's note''': STILL A WORK IN PROGRESS - FIRST DUMPING INFORMATION OUT, THEN I'LL FORMAT AND SECTION IT OFF BETTER. This isn't a very good tutorial, but as I said, I'm just trying to get the information out there and I'm slow to update this. Also, it may be simpler now that the UDK has support for GFX files, but I don't know the cross-licensing or technical situation on that right now.&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
The UI files are basically just version 8 Adobe Flash files, but extended with some extra properties and image handling (they even use nonstandard tags in the SWF for that). GFX files supposedly have more optimized fonts and who really knows what else, but you shouldn't have to worry about font embedding in Dragon Age.&lt;br /&gt;
&lt;br /&gt;
This means they use the older ActionScript 2.0, which you can find some learning resources on here [http://download.macromedia.com/pub/documentation/en/flash/fl8/fl8_learning_as2.pdf fl8_learning_as2.pdf] and here [http://livedocs.adobe.com/flash/9.0/main/flash_as2_learning.pdf flash_as2_learning.pdf], among other places scattered on the web. You can download the API reference, but a decent online location is [http://flash-reference.icod.de/ here] (faster than Adobe's site I find).&lt;br /&gt;
&lt;br /&gt;
For it to work in game, the U.I. element must be saved using the name of an existing U.I. file, as the engine will only run U.I. elements it is expecting. You can, however, leave the file extension as .swf and it will still run.&lt;br /&gt;
&lt;br /&gt;
=== Other information sources ===&lt;br /&gt;
There's a woefully incomplete GUI category on the wiki here [[:Category:GUI]]. It was an early effort at detailing some of the class specifics in the UI files. There are a lot of stubs, but some classes are more detailed.&lt;br /&gt;
&lt;br /&gt;
There's also a long-standing draft article on the profile page here [[User:FollowTheGourd]] about the conversation UI. It could also be ammended to explain things like 800x600 is treated as if it were 1024x768, and that the cutscene bars actually have a negative height if the screen width is much longer than the screen height, as seen with Eyefinity display setups.&lt;br /&gt;
&lt;br /&gt;
Another thing to realize is the game's aspect ratio correction and how one resolution in window mode will get stretched to fill your screen space in fullscreen mode. So then there's a difference between the Stage (Flash term) width and height and the video settings which you can access using the ExternalCommands ActionScript class. The point is that the Stage dimensions are more reliable than the video settings you can retrieve through the ExternalCommands class, although it doesn't stop the quickbar UI file from reading the attribute ''&amp;quot;ClientOptions.VideoOptions.ResolutionWidth&amp;quot;'' from it, but there might be a perfectly good reason for that like the engine notifying the GUI when it changes.&lt;br /&gt;
&lt;br /&gt;
== Toolchain ==&lt;br /&gt;
&lt;br /&gt;
[http://www.flashdevelop.org/ FlashDevelop IDE.]&lt;br /&gt;
etc&lt;br /&gt;
&lt;br /&gt;
== Organizing Sources ==&lt;br /&gt;
&lt;br /&gt;
Obtain an ActionScript 2.0 decompiler such as Sothink or Trillix. Each has their shortcomings and will require further post-processing. Sothink's ActionScript output will probably require more work to make compile with MTASC, but Trillix's output seems to have some stranger bugs I'll mention later, which makes me more hesitant to recommend it. Sothink's tool still seems to have an issue formatting double-precision values as single-precision, as detailed in the section below. [http://www.nowrap.de/flare.html Flare] is also a nice free tool to compare output against, but it unfortunately isn't in a format that you can simply recompile.&lt;br /&gt;
&lt;br /&gt;
[http://www.nowrap.de/flasm.html Flasm] is also a useful tool if you wish to examine the p-code directly (as a debug or learning aid perhaps), or even modify it that way.&lt;br /&gt;
&lt;br /&gt;
=== GFX to SWF ===&lt;br /&gt;
&lt;br /&gt;
If you want your changes to be compatible with a certain or the latest game patch, then you'll also have to first merge the appropriate [[GFX]] files. For example, to be compatible with game v1.03, you'll first need to extract the GFX files from guiexport.erf, and then from the patch000.erf, patch001.erf, and patch002.erf files found under C:\Program Files\Dragon Age\packages\core\patch. If you want to be compatible with v1.02a, then it should suffice to stop merging after patch001.erf.&lt;br /&gt;
&lt;br /&gt;
Then you want to change the first three bytes for the GFX to CWS and change the file suffix to SWF.&lt;br /&gt;
Example Python script:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
from __future__ import with_statement&lt;br /&gt;
# The first line is required if you get the following error when running the python script under 2.5.4/2.5.5&lt;br /&gt;
# SyntaxError: invalid syntax - with open(gfxPath, &amp;quot;rb+&amp;quot;) as gfxFile:&lt;br /&gt;
import glob&lt;br /&gt;
import os&lt;br /&gt;
import struct&lt;br /&gt;
&lt;br /&gt;
for gfxPath in glob.glob('*.gfx'):&lt;br /&gt;
	with open(gfxPath, &amp;quot;rb+&amp;quot;) as gfxFile:&lt;br /&gt;
		print(gfxPath)&lt;br /&gt;
		gfxFile.write(struct.pack('3s', &amp;quot;CWS&amp;quot;))&lt;br /&gt;
	os.rename(gfxPath, os.path.splitext(gfxPath)[0] + &amp;quot;.swf&amp;quot;) &lt;br /&gt;
		&lt;br /&gt;
line = input(&amp;quot;Press enter to exit.&amp;quot;)&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Obtain ActionScript Sources ===&lt;br /&gt;
&lt;br /&gt;
If you're using Sothink's tool, then here's an example of how you would quickly retrieve the ActionScript, if you've converted the GFX into SWFs as mentioned above. Do a multi-file export with all of the SWF files (merged to whichever patch version you wish). [http://i1002.photobucket.com/albums/af150/FollowTheGourd/sothink_swf.jpg Screen shot]&lt;br /&gt;
&lt;br /&gt;
=== Merge ActionScript Classes ===&lt;br /&gt;
&lt;br /&gt;
It's a good idea to create a single ActionScript library of all the game sources; that way you don't have to repeatedly make the same modifications for every SWF file that uses the same modified classes. As you'll see later when using the SWF injection method, that this doesn't make available all of the classes to every SWF file, but it's a way to avoid redundant editing.&lt;br /&gt;
&lt;br /&gt;
For instance, here's a embarrassingly quick and dirty way of doing it with a Python script:&lt;br /&gt;
''Note:'' this will throw an exception on later versions of Python because shutil.move undocumentedly doesn't want to clobber existing files. You could add a check if the file already exists and not move it - or rewrite the script and make something better.&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
from __future__ import with_statement&lt;br /&gt;
# The first line is required if you get the following error when running the python script under 2.5.4/2.5.5&lt;br /&gt;
# SyntaxError: invalid syntax - with open(gfxPath, &amp;quot;rb+&amp;quot;) as gfxFile:&lt;br /&gt;
# [Yes, this code probably sucks]&lt;br /&gt;
&lt;br /&gt;
import shutil&lt;br /&gt;
import os&lt;br /&gt;
import re&lt;br /&gt;
import zlib&lt;br /&gt;
&lt;br /&gt;
# Usage: have the batch exported ActionScript from the decompiler (say Sothink) in a dir called export. Then run this &lt;br /&gt;
# script at the same level as the export dir. It will create a C:\commonlib folder with the ActionScript merged into it.&lt;br /&gt;
# Left over in export is what you can import into a FlashDevelop project. You'll also want to make&lt;br /&gt;
# intrinsics out of export and commonlib, but commlib goes in the global classpath, while&lt;br /&gt;
# the appropriate export subfolder goes in the appropriate project classpath.&lt;br /&gt;
&lt;br /&gt;
mergedir = r'C:\commonlib'&lt;br /&gt;
scriptdict = {}&lt;br /&gt;
for dirpath, dirnames, filenames in os.walk('export'):&lt;br /&gt;
	print(dirpath)&lt;br /&gt;
	for junk in filter (lambda x: not x.endswith(&amp;quot;.as&amp;quot;), filenames):&lt;br /&gt;
		os.remove(os.path.join(dirpath, junk))&lt;br /&gt;
	for script in filter( lambda x : x.endswith(&amp;quot;.as&amp;quot;), filenames):&lt;br /&gt;
		scriptfile = open(os.path.join(dirpath, script))&lt;br /&gt;
		relativedir = re.sub(r'export\\[^\\]+\\?', '', dirpath)&lt;br /&gt;
		relativepath = os.path.join(relativedir, script)&lt;br /&gt;
		crc32 = zlib.crc32(scriptfile.read())&lt;br /&gt;
		scriptfile.close()&lt;br /&gt;
		sourcepath = os.path.join(dirpath, script)&lt;br /&gt;
		if relativepath in scriptdict:&lt;br /&gt;
			lastval = scriptdict[relativepath]&lt;br /&gt;
			if lastval['crc32'] == crc32:&lt;br /&gt;
				destdir = os.path.join(mergedir, relativedir)&lt;br /&gt;
				if os.path.exists(lastval['sourcepath']):&lt;br /&gt;
					os.remove(lastval['sourcepath'])&lt;br /&gt;
				if not os.path.exists(destdir):&lt;br /&gt;
					os.makedirs(destdir)&lt;br /&gt;
				#print(&amp;quot;move &amp;quot; + sourcepath + &amp;quot; to &amp;quot; + destdir)&lt;br /&gt;
				shutil.move(sourcepath, destdir)&lt;br /&gt;
			else:&lt;br /&gt;
				# There any many *Scene.as files that are the same&lt;br /&gt;
				# BUT there's an &amp;quot;emptyish&amp;quot; Scene.as used an as interface as well.&lt;br /&gt;
				# So you probably want Scene.as as common, but the other scenes as unique&lt;br /&gt;
				# even if they have the same name. Still throw if script is Scene.as but not if it ends with it.&lt;br /&gt;
				if not re.search(r'.Scene\.as$', script):&lt;br /&gt;
					raise Exception(&amp;quot;Same name, different CRC32: &amp;quot; + sourcepath)&lt;br /&gt;
		else:&lt;br /&gt;
			scriptdict[relativepath] = { 'crc32': crc32, 'sourcepath': sourcepath }&lt;br /&gt;
&lt;br /&gt;
# Find unique entries in SharedLibary, GUI, etc. Copy them over to commonlib but print out what we found.&lt;br /&gt;
# [Bit of a copy-pasta job here...]&lt;br /&gt;
for dirpath, dirnames, filenames in os.walk('export'):&lt;br /&gt;
	for script in filter (lambda x: x.endswith(&amp;quot;.as&amp;quot;), filenames):&lt;br /&gt;
		relativedir = re.sub(r'export\\[^\\]+\\?', '', dirpath)&lt;br /&gt;
		if relativedir == '':&lt;br /&gt;
			continue&lt;br /&gt;
		relativepath = os.path.join(relativedir, script)&lt;br /&gt;
		sourcepath = os.path.join(dirpath, script)&lt;br /&gt;
		destdir = os.path.join(mergedir, relativedir)&lt;br /&gt;
		if not os.path.exists(destdir):&lt;br /&gt;
			os.makedirs(destdir)&lt;br /&gt;
		print(&amp;quot;Unique commonlib: &amp;quot; + sourcepath)&lt;br /&gt;
		shutil.move(sourcepath, destdir)&lt;br /&gt;
&lt;br /&gt;
# Clean up empty dirs&lt;br /&gt;
for dirpath, dirnames, filenames in os.walk('export', topdown=False):&lt;br /&gt;
	for d in dirnames:&lt;br /&gt;
		try:&lt;br /&gt;
			os.rmdir(os.path.join(dirpath, d))&lt;br /&gt;
		except OSError:&lt;br /&gt;
			pass&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Making Modifications ==&lt;br /&gt;
=== Bugs and getting sources to compile ===&lt;br /&gt;
[ Note: this is mostly just copy and pasted from my post in another forum at the moment. It still needs some reworking to better explain things ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can first get the open source FlashDevelop IDE which comes with MTASC and the standard Flash library. If you have the SWFs and the ActionScript *.as files, then what you can do is create an empty ActionScript 2 project, in the project settings turn off &amp;quot;use main entry point&amp;quot; and under the project &amp;quot;injection&amp;quot; tab, point it to the SWF you want to update with your new ActionScript.&lt;br /&gt;
&lt;br /&gt;
You'll also want to update the project classpaths to point to your game's ActionScript library. Just in my experience, there seem to be some properties on some of the standard classes that would normally prevent the script from compiling - but in that case what you can do is modify the so-called intrinsic files to let the compiler know about them. E.g., you can add needed function and var declarations to the intrinsic class interfaces under C:\Program Files\FlashDevelop\Tools\mtasc. The nice thing about ActionScript and intrinsics is that (unless used as a case value in a switch-statement) you don't even need to know the values of these &amp;quot;missing&amp;quot; properties or functions if they're basically defined in the runtime environment. E.g., Mouse.LEFT isn't standard Flash, but if you edit Mouse.as and add '''static var LEFT;''' to the intrinsic class definition, then you're good to go, as the value gets looked up during execution like a dictionary value (in fact, Mouse[&amp;quot;LEFT&amp;quot;] should yield the same result).&lt;br /&gt;
&lt;br /&gt;
Also if you press Ctrl+J you'll get the type explorer where you can right click on a folder (that you've added to your classpath) and select &amp;quot;convert to intrinsic&amp;quot;. So this way you only need to compile the actual *.as file you're making changes to and keep the others around as intrinsics. Using the IDE's SWF injection I mentioned above will make it so you don't have to worry about recompiling everything.&lt;br /&gt;
&lt;br /&gt;
You'll probably get a bunch of warnings like &amp;quot;... needs the class &amp;lt;Whatever&amp;gt; which was not compiled&amp;quot; but that's just MTASC not liking how some class names are used outside of what you're compiling like in Flash registerObject calls.&lt;br /&gt;
&lt;br /&gt;
Now the bigger issue is that MTASC is pickier about things than Adobe's compiler. You'll often have to write this.varname or ClassName.varname instead of just varname, and MTASC doesn't like named *nested* functions. So you'll sometimes have to convert function FooBar() { ... } into something like &amp;quot;this.FooBar = function() { };&amp;quot; or &amp;quot;_root.FooBar = function() { };&amp;quot;. But also make sure that the variable for the function is a class member and not function-local or it'll just be a register or randomly named variable when compiled, or just not be available in the scope you need it to be.&lt;br /&gt;
&lt;br /&gt;
MTASC is also pickier about the scope of local variables. It may sound weird, but in ActionScript 2.0 a function-local variable is defined for the scope of the function - it doesn't matter if declared in an if-statement or in braces. But the MTASC compiler will enforce that you define the variable in a &amp;quot;proper&amp;quot; scope, so you may need to move where it's declared if you want things to compile. E.g., &amp;quot;if (foo) { var tmp = 1; } else { tmp = 2; }&amp;quot; won't fly with MTASC.&lt;br /&gt;
&lt;br /&gt;
Also it seems like MTASC doesn't like the global function &amp;quot;Array&amp;quot;, but doesn't mind if you use the constructor instead. E.g., I've had issues with var ar = Array(...), but var ar = new Array(...) works or you could use the square-bracket notation instead.&lt;br /&gt;
&lt;br /&gt;
Some other stuff... if you want multiple projects, just create the projects all in the same dir (but create folders if you want to separate stuff and adjust the project classpath accordingly).&lt;br /&gt;
Also, don't necessarily set &amp;quot;Always compile&amp;quot; for the *.as file or you might run into duplicate definition errors - things should get drawn in as needed, but I think you need to set it for classes in the original SWF you wish to update. That might be a little hit and miss at first, but you can always check to make sure your changes got in.&lt;br /&gt;
&lt;br /&gt;
Also, looking at the output in FLASM, MTASC might not generate the most blazing bytecode ever - but neither does Adobe's compiler. Just some things I noticed is that Adobe's will use function argument registers more than MTASC seems to... e.g., &amp;quot;push '_root'; getVariable&amp;quot; vs just a r:_root register.&lt;br /&gt;
&lt;br /&gt;
Another apparent annoyance with MTASC is that it doesn't seem to recognize some global variables (which you can confirm with flasm's output (push 'somevar'; getVariable). Workarounds include ''_global.someVariable'', or sometimes ''_root.someVariable'' as appropriate.&lt;br /&gt;
&lt;br /&gt;
One last thing... you may want to organize your *.as files so you combine the ones that are commonly used across different SWF files so you're not always having to edit multiple copies of SomeClass.as for each SWF that uses it.&lt;br /&gt;
&lt;br /&gt;
Also, I noticed a bug in sothink that I emailed them about: doubles are formatted as single-precision floating point. But some other tools, e.g., flare, get the value correctly. You might want to search your *.as files for &amp;quot;E-&amp;quot; and &amp;quot;E+&amp;quot; to look for these misformatted values if you're using it.&lt;br /&gt;
&lt;br /&gt;
EDIT: Here's a bug with Trillix I noticed, but they said it'll be fixed soon: if you have &amp;quot;var foo = this&amp;quot; and if a register is used for 'foo', then Trillix doesn't properly initialize the register... but instead just uses 'this' everywhere else. This causes problems if you needed that variable to choose between using 'this' and possibly another object. E.g., &amp;quot;var obj = this; if (something) { obj = someOtherObject; } someFunc.doIt(obj);&amp;quot; only works as long as &amp;quot;obj&amp;quot; is stored as a variable and not a register, which is up to the original compiler. In reply, they mentioned that you could work around that issue by turning off the &amp;quot;ActionScript 'Recover arguments' names&amp;quot; setting, which makes it a bit more difficult to keep track of function arguments, so it's less than ideal.&lt;br /&gt;
&lt;br /&gt;
=== Getting Information From The Engine ===&lt;br /&gt;
It is possible to get information from the engine using the ExternalCommands class. More on this class can be found at [[ActionScript:ExternalCommands|External Commands]]. Of aprticular interest is [[ActionScript:ExternalCommands.GetValue|GetValue]]&lt;br /&gt;
&lt;br /&gt;
=== Issues displaying custom MovieClip subclasses ===&lt;br /&gt;
'''Note:''' this tries to explain some of the issues, and isn't suggesting best practices. This is a bit rambling and should be presented with more concrete examples. Ideally it wouldn't be needed at all and we could use the Scaleform SDK to convert our SWFs into GFX, or we could splice in our own movieclip symbol tags into the GFX file.&lt;br /&gt;
&lt;br /&gt;
The simple issue is this: if it wasn't originally created in the Flash designer (also having a symbol in the Flash library), then you'll have a harder time of showing custom MovieClip objects through ActionScript alone. This would appear to be a bug, but speculatively, it could be for performance reasons.&lt;br /&gt;
&lt;br /&gt;
==== Using swfmill ====&lt;br /&gt;
This hasn't been thoroughly tested, but swfmill may be a simple way to add you own symbols. Use swfmill to convert the SWF into an XML file, edit it, and then use swfmill to convert it back. It appears to work, and even properly retains the non-standard SWF tags. For custom class behavior, you'll still need to make an ''Object.registerClass'' call to associate the library symbol with the class. If you do use this method, one thing to make sure of is that the embedded textures display properly, since they're being referred to using a non-standard SWF tag.&lt;br /&gt;
&lt;br /&gt;
==== createEmptyMovieClip method ====&lt;br /&gt;
So until splicing in tags becomes more streamlined, or some other method is found, then it may be easier to just create an empty movieclip and then populate the member fields using a mixin from another class or manually, although that's probably still less than ideal for classes that use the onLoad event. Another thing as mentioned below is the possibility of abusing prototype mechanics (which can be somewhat messy) or subclass an existing class to specialize the beha&lt;br /&gt;
&lt;br /&gt;
It would appear that the ''MovieClip'' method ''createEmptyMovieClip'' is of limited use unless you then load another movieclip (such as an icon image) into it or or do a ''beginFill ... endFill'' ('''fill-code''') for a few frames to define its dimensions, filling it for as many frames until, say, its '''_height''' property becomes non-zero. It's ugly, but works. Also, if you do a fill on an object in the library, then you actually affect its '''_xscale''' and '''_yscale''' by making the object stretch to fit into your fill. Ultimately, it'd probably be less of a hassle to alter the SWF file to insert your object. Because of having to rerun the code, you'll probably want to delay having to reload images or other intensive operations. You'll have to rerun the fill-code at least twice for this to work, timing alone doesn't matter as has been determined through trial and error.&lt;br /&gt;
&lt;br /&gt;
==== attachMovie method ====&lt;br /&gt;
Perhaps a simpler way is to use ''attachMovie'', although you'll have to find a pre-existing movieclip symbol that suites your needs, and if you want to change its default dimensions then you'll have to delay the fill-code for a few (let's say 150 or so since the scene began) frames after the game loads until it actually works. '''NOTE:''' Reconfirm this is actually necessary instead of just being able to set the _height/_width/_xscale/_yscale, although you may still need to delay setting those for the change to take effect. This way you shouldn't have to keep rerunning the fill-code as with the above ''createEmptyMovieClip'' method. This whole delay business is probably more of an issue in UI elements that are on the HUD instead of selected later from the navbar. You can probably check for when you've waited enough frames by running some simple fill-code on an empty movieclip and checking whether the '''_height''' property changes. &lt;br /&gt;
E.g., the PieCooldown symbol exists in the quickbar.swf file and isn't the worst choice for an empty MovieClip. You can use programs like swix, swfmill, and probably others to find simple objects without much embedded graphics.&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
private static var EMPTYMC_LINKID:String = &amp;quot;PieCooldown&amp;quot;;	&lt;br /&gt;
var mc:MovieClip = someClip_mc.attachMovie(EMPTYMC_LINKID, &amp;quot;SomeName_mc&amp;quot;, someClip_mc.getNextHighestDepth(), {_x:10, _y:10});&lt;br /&gt;
&lt;br /&gt;
// Changing the default dimensions of &amp;quot;PieCooldown&amp;quot;&lt;br /&gt;
// Although you can probably just change the _height, _width or scales after the&lt;br /&gt;
// needed delay instead, unlike with the createEmptyMovieClip method apparently.&lt;br /&gt;
// Also not really necessary if you just want to use it as an invisible container,&lt;br /&gt;
// since other items can be positioned outside of it, relative to its local &lt;br /&gt;
// coordinates.&lt;br /&gt;
with(mc)&lt;br /&gt;
{&lt;br /&gt;
   beginFill(0, 0); // alpha is zero.&lt;br /&gt;
   moveTo(0, 0);&lt;br /&gt;
   lineTo(21, 0);&lt;br /&gt;
   lineTo(21, 21);&lt;br /&gt;
   lineTo(0, 21);&lt;br /&gt;
   endFill();	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The game's script sources also come with a ''MovieUtils'' class, which has a wrapper around ''attachMovie''. This can be useful to create an instance of a library symbol in the SWF file and use it instead for another purpose. &lt;br /&gt;
&lt;br /&gt;
Other useful workaround would be abusing prototype mechanics of ActionScript to give an already existing class other behavior if desired, and can be switched using a custom argument for the initObject during the attachMovie call. This way you don't have to edit the actual class file, if making it recompile is problematic or time consuming. Although this is a kludge method of doing it.&lt;br /&gt;
&lt;br /&gt;
Also of note is that ''Object.registerClass'' or the so-called [http://www.google.com/search?hl=en&amp;amp;source=hp&amp;amp;q=attachMovie+__packages+trick __Packages trick] won't really get you anywhere either. You'll be able to create the MovieClip subclass, but it won't display properly (or just differently) without the above-mentioned tricks.&lt;br /&gt;
&lt;br /&gt;
Creating a subclass of an existing class that's registered with ''Object.registerClass'' may also be a convenient way to customize class behavior without having to recompile the base class if you then change the registerClass call to use the subclass.&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=2DA_ranges_in_use&amp;diff=16102</id>
		<title>2DA ranges in use</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=2DA_ranges_in_use&amp;diff=16102"/>
				<updated>2011-04-22T21:54:26Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: /* M2DA_base */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is meant to enumerate row ID ranges that are used by the main game and by various popular addins, to avoid accidental overlap. See also [[Prefixes in use]] and [[Compatibility]].&lt;br /&gt;
&lt;br /&gt;
Note that there's no need for 2DA row IDs to be sequential, so you can use very large row ID numbers to reduce the chances of collision.&lt;br /&gt;
&lt;br /&gt;
Version 1.0 of the toolset had a bug in ExcelProcessor that caused problems with high row ID numbers, but this has been fixed in subsequent releases. See [[Bug: ExcelProcessor doesn't handle row IDs above 8.3 million correctly|the bug report]].&lt;br /&gt;
&lt;br /&gt;
As of now there is a bug that prevents ID's above 255 to be used for some M2DA's. See [[Bug: High M2DA ID ranges might work in the toolset, but not in game|Bug report]] for a list of tables affected.&lt;br /&gt;
&lt;br /&gt;
Another [[Bug: DLC conflicts with standalone campaigns|bug]] affects the rewards M2DA.&lt;br /&gt;
&lt;br /&gt;
== ABI_base ==&lt;br /&gt;
&lt;br /&gt;
According to the [[ABI_base]] page under the ''tooltipstrref'' column, anything over 500000 is considered a debuff. This would limit the range a fair amount.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 200262'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000 - 38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 50000 - 50001&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/861/ Advanced Tactics]&lt;br /&gt;
|-&lt;br /&gt;
| 51000 - 51002&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/1888/ Advanced Quickbar]&lt;br /&gt;
|-&lt;br /&gt;
| 450000 - 450300&lt;br /&gt;
| ladydesire's [http://social.bioware.com/project/815/ Tevinter Warden class]&lt;br /&gt;
|-&lt;br /&gt;
| 466000 - 466100&lt;br /&gt;
| Apolyon6k's [http://social.bioware.com/project/3842/ The magic of innocence]&lt;br /&gt;
|-&lt;br /&gt;
| 901974-903000 and 401974-403000(modal)&lt;br /&gt;
| Idomeneas' [http://social.bioware.com/project/3152/ Valeria Addon]&lt;br /&gt;
|-&lt;br /&gt;
| 1337000 - 1337008&lt;br /&gt;
| amcnow's [http://social.bioware.com/project/3823/ Respecification]&lt;br /&gt;
|-&lt;br /&gt;
| 2560000 - 2560500&lt;br /&gt;
| Timelord's [http://social.bioware.com/project/1845/ Blood and Lyrium]&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680250&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000 - 40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 300000-300047&lt;br /&gt;
| rebel5555's [http://social.bioware.com/project/2646/ 2 Handed Weapon Abilities for Arcane Warriors]&lt;br /&gt;
|-&lt;br /&gt;
| 300000-300047&lt;br /&gt;
| rebel5555's [http://social.bioware.com/project/3637/ Dual Weapon Abilities for Arcane Warriors]&lt;br /&gt;
|-&lt;br /&gt;
| 300000-300047&lt;br /&gt;
| rebel5555's [http://social.bioware.com/project/2644/ Weapon and Shield Abilities for Arcane Warriors]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== AI_TacticsPresets ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 9'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| 10 - 15&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/861/ Advanced Tactics]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
== ambient_ai ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| 1000000-1001000&lt;br /&gt;
| [http://social.bioware.com/project/178/ Crown of Creation]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== ANIM_base ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| 65000 - 65002&lt;br /&gt;
| BioSpirit's [http://social.bioware.com/project/1647/ Hilltop Under Siege]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== APR_base ==&lt;br /&gt;
&lt;br /&gt;
Note that there is a bug involving this 2DA: [[Bug: APR base maximum M2DA row ID is 65535 in the toolset]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 90'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000 - 38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 40000 - 40010&lt;br /&gt;
| Alschemid - [http://social.bioware.com/project/3175/ Horses] and [http://social.bioware.com/project/3666/ Sandbox]&lt;br /&gt;
|-&lt;br /&gt;
| 65000 - 65001&lt;br /&gt;
| BioSpirit's [http://social.bioware.com/project/1647/ Hilltop Under Siege]&lt;br /&gt;
|-&lt;br /&gt;
| 55000 - 57000&lt;br /&gt;
| World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 65010 - 65025&lt;br /&gt;
| Mutantspicy Oracle and Enchanted Armor [Dragonage Nexus]&lt;br /&gt;
|--&lt;br /&gt;
| 1000001 - 1100000&lt;br /&gt;
| DA Workshop / by frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== areadata ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== armor_massive_variation ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 8'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| 50-50&lt;br /&gt;
| Alschemid - [http://social.bioware.com/project/3666/ Sandbox]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: the highest working tested ID for this variation is 141. See [http://social.bioware.com/wiki/datoolset/index.php/Bug:_High_M2DA_ID_ranges_might_work_in_the_toolset,_but_not_in_game bug report]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== BITM_base and ItemStats_ ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 30000 - 30500&lt;br /&gt;
| Ambaryerno - [http://social.bioware.com/project/415/ Arms and Armor]&lt;br /&gt;
|-&lt;br /&gt;
| 37000-38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 40000 - 40200&lt;br /&gt;
| DA Workshop / by frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
| 57000-59000&lt;br /&gt;
| [World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone]&lt;br /&gt;
|-&lt;br /&gt;
| 77000-79000&lt;br /&gt;
| [Sanguine Sunrise by LukaCrosszeria [http://social.bioware.com/project/4024/ Sanguine Sunrise]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 50000 - 50100&lt;br /&gt;
| Feline Fuelled Games - (by Silk) [http://www.felinefuelledgames.de/ Feline Fuelled Games]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== CLA_base ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 25'''&lt;br /&gt;
| '''Bioware&lt;br /&gt;
|-&lt;br /&gt;
| 10000 - 10012&lt;br /&gt;
| Ladydesire&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== crafting_recipe_types ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 7'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680020&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== crafting_recipes ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 91'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5682000&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== engineevents ==&lt;br /&gt;
&lt;br /&gt;
Those ranges relates to custom events types/ID and not to engineevents based [[Event_override|events overriding]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 500 - 500&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/861/ Advanced Tactics]&lt;br /&gt;
|-&lt;br /&gt;
| 510 - 511&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/1888/ Advanced Quickbar]&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680050&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== guitypes ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 600 - 600&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/861/ Advanced Tactics]&lt;br /&gt;
|-&lt;br /&gt;
| 601 - 601&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/1888/ Advanced Quickbar]&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 666000 - 666020&lt;br /&gt;
| Apolyon6k's [http://social.bioware.com/project/3842/ The magic of innocence]&lt;br /&gt;
|-&lt;br /&gt;
| 1337000 - 1337001&lt;br /&gt;
| amcnow's [http://social.bioware.com/project/3823/ Respecification]&lt;br /&gt;
|-&lt;br /&gt;
| 1974100-1974200&lt;br /&gt;
| Idomeneas' [http://social.bioware.com/project/3152/ Valeria Addon]&lt;br /&gt;
|-&lt;br /&gt;
| 2560000 - 2560050&lt;br /&gt;
| Timelord's [http://social.bioware.com/project/1845/ Blood and Lyrium]&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680010&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Heraldry ==&lt;br /&gt;
There is a [[Bug:_High_M2DA_ID_ranges_might_work_in_the_toolset,_but_not_in_game | bug]] with this table. The range 0-255 is known to work.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 1000001 - 1001000&lt;br /&gt;
| [http://social.bioware.com/project/178/ Crown of Creation] (using 201 onwards temporarily) &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== itemprps ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 10022'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000-38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 77000-79000&lt;br /&gt;
| Sanguine Sunrise by LukaCrosszeria [http://social.bioware.com/project/4024/ Sanguine Sunrise]&lt;br /&gt;
|-&lt;br /&gt;
| 1000001 - 2000000&lt;br /&gt;
| DA Workshop / by frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
| 2555000-2555010&lt;br /&gt;
| PavelNovotny - [http://social.bioware.com/project/517/ Gay Bars of Ferelden]&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680050&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
| 7570000-7770000&lt;br /&gt;
| [World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone]&lt;br /&gt;
|-&lt;br /&gt;
| 536873321 - 536873322&lt;br /&gt;
| Elys' [http://social.bioware.com/project/522/ Mysterious Gifts]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 2560000-2560050&lt;br /&gt;
| Timelord's [http://social.bioware.com/project/1845/ Blood and Lyrium]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== itemsets ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 30'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 2555000-2555010&lt;br /&gt;
| PavelNovotny - [http://social.bioware.com/project/517/ Gay Bars of Ferelden]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680500&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
| 7570000-7770000&lt;br /&gt;
| [World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone]&lt;br /&gt;
|-&lt;br /&gt;
| 1405261000 - 1405261999&lt;br /&gt;
| nezroy - [http://social.bioware.com/project/1834/ Warden Shields], [http://www.dragonagenexus.com/downloads/file.php?id=793 Leliana Item Set]&lt;br /&gt;
|-&lt;br /&gt;
| 1000001 - 2000000&lt;br /&gt;
| DA Workshop / by frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
| 7771000 - 7771500&lt;br /&gt;
| [http://social.bioware.com/project/2157/ Dark Times: The Confederacy of Malkuth] (reserved by Starlight on Questorion's behalf)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== ItemVariations (all) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 30'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000'''&lt;br /&gt;
| '''Bioware - reserved (guessed)'''&lt;br /&gt;
|-&lt;br /&gt;
| 12000 - 12100&lt;br /&gt;
| [http://social.bioware.com/project/1923/ Adonnay's Weaponry] (reserved by mikemike37 on his behalf)&lt;br /&gt;
|-&lt;br /&gt;
| 77 - 99&lt;br /&gt;
| Sanguine Sunrise by LukaCrosszeria [http://social.bioware.com/project/4024/ Sanguine Sunrise]&lt;br /&gt;
|-&lt;br /&gt;
| 140 - 160&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 101000 - 400000&lt;br /&gt;
| [http://social.bioware.com/project/2157/ Dark Times: The Confederacy of Malkuth] (reserved by Starlight on Questorion's behalf)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
note: ItemVariations are affected by the bug which prevents ID's above 255 from appearing properly in the game. See [[Bug: High M2DA ID ranges might work in the toolset, but not in game|Bug report]].&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== M2DA_base ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1016, 2000 - 2010, 10011 - 10142, ...? '''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 5000 - 5014&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/861/ Advanced Tactics]&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000 - 38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 77000 - 79000&lt;br /&gt;
| [http://social.bioware.com/project/4024/ Sanguine Sunrise] by LukaCrosszeria &lt;br /&gt;
|-&lt;br /&gt;
| 100000 - 100000&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/1907/ Event Manager]&lt;br /&gt;
|-&lt;br /&gt;
| 690000 - 690100&lt;br /&gt;
| [http://www.dragonagenexus.com/downloads/file.php?id=1617 Karma's Origins Companions]&lt;br /&gt;
|-&lt;br /&gt;
| 1000001 - 1100000&lt;br /&gt;
| DA Workshop / by frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
| 1337000 - 1337001&lt;br /&gt;
| amcnow's [http://social.bioware.com/project/3823/ Respecification]&lt;br /&gt;
|-&lt;br /&gt;
| 2300000 - 2300100&lt;br /&gt;
| [http://social.bioware.com/project/178/ Crown of Creation] (M2DA prefix: COC)&lt;br /&gt;
|-&lt;br /&gt;
| 2560000 - 2560050&lt;br /&gt;
| Timelord's [http://social.bioware.com/project/1845/ Blood and Lyrium]&lt;br /&gt;
|-&lt;br /&gt;
| 5000000 - 5000010&lt;br /&gt;
| Noob766's [http://social.bioware.com/project/3827/ Companion Compatibility pack]&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680050&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
| 5680050 - 5680055&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/3185/ Flexible craft UI]&lt;br /&gt;
|-&lt;br /&gt;
| 5681000 - 5681005&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/2896/ DACrafting framework]&lt;br /&gt;
|-&lt;br /&gt;
| 6000000 - 6000050&lt;br /&gt;
| TreDawn - [http://social.bioware.com/project/1750/ Nesiara Companion]&lt;br /&gt;
|-&lt;br /&gt;
| 6660000 - 6660050&lt;br /&gt;
| Apolyon6k - [http://social.bioware.com/project/3842/ The magic of innocence]&lt;br /&gt;
|-&lt;br /&gt;
| 7000000 - 7000050&lt;br /&gt;
| FtG - [http://social.bioware.com/project/1688/ UI Mod]&lt;br /&gt;
|-&lt;br /&gt;
| 7000051 - 7000055&lt;br /&gt;
| FtG - [http://social.bioware.com/project/3663/ Custom Loading Screen]&lt;br /&gt;
|-&lt;br /&gt;
| 7000056 - 7000071&lt;br /&gt;
| FtG - [http://social.bioware.com/forum/1/topic/75/index/5569843 Portrait dialogue and custom tokens (test release)]&lt;br /&gt;
|-&lt;br /&gt;
| 7000075-7000080&lt;br /&gt;
| FtG - [http://nowhereyet.invalid Quickbar (to be released soon)]&lt;br /&gt;
|-&lt;br /&gt;
| 7570000 - 7770000&lt;br /&gt;
| [World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone] &lt;br /&gt;
|-&lt;br /&gt;
| 7777770 - 7777799&lt;br /&gt;
| Magic - [http://social.bioware.com/project/1429/ Void Walker] (M2DA prefix: VWK)&lt;br /&gt;
|-&lt;br /&gt;
| 9000000 - 9000050&lt;br /&gt;
| Ambaryerno - [http://social.bioware.com/project/415/ Arms and Armor]&lt;br /&gt;
|- &lt;br /&gt;
| 30000000 - 40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 1140150041 - 1140150091&lt;br /&gt;
| DLAN_Immortality - [http://social.bioware.com/project/789/ Ser Gilmore NPC]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== materialrules ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000-38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 536873321 - 536873323&lt;br /&gt;
| Elys' [http://social.bioware.com/project/522/ Mysterious Gifts]&lt;br /&gt;
|-&lt;br /&gt;
| 1405261000 - 1405261999&lt;br /&gt;
| nezroy - [http://social.bioware.com/project/1834/ Warden Shields], [http://www.dragonagenexus.com/downloads/file.php?id=793 Leliana Item Set]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== materialtypes ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 88'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000-38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680300&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
| 536873321 - 536873340&lt;br /&gt;
| Elys' [http://social.bioware.com/project/522/ Mysterious Gifts]&lt;br /&gt;
|-&lt;br /&gt;
| 1405261000 - 1405261999&lt;br /&gt;
| nezroy - [http://social.bioware.com/project/1834/ Warden Shields], [http://www.dragonagenexus.com/downloads/file.php?id=793 Leliana Item Set]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== PartyPicker ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 11'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''????'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 101-199&lt;br /&gt;
| [http://social.bioware.com/project/178/ Crown of Creation]&lt;br /&gt;
|-&lt;br /&gt;
| 200 - 299&lt;br /&gt;
| DA Workshop / Author: frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
| 300 - 350&lt;br /&gt;
| [World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone]&lt;br /&gt;
|-&lt;br /&gt;
| 1974-1980&lt;br /&gt;
| Idomeneas' [http://social.bioware.com/project/3152/ Valeria Addon]&lt;br /&gt;
|-&lt;br /&gt;
| 5711-5720&lt;br /&gt;
| [http://social.bioware.com/project/3926/ Castle Drakhaoul] by Marshal57'&lt;br /&gt;
|-&lt;br /&gt;
| 6660 - 6665&lt;br /&gt;
| Apolyon6k's [http://social.bioware.com/project/3842/ The magic of innocence]&lt;br /&gt;
|-&lt;br /&gt;
| 77000 - 79000&lt;br /&gt;
| [http://social.bioware.com/project/4024/ Sanguine Sunrise] by LukaCrosszeria &lt;br /&gt;
|-&lt;br /&gt;
| 6900000 - 6900200&lt;br /&gt;
| [http://www.dragonagenexus.com/downloads/file.php?id=1617 Karma's Origins Companions]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== PRCSCR ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000 - 38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 77000 - 79000&lt;br /&gt;
| [http://social.bioware.com/project/4024/ Sanguine Sunrise] by LukaCrosszeria &lt;br /&gt;
|-&lt;br /&gt;
| 690000 - 690100&lt;br /&gt;
| [http://www.dragonagenexus.com/downloads/file.php?id=1617 Karma's Origins Companions]&lt;br /&gt;
|-&lt;br /&gt;
| 1000001 - 1100000&lt;br /&gt;
| DA Workshop / by frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
| 1337000&lt;br /&gt;
| amcnow's [http://social.bioware.com/project/3823/ Respecification]&lt;br /&gt;
|-&lt;br /&gt;
| 2000000 - 2000050&lt;br /&gt;
| [http://www.dragonagenexus.com/downloads/file.php?id=942 Oracle,mutantspicy's magic vault, and other custom armors]&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680020&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
| 6000000 - 6000050&lt;br /&gt;
| TreDawn - [http://social.bioware.com/project/1750/ Nesiara Companion]&lt;br /&gt;
|-&lt;br /&gt;
| 7570000 - 7770000&lt;br /&gt;
| [World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone]&lt;br /&gt;
|-&lt;br /&gt;
| 10100000&lt;br /&gt;
| Camp [http://social.bioware.com/project/463/ storage chest]&lt;br /&gt;
|-&lt;br /&gt;
| 10100011 - 10100013&lt;br /&gt;
| Didymos' [http://social.bioware.com/project/2620/ Camp Merchant Chest]&lt;br /&gt;
|-&lt;br /&gt;
| 10100014 - 10100016&lt;br /&gt;
| Didymos' [http://social.bioware.com/project/2717/ Item Sets Fix]&lt;br /&gt;
|-&lt;br /&gt;
| 10100100 - 10100110&lt;br /&gt;
| Eshme's [http://social.bioware.com/project/1929/ Sleeping Tent]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000 - 40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 42006090 - 42006100&lt;br /&gt;
| [http://www.dragonagenexus.com/downloads/file.php?id=1120 Morrigan Restoration Patch]&lt;br /&gt;
|-&lt;br /&gt;
| 1000197400 - 1000197410&lt;br /&gt;
| Idomeneas' [http://social.bioware.com/project/3152/ Valeria Addon]&lt;br /&gt;
|-&lt;br /&gt;
| 1109197751 - 1109197799&lt;br /&gt;
| Schwinni - [http://dragonagenexus.com/downloads/file.php?id=1020 Awakening Runes Fixes], [http://dragonagenexus.com/downloads/file.php?id=1112 Awakening Blackblade Armor Dragon Drop Fix]&lt;br /&gt;
|-&lt;br /&gt;
| 1140150041 - 1140150091&lt;br /&gt;
| DLAN_Immortality - [http://social.bioware.com/project/789/ Ser Gilmore NPC]&lt;br /&gt;
|-&lt;br /&gt;
| 1405261000 - 1405261999&lt;br /&gt;
| nezroy - [http://social.bioware.com/project/1834/ Warden Shields], [http://www.dragonagenexus.com/downloads/file.php?id=793 Leliana Item Set]&lt;br /&gt;
|-&lt;br /&gt;
| 1553521700 - 1553521710&lt;br /&gt;
| Alschemid - [http://social.bioware.com/project/3666/ Sandbox]&lt;br /&gt;
|-&lt;br /&gt;
| 1672464532 - 1672464542&lt;br /&gt;
| DLAN_Immortality - [http://social.bioware.com/project/2991/ Ser Gilmore NPC Awakening]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== placeable_types ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 14000 - 16000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 17000 - 19000&lt;br /&gt;
| Standalone modules (see discussion tab)&lt;br /&gt;
|-&lt;br /&gt;
| 37000-38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 43050-43061&lt;br /&gt;
| Eshme's [http://social.bioware.com/project/1929/ Sleeping Tent]  (Greater 65535 is showing bugs so this is until it is fixed)&lt;br /&gt;
|-&lt;br /&gt;
| 43062-43065&lt;br /&gt;
| BioSpirit's [http://social.bioware.com/project/1647/ Hilltop Under Siege]&lt;br /&gt;
|-&lt;br /&gt;
| 56000-56200&lt;br /&gt;
| [http://social.bioware.com/project/2472/#details Mikes Invisible Boxes]&lt;br /&gt;
|-&lt;br /&gt;
| 2696549 - 2696700&lt;br /&gt;
| PavelNovotny - [http://social.bioware.com/project/517/ Gay Bars of Ferelden] (NOTE: I'm using the 6000-6200 range until Bioware fixes the bug which prevents m2da ID ranges above 900000 from showing up in game.)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 7570000-7770000&lt;br /&gt;
| [World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 1000001 - 1100000&lt;br /&gt;
| DA Workshop / Author: frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
| 1974-1978&lt;br /&gt;
| Idomeneas' [http://social.bioware.com/project/3152/ Valeria Addon] (They are low so they'll show in game, recall the toolset bug)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== popups ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 1000001-1001000&lt;br /&gt;
| [http://social.bioware.com/project/178/ Crown of Creation]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== PRJ_base ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680050&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
== String ID ==&lt;br /&gt;
It is not generally necessary to register String ID ranges here. The values generated by the toolset are sufficiently random to minimise the risk of collision. Exception : the Community Contest reserved the range below so that the builders will stick to that and can import VO without having to renumber the VO files.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 10000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 89000000  - 89999999&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== tint_override ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| 500 - 520&lt;br /&gt;
| PavelNovotny - [http://social.bioware.com/project/517/ Gay Bars of Ferelden]&lt;br /&gt;
|-&lt;br /&gt;
| 6900 - 6920&lt;br /&gt;
| [http://www.dragonagenexus.com/downloads/file.php?id=1617 Karma's Origins Companions]&lt;br /&gt;
|-&lt;br /&gt;
| 1000001-1001000&lt;br /&gt;
| [http://social.bioware.com/project/178/ Crown of Creation]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 1109197701 - 1109197750&lt;br /&gt;
| Schwinni - [http://dragonagenexus.com/downloads/file.php?id=1064 Helmets without wings and retints]&lt;br /&gt;
|-&lt;br /&gt;
| 1553521700 - 1553521750&lt;br /&gt;
| Alschemid - [http://social.bioware.com/project/3666/ Sandbox]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== ts_material ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| 1405261000 - 1405261999&lt;br /&gt;
| nezroy - [http://social.bioware.com/project/1834/ Warden Shields], [http://www.dragonagenexus.com/downloads/file.php?id=793 Leliana Item Set]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== TS_Category ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680005&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
| 1000001 - 1100000&lt;br /&gt;
| DA Workshop / by frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
| 7570000-7770000&lt;br /&gt;
| [World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== vfx_base ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000-38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680010&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
| 5680011 - 5680019&lt;br /&gt;
| BioSpirit's [http://social.bioware.com/project/1647/ Hilltop Under Siege]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== worldmaps (has to be less than 256) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 6'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| '''210 - 220'''&lt;br /&gt;
| [http://social.bioware.com/project/1845/ Blood and Lyrium]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Talk:Backgrounds_tutorial&amp;diff=16033</id>
		<title>Talk:Backgrounds tutorial</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Talk:Backgrounds_tutorial&amp;diff=16033"/>
				<updated>2011-03-29T03:28:08Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: /* Bugfixes and some comments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== Bugfixes and some comments ==&lt;br /&gt;
&lt;br /&gt;
The crashing because of the background description string ID is actually because of the UI and can be fixed by modders. In the chargen.gfx's ActionScript RaceGenderScene.GrabBackgrounds() static function, the following is what's causing the crash - basically using the StringID as an array index for the sole purpose of checking if that StringID has been seen yet, so this can be worked around to check it some way else - or just drop it if it's not strictly needed (Apparently it is, but see below the code). Incidentally, this is probably also why you need unique background description string IDs for each race for them to get properly enumerated.&lt;br /&gt;
&lt;br /&gt;
You *could* just constrain your string ID to a lower value given the other mentioned workaround, but wouldn't it be nice not to have to worry about bugs?&lt;br /&gt;
&lt;br /&gt;
'''This is the code causing the crash:'''&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
var aStringCheck = [];&lt;br /&gt;
// ...&lt;br /&gt;
// ... nested for-loops&lt;br /&gt;
       var bBackgroundAllowedByRace = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       var nDescStringID = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND_DESC, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       if (bBackgroundAllowedByRace == 1 &amp;amp;&amp;amp; aStringCheck[nDescStringID] == null)&lt;br /&gt;
       {&lt;br /&gt;
                    aStringCheck[nDescStringID] = nDescStringID;&lt;br /&gt;
&lt;br /&gt;
       }&lt;br /&gt;
// ... end nested for-loops&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The check *is* needed or else the background will show up active in the list of each race that possesses it. One simple workaround is use a dictionary instead of an array:&lt;br /&gt;
&lt;br /&gt;
'''This would seem to be a workaround:'''&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
var aStringCheck = {};&lt;br /&gt;
// ...&lt;br /&gt;
// ... nested for-loops&lt;br /&gt;
       var bBackgroundAllowedByRace = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       var nDescStringID = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND_DESC, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       if (bBackgroundAllowedByRace == 1 &amp;amp;&amp;amp; aStringCheck[&amp;quot;&amp;quot; + nDescStringID] == null)&lt;br /&gt;
       {&lt;br /&gt;
                    aStringCheck[&amp;quot;&amp;quot; + nDescStringID] = nDescStringID;&lt;br /&gt;
&lt;br /&gt;
       }&lt;br /&gt;
// ... end nested for-loops&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I think it should be possible to make it so you can share background descriptions, but that would require a bit more work.&lt;br /&gt;
&lt;br /&gt;
--[[User:FollowTheGourd|FollowTheGourd]] 02:44, 29 March 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
== When is an M2DA not like an M2DA? ==&lt;br /&gt;
When its rows are enumerated by the UI. Since the UI lacks a function to map a row to its M2DA ID, some of the M2DA files need to be treated as if they're actually just 2DAs. E.g, the classes and some backgrounds tables. E.g., if you had an M2DA with two rows, both with ID 0 and ID 5, then the UI only knows there are two rows, but doesn't know how to map the second row to ID 5. I.e., the UI sees this when trying to enumerate the rows of the M2DA file, but it's told there are only two rows by the functions available to it.&lt;br /&gt;
0 Data&lt;br /&gt;
1 (uninitialized)&lt;br /&gt;
2 (uninitialized)&lt;br /&gt;
3 (uninitialized)&lt;br /&gt;
4 (uninitialized)&lt;br /&gt;
5 Data&lt;br /&gt;
&lt;br /&gt;
Of course if there's a way to derive the row ID (by a prearranged formula or given by another M2DA cell's value), then the UI can use it just like a normal M2DA.&lt;br /&gt;
&lt;br /&gt;
--[[User:FollowTheGourd|FollowTheGourd]] 03:25, 29 March 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Is this correct? ==&lt;br /&gt;
&lt;br /&gt;
I have problems with this solution. I tried it twice now, once I tried to implement it into my module, the other time I did it exactly as written here. 1. The custom templates for the Backgrounds don't work (The character has no equipment, no matter what background I choose) with the scripts on this tutorial, although the changes work fine if I run RESOURCE_SCRIPT_MODULE_CORE 2. The race choice doesn't change the character (But that could be because the scripts are missing alot, it's not that important for test purposes) 3. The strings for the Background description don't work (Yes I have corrected them in the Toolset, because the ExcelProcessor can't handle that big numbers), they don't show up, when I'm clicking on the Backgrounds.&lt;br /&gt;
&lt;br /&gt;
I have not tested dialouge yet, but am I making something wrong? Or has this tutorial some errors? [[User:Nobody123456|Nobody123456]] 13:49, 26 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:I think you might be making some errors (although it is possible that there is some error or ommision in what I wrote). I tested the tutorial by running through it from scratch after I wrote it and my game worked fine. It is a very sensitive process though, so the slightest thing wrong can really throw you out. &lt;br /&gt;
&lt;br /&gt;
: The first thing I would suggest is to get the background description strings working because I know that can cause issues if you don't get it right. Try a new module and don't make any changes execpt for adding your own strings to the backgrounds and see if that works. Oh and be sure to export your talk table along with any other resources before you play. Actaully that's probably it - I should add that to the tutorial. [[User:Stuntpope|Stuntpope]] 15:01, 26 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:: I did export the string table, so that can't be it. I recreated it from scratch, now some equipment choices work, some don't. The race choices now works fine, but the strings still don't show up. I tested the background choices in a dialouge, and this works perfectly fine. I uploaded the module, so if you wanna take a quick look, that would be great. [http://www.megaupload.com/?d=CYHIVYJL Background Test Module] and if you want to install the module as an addin [http://www.megaupload.com/?d=2FILLQ5N DAZIP format] [[User:Nobody123456|Nobody123456]] 05:20, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:I notice your talk table is called strings.tlk. That seems strange to me, I didn't know you could rename tlk files but mine is called bg_demo_en-us, where bg_demo is what my module is called. so i would have expected yours to be bdm_2_en-us.tlk if you hadn't renamed it. You say that you are able to display strings in dialogue though so maybe that's not it. Another possibility is that this is another bug in the description strings. Your strings are a good million higher than mine - try using exctly the same string ID range that I used.&lt;br /&gt;
&lt;br /&gt;
:As for equipment - I didn't really spend any time looking at what equipment those templates start with. I just selected some that had the look I was going for in chargen, so the ones that are just dressed plainly and don't have weapons or anything are that way becasue that is what those templates are (I think i used those for the servants). To check that this is working go into the toolset and find those templates - compare them to what those characters have if you create them. If you want them to have equipment, simply create a new creature and give them whatever equipment you want, then use that template name in the GDA. Try and resolve your other issue first though before you try that. [[User:Stuntpope|Stuntpope]] 07:25, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:: It was indeed the table name. It was exportet that way, that's strange, but now the Strings work fine, thank you very much! [[User:Nobody123456|Nobody123456]] 07:52, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
::: I ran into this same problem which is a user error. Make sure you export the &amp;quot;talk table&amp;quot; and NOT &amp;quot;string table&amp;quot;. The export &amp;quot;string table&amp;quot; option appears on the export menu if you have the talk table open at the time. [[User:Deadrockstar|Deadrockstar]] 11:43, 8 December 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:Great to hear you got it working! [[User:Stuntpope|Stuntpope]] 08:14, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
==Why are the CHARGEN event scripts customised?==&lt;br /&gt;
&lt;br /&gt;
I managed to get my custom background working without customising the CHARGEN event scripts. In fact, I don't remember seeing those scripts, so maybe they were added later? At any rate, now we have a forum query about it. Can anyone explain why that customisation is proposed, and how the code differs from the Bioware script? That would help people to understand which lines they need to change to suit their own scenario. [[User:Proleric1|Proleric1]] 09:41, 7 January 2011 (UTC)&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Talk:Backgrounds_tutorial&amp;diff=16032</id>
		<title>Talk:Backgrounds tutorial</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Talk:Backgrounds_tutorial&amp;diff=16032"/>
				<updated>2011-03-29T03:27:26Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: /* what's the preview button do? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== Bugfixes and some comments ==&lt;br /&gt;
&lt;br /&gt;
The crashing because of the background description string ID is actually because of the UI and can be fixed by modders. In the chargen.gfx's ActionScript RaceGenderScene.GrabBackgrounds() static function, the following is what's causing the crash - basically using the StringID as an array index for the sole purpose of checking if that StringID has been seen yet, so this can be worked around to check it some way else - or just drop it if it's not strictly needed (Apparently it is, but see below the code). Incidentally, this is probably also why you need unique background description string IDs for each race for them to get properly enumerated.&lt;br /&gt;
&lt;br /&gt;
'''This is the code causing the crash:'''&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
var aStringCheck = [];&lt;br /&gt;
// ...&lt;br /&gt;
// ... nested for-loops&lt;br /&gt;
       var bBackgroundAllowedByRace = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       var nDescStringID = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND_DESC, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       if (bBackgroundAllowedByRace == 1 &amp;amp;&amp;amp; aStringCheck[nDescStringID] == null)&lt;br /&gt;
       {&lt;br /&gt;
                    aStringCheck[nDescStringID] = nDescStringID;&lt;br /&gt;
&lt;br /&gt;
       }&lt;br /&gt;
// ... end nested for-loops&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The check *is* needed or else the background will show up active in the list of each race that possesses it. One simple workaround is use a dictionary instead of an array:&lt;br /&gt;
&lt;br /&gt;
'''This would seem to be a workaround:'''&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
var aStringCheck = {};&lt;br /&gt;
// ...&lt;br /&gt;
// ... nested for-loops&lt;br /&gt;
       var bBackgroundAllowedByRace = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       var nDescStringID = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND_DESC, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       if (bBackgroundAllowedByRace == 1 &amp;amp;&amp;amp; aStringCheck[&amp;quot;&amp;quot; + nDescStringID] == null)&lt;br /&gt;
       {&lt;br /&gt;
                    aStringCheck[&amp;quot;&amp;quot; + nDescStringID] = nDescStringID;&lt;br /&gt;
&lt;br /&gt;
       }&lt;br /&gt;
// ... end nested for-loops&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I think it should be possible to make it so you can share background descriptions, but that would require a bit more work.&lt;br /&gt;
&lt;br /&gt;
--[[User:FollowTheGourd|FollowTheGourd]] 02:44, 29 March 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
== When is an M2DA not like an M2DA? ==&lt;br /&gt;
When its rows are enumerated by the UI. Since the UI lacks a function to map a row to its M2DA ID, some of the M2DA files need to be treated as if they're actually just 2DAs. E.g, the classes and some backgrounds tables. E.g., if you had an M2DA with two rows, both with ID 0 and ID 5, then the UI only knows there are two rows, but doesn't know how to map the second row to ID 5. I.e., the UI sees this when trying to enumerate the rows of the M2DA file, but it's told there are only two rows by the functions available to it.&lt;br /&gt;
0 Data&lt;br /&gt;
1 (uninitialized)&lt;br /&gt;
2 (uninitialized)&lt;br /&gt;
3 (uninitialized)&lt;br /&gt;
4 (uninitialized)&lt;br /&gt;
5 Data&lt;br /&gt;
&lt;br /&gt;
Of course if there's a way to derive the row ID (by a prearranged formula or given by another M2DA cell's value), then the UI can use it just like a normal M2DA.&lt;br /&gt;
&lt;br /&gt;
--[[User:FollowTheGourd|FollowTheGourd]] 03:25, 29 March 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Is this correct? ==&lt;br /&gt;
&lt;br /&gt;
I have problems with this solution. I tried it twice now, once I tried to implement it into my module, the other time I did it exactly as written here. 1. The custom templates for the Backgrounds don't work (The character has no equipment, no matter what background I choose) with the scripts on this tutorial, although the changes work fine if I run RESOURCE_SCRIPT_MODULE_CORE 2. The race choice doesn't change the character (But that could be because the scripts are missing alot, it's not that important for test purposes) 3. The strings for the Background description don't work (Yes I have corrected them in the Toolset, because the ExcelProcessor can't handle that big numbers), they don't show up, when I'm clicking on the Backgrounds.&lt;br /&gt;
&lt;br /&gt;
I have not tested dialouge yet, but am I making something wrong? Or has this tutorial some errors? [[User:Nobody123456|Nobody123456]] 13:49, 26 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:I think you might be making some errors (although it is possible that there is some error or ommision in what I wrote). I tested the tutorial by running through it from scratch after I wrote it and my game worked fine. It is a very sensitive process though, so the slightest thing wrong can really throw you out. &lt;br /&gt;
&lt;br /&gt;
: The first thing I would suggest is to get the background description strings working because I know that can cause issues if you don't get it right. Try a new module and don't make any changes execpt for adding your own strings to the backgrounds and see if that works. Oh and be sure to export your talk table along with any other resources before you play. Actaully that's probably it - I should add that to the tutorial. [[User:Stuntpope|Stuntpope]] 15:01, 26 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:: I did export the string table, so that can't be it. I recreated it from scratch, now some equipment choices work, some don't. The race choices now works fine, but the strings still don't show up. I tested the background choices in a dialouge, and this works perfectly fine. I uploaded the module, so if you wanna take a quick look, that would be great. [http://www.megaupload.com/?d=CYHIVYJL Background Test Module] and if you want to install the module as an addin [http://www.megaupload.com/?d=2FILLQ5N DAZIP format] [[User:Nobody123456|Nobody123456]] 05:20, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:I notice your talk table is called strings.tlk. That seems strange to me, I didn't know you could rename tlk files but mine is called bg_demo_en-us, where bg_demo is what my module is called. so i would have expected yours to be bdm_2_en-us.tlk if you hadn't renamed it. You say that you are able to display strings in dialogue though so maybe that's not it. Another possibility is that this is another bug in the description strings. Your strings are a good million higher than mine - try using exctly the same string ID range that I used.&lt;br /&gt;
&lt;br /&gt;
:As for equipment - I didn't really spend any time looking at what equipment those templates start with. I just selected some that had the look I was going for in chargen, so the ones that are just dressed plainly and don't have weapons or anything are that way becasue that is what those templates are (I think i used those for the servants). To check that this is working go into the toolset and find those templates - compare them to what those characters have if you create them. If you want them to have equipment, simply create a new creature and give them whatever equipment you want, then use that template name in the GDA. Try and resolve your other issue first though before you try that. [[User:Stuntpope|Stuntpope]] 07:25, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:: It was indeed the table name. It was exportet that way, that's strange, but now the Strings work fine, thank you very much! [[User:Nobody123456|Nobody123456]] 07:52, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
::: I ran into this same problem which is a user error. Make sure you export the &amp;quot;talk table&amp;quot; and NOT &amp;quot;string table&amp;quot;. The export &amp;quot;string table&amp;quot; option appears on the export menu if you have the talk table open at the time. [[User:Deadrockstar|Deadrockstar]] 11:43, 8 December 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:Great to hear you got it working! [[User:Stuntpope|Stuntpope]] 08:14, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
==Why are the CHARGEN event scripts customised?==&lt;br /&gt;
&lt;br /&gt;
I managed to get my custom background working without customising the CHARGEN event scripts. In fact, I don't remember seeing those scripts, so maybe they were added later? At any rate, now we have a forum query about it. Can anyone explain why that customisation is proposed, and how the code differs from the Bioware script? That would help people to understand which lines they need to change to suit their own scenario. [[User:Proleric1|Proleric1]] 09:41, 7 January 2011 (UTC)&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Talk:Backgrounds_tutorial&amp;diff=16031</id>
		<title>Talk:Backgrounds tutorial</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Talk:Backgrounds_tutorial&amp;diff=16031"/>
				<updated>2011-03-29T03:26:40Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: /* Bugfixes and some comments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== Bugfixes and some comments ==&lt;br /&gt;
&lt;br /&gt;
The crashing because of the background description string ID is actually because of the UI and can be fixed by modders. In the chargen.gfx's ActionScript RaceGenderScene.GrabBackgrounds() static function, the following is what's causing the crash - basically using the StringID as an array index for the sole purpose of checking if that StringID has been seen yet, so this can be worked around to check it some way else - or just drop it if it's not strictly needed (Apparently it is, but see below the code). Incidentally, this is probably also why you need unique background description string IDs for each race for them to get properly enumerated.&lt;br /&gt;
&lt;br /&gt;
'''This is the code causing the crash'''&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
var aStringCheck = [];&lt;br /&gt;
// ...&lt;br /&gt;
// ... nested for-loops&lt;br /&gt;
       var bBackgroundAllowedByRace = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       var nDescStringID = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND_DESC, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       if (bBackgroundAllowedByRace == 1 &amp;amp;&amp;amp; aStringCheck[nDescStringID] == null)&lt;br /&gt;
       {&lt;br /&gt;
                    aStringCheck[nDescStringID] = nDescStringID;&lt;br /&gt;
&lt;br /&gt;
       }&lt;br /&gt;
// ... end nested for-loops&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The check *is* needed or else the background will show up active in the list of each race that possesses it. One simple workaround is use a dictionary instead of an array:&lt;br /&gt;
'''This would seem to be a workaround'''&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
var aStringCheck = {};&lt;br /&gt;
// ...&lt;br /&gt;
// ... nested for-loops&lt;br /&gt;
       var bBackgroundAllowedByRace = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       var nDescStringID = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND_DESC, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       if (bBackgroundAllowedByRace == 1 &amp;amp;&amp;amp; aStringCheck[&amp;quot;&amp;quot; + nDescStringID] == null)&lt;br /&gt;
       {&lt;br /&gt;
                    aStringCheck[&amp;quot;&amp;quot; + nDescStringID] = nDescStringID;&lt;br /&gt;
&lt;br /&gt;
       }&lt;br /&gt;
// ... end nested for-loops&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I think it should be possible to make it so you can share background descriptions, but that would require a bit more work.&lt;br /&gt;
&lt;br /&gt;
--[[User:FollowTheGourd|FollowTheGourd]] 02:44, 29 March 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
== When is an M2DA not like an M2DA? ==&lt;br /&gt;
When its rows are enumerated by the UI. Since the UI lacks a function to map a row to its M2DA ID, some of the M2DA files need to be treated as if they're actually just 2DAs. E.g, the classes and some backgrounds tables. E.g., if you had an M2DA with two rows, both with ID 0 and ID 5, then the UI only knows there are two rows, but doesn't know how to map the second row to ID 5. I.e., the UI sees this when trying to enumerate the rows of the M2DA file, but it's told there are only two rows by the functions available to it.&lt;br /&gt;
0 Data&lt;br /&gt;
1 (uninitialized)&lt;br /&gt;
2 (uninitialized)&lt;br /&gt;
3 (uninitialized)&lt;br /&gt;
4 (uninitialized)&lt;br /&gt;
5 Data&lt;br /&gt;
&lt;br /&gt;
Of course if there's a way to derive the row ID (by a prearranged formula or given by another M2DA cell's value), then the UI can use it just like a normal M2DA.&lt;br /&gt;
&lt;br /&gt;
--[[User:FollowTheGourd|FollowTheGourd]] 03:25, 29 March 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Is this correct? ==&lt;br /&gt;
&lt;br /&gt;
I have problems with this solution. I tried it twice now, once I tried to implement it into my module, the other time I did it exactly as written here. 1. The custom templates for the Backgrounds don't work (The character has no equipment, no matter what background I choose) with the scripts on this tutorial, although the changes work fine if I run RESOURCE_SCRIPT_MODULE_CORE 2. The race choice doesn't change the character (But that could be because the scripts are missing alot, it's not that important for test purposes) 3. The strings for the Background description don't work (Yes I have corrected them in the Toolset, because the ExcelProcessor can't handle that big numbers), they don't show up, when I'm clicking on the Backgrounds.&lt;br /&gt;
&lt;br /&gt;
I have not tested dialouge yet, but am I making something wrong? Or has this tutorial some errors? [[User:Nobody123456|Nobody123456]] 13:49, 26 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:I think you might be making some errors (although it is possible that there is some error or ommision in what I wrote). I tested the tutorial by running through it from scratch after I wrote it and my game worked fine. It is a very sensitive process though, so the slightest thing wrong can really throw you out. &lt;br /&gt;
&lt;br /&gt;
: The first thing I would suggest is to get the background description strings working because I know that can cause issues if you don't get it right. Try a new module and don't make any changes execpt for adding your own strings to the backgrounds and see if that works. Oh and be sure to export your talk table along with any other resources before you play. Actaully that's probably it - I should add that to the tutorial. [[User:Stuntpope|Stuntpope]] 15:01, 26 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:: I did export the string table, so that can't be it. I recreated it from scratch, now some equipment choices work, some don't. The race choices now works fine, but the strings still don't show up. I tested the background choices in a dialouge, and this works perfectly fine. I uploaded the module, so if you wanna take a quick look, that would be great. [http://www.megaupload.com/?d=CYHIVYJL Background Test Module] and if you want to install the module as an addin [http://www.megaupload.com/?d=2FILLQ5N DAZIP format] [[User:Nobody123456|Nobody123456]] 05:20, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:I notice your talk table is called strings.tlk. That seems strange to me, I didn't know you could rename tlk files but mine is called bg_demo_en-us, where bg_demo is what my module is called. so i would have expected yours to be bdm_2_en-us.tlk if you hadn't renamed it. You say that you are able to display strings in dialogue though so maybe that's not it. Another possibility is that this is another bug in the description strings. Your strings are a good million higher than mine - try using exctly the same string ID range that I used.&lt;br /&gt;
&lt;br /&gt;
:As for equipment - I didn't really spend any time looking at what equipment those templates start with. I just selected some that had the look I was going for in chargen, so the ones that are just dressed plainly and don't have weapons or anything are that way becasue that is what those templates are (I think i used those for the servants). To check that this is working go into the toolset and find those templates - compare them to what those characters have if you create them. If you want them to have equipment, simply create a new creature and give them whatever equipment you want, then use that template name in the GDA. Try and resolve your other issue first though before you try that. [[User:Stuntpope|Stuntpope]] 07:25, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:: It was indeed the table name. It was exportet that way, that's strange, but now the Strings work fine, thank you very much! [[User:Nobody123456|Nobody123456]] 07:52, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
::: I ran into this same problem which is a user error. Make sure you export the &amp;quot;talk table&amp;quot; and NOT &amp;quot;string table&amp;quot;. The export &amp;quot;string table&amp;quot; option appears on the export menu if you have the talk table open at the time. [[User:Deadrockstar|Deadrockstar]] 11:43, 8 December 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:Great to hear you got it working! [[User:Stuntpope|Stuntpope]] 08:14, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
==Why are the CHARGEN event scripts customised?==&lt;br /&gt;
&lt;br /&gt;
I managed to get my custom background working without customising the CHARGEN event scripts. In fact, I don't remember seeing those scripts, so maybe they were added later? At any rate, now we have a forum query about it. Can anyone explain why that customisation is proposed, and how the code differs from the Bioware script? That would help people to understand which lines they need to change to suit their own scenario. [[User:Proleric1|Proleric1]] 09:41, 7 January 2011 (UTC)&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Talk:Backgrounds_tutorial&amp;diff=16030</id>
		<title>Talk:Backgrounds tutorial</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Talk:Backgrounds_tutorial&amp;diff=16030"/>
				<updated>2011-03-29T03:25:23Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: /* When is an M2DA not like an M2DA? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== Bugfixes and some comments ==&lt;br /&gt;
&lt;br /&gt;
The crashing because of the background description string ID is actually because of the UI and can be fixed by modders. In the chargen.gfx's ActionScript RaceGenderScene.GrabBackgrounds() static function, the following is what's causing the crash - basically using the StringID as an array index for the sole purpose of checking if that StringID has been seen yet, so this can be worked around to check it some way else - or just drop it if it's not strictly needed (Apparently it is, but see below the code). Incidentally, this is probably also why you need unique background description string IDs for each race for them to get properly enumerated.&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
var aStringCheck = [];&lt;br /&gt;
// ...&lt;br /&gt;
// ... nested for-loops&lt;br /&gt;
       var bBackgroundAllowedByRace = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       var nDescStringID = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND_DESC, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       if (bBackgroundAllowedByRace == 1 &amp;amp;&amp;amp; aStringCheck[nDescStringID] == null)&lt;br /&gt;
       {&lt;br /&gt;
                    aStringCheck[nDescStringID] = nDescStringID;&lt;br /&gt;
&lt;br /&gt;
       }&lt;br /&gt;
// ... end nested for-loops&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The check *is* needed or else the background will show up active in the list of each race that possesses it. One simple workaround is use a dictionary instead of an array:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
var aStringCheck = {};&lt;br /&gt;
// ...&lt;br /&gt;
// ... nested for-loops&lt;br /&gt;
       var bBackgroundAllowedByRace = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       var nDescStringID = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND_DESC, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       if (bBackgroundAllowedByRace == 1 &amp;amp;&amp;amp; aStringCheck[&amp;quot;&amp;quot; + nDescStringID] == null)&lt;br /&gt;
       {&lt;br /&gt;
                    aStringCheck[&amp;quot;&amp;quot; + nDescStringID] = nDescStringID;&lt;br /&gt;
&lt;br /&gt;
       }&lt;br /&gt;
// ... end nested for-loops&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I think it should be possible to make it so you can share background descriptions, but that would require a bit more work.&lt;br /&gt;
&lt;br /&gt;
--[[User:FollowTheGourd|FollowTheGourd]] 02:44, 29 March 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
== When is an M2DA not like an M2DA? ==&lt;br /&gt;
When its rows are enumerated by the UI. Since the UI lacks a function to map a row to its M2DA ID, some of the M2DA files need to be treated as if they're actually just 2DAs. E.g, the classes and some backgrounds tables. E.g., if you had an M2DA with two rows, both with ID 0 and ID 5, then the UI only knows there are two rows, but doesn't know how to map the second row to ID 5. I.e., the UI sees this when trying to enumerate the rows of the M2DA file, but it's told there are only two rows by the functions available to it.&lt;br /&gt;
0 Data&lt;br /&gt;
1 (uninitialized)&lt;br /&gt;
2 (uninitialized)&lt;br /&gt;
3 (uninitialized)&lt;br /&gt;
4 (uninitialized)&lt;br /&gt;
5 Data&lt;br /&gt;
&lt;br /&gt;
Of course if there's a way to derive the row ID (by a prearranged formula or given by another M2DA cell's value), then the UI can use it just like a normal M2DA.&lt;br /&gt;
&lt;br /&gt;
--[[User:FollowTheGourd|FollowTheGourd]] 03:25, 29 March 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Is this correct? ==&lt;br /&gt;
&lt;br /&gt;
I have problems with this solution. I tried it twice now, once I tried to implement it into my module, the other time I did it exactly as written here. 1. The custom templates for the Backgrounds don't work (The character has no equipment, no matter what background I choose) with the scripts on this tutorial, although the changes work fine if I run RESOURCE_SCRIPT_MODULE_CORE 2. The race choice doesn't change the character (But that could be because the scripts are missing alot, it's not that important for test purposes) 3. The strings for the Background description don't work (Yes I have corrected them in the Toolset, because the ExcelProcessor can't handle that big numbers), they don't show up, when I'm clicking on the Backgrounds.&lt;br /&gt;
&lt;br /&gt;
I have not tested dialouge yet, but am I making something wrong? Or has this tutorial some errors? [[User:Nobody123456|Nobody123456]] 13:49, 26 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:I think you might be making some errors (although it is possible that there is some error or ommision in what I wrote). I tested the tutorial by running through it from scratch after I wrote it and my game worked fine. It is a very sensitive process though, so the slightest thing wrong can really throw you out. &lt;br /&gt;
&lt;br /&gt;
: The first thing I would suggest is to get the background description strings working because I know that can cause issues if you don't get it right. Try a new module and don't make any changes execpt for adding your own strings to the backgrounds and see if that works. Oh and be sure to export your talk table along with any other resources before you play. Actaully that's probably it - I should add that to the tutorial. [[User:Stuntpope|Stuntpope]] 15:01, 26 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:: I did export the string table, so that can't be it. I recreated it from scratch, now some equipment choices work, some don't. The race choices now works fine, but the strings still don't show up. I tested the background choices in a dialouge, and this works perfectly fine. I uploaded the module, so if you wanna take a quick look, that would be great. [http://www.megaupload.com/?d=CYHIVYJL Background Test Module] and if you want to install the module as an addin [http://www.megaupload.com/?d=2FILLQ5N DAZIP format] [[User:Nobody123456|Nobody123456]] 05:20, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:I notice your talk table is called strings.tlk. That seems strange to me, I didn't know you could rename tlk files but mine is called bg_demo_en-us, where bg_demo is what my module is called. so i would have expected yours to be bdm_2_en-us.tlk if you hadn't renamed it. You say that you are able to display strings in dialogue though so maybe that's not it. Another possibility is that this is another bug in the description strings. Your strings are a good million higher than mine - try using exctly the same string ID range that I used.&lt;br /&gt;
&lt;br /&gt;
:As for equipment - I didn't really spend any time looking at what equipment those templates start with. I just selected some that had the look I was going for in chargen, so the ones that are just dressed plainly and don't have weapons or anything are that way becasue that is what those templates are (I think i used those for the servants). To check that this is working go into the toolset and find those templates - compare them to what those characters have if you create them. If you want them to have equipment, simply create a new creature and give them whatever equipment you want, then use that template name in the GDA. Try and resolve your other issue first though before you try that. [[User:Stuntpope|Stuntpope]] 07:25, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:: It was indeed the table name. It was exportet that way, that's strange, but now the Strings work fine, thank you very much! [[User:Nobody123456|Nobody123456]] 07:52, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
::: I ran into this same problem which is a user error. Make sure you export the &amp;quot;talk table&amp;quot; and NOT &amp;quot;string table&amp;quot;. The export &amp;quot;string table&amp;quot; option appears on the export menu if you have the talk table open at the time. [[User:Deadrockstar|Deadrockstar]] 11:43, 8 December 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:Great to hear you got it working! [[User:Stuntpope|Stuntpope]] 08:14, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
==Why are the CHARGEN event scripts customised?==&lt;br /&gt;
&lt;br /&gt;
I managed to get my custom background working without customising the CHARGEN event scripts. In fact, I don't remember seeing those scripts, so maybe they were added later? At any rate, now we have a forum query about it. Can anyone explain why that customisation is proposed, and how the code differs from the Bioware script? That would help people to understand which lines they need to change to suit their own scenario. [[User:Proleric1|Proleric1]] 09:41, 7 January 2011 (UTC)&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Talk:Backgrounds_tutorial&amp;diff=16029</id>
		<title>Talk:Backgrounds tutorial</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Talk:Backgrounds_tutorial&amp;diff=16029"/>
				<updated>2011-03-29T03:25:04Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: /* When is an M2DA not like an M2DA? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== Bugfixes and some comments ==&lt;br /&gt;
&lt;br /&gt;
The crashing because of the background description string ID is actually because of the UI and can be fixed by modders. In the chargen.gfx's ActionScript RaceGenderScene.GrabBackgrounds() static function, the following is what's causing the crash - basically using the StringID as an array index for the sole purpose of checking if that StringID has been seen yet, so this can be worked around to check it some way else - or just drop it if it's not strictly needed (Apparently it is, but see below the code). Incidentally, this is probably also why you need unique background description string IDs for each race for them to get properly enumerated.&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
var aStringCheck = [];&lt;br /&gt;
// ...&lt;br /&gt;
// ... nested for-loops&lt;br /&gt;
       var bBackgroundAllowedByRace = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       var nDescStringID = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND_DESC, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       if (bBackgroundAllowedByRace == 1 &amp;amp;&amp;amp; aStringCheck[nDescStringID] == null)&lt;br /&gt;
       {&lt;br /&gt;
                    aStringCheck[nDescStringID] = nDescStringID;&lt;br /&gt;
&lt;br /&gt;
       }&lt;br /&gt;
// ... end nested for-loops&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The check *is* needed or else the background will show up active in the list of each race that possesses it. One simple workaround is use a dictionary instead of an array:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
var aStringCheck = {};&lt;br /&gt;
// ...&lt;br /&gt;
// ... nested for-loops&lt;br /&gt;
       var bBackgroundAllowedByRace = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       var nDescStringID = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND_DESC, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       if (bBackgroundAllowedByRace == 1 &amp;amp;&amp;amp; aStringCheck[&amp;quot;&amp;quot; + nDescStringID] == null)&lt;br /&gt;
       {&lt;br /&gt;
                    aStringCheck[&amp;quot;&amp;quot; + nDescStringID] = nDescStringID;&lt;br /&gt;
&lt;br /&gt;
       }&lt;br /&gt;
// ... end nested for-loops&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I think it should be possible to make it so you can share background descriptions, but that would require a bit more work.&lt;br /&gt;
&lt;br /&gt;
--[[User:FollowTheGourd|FollowTheGourd]] 02:44, 29 March 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
== When is an M2DA not like an M2DA? ==&lt;br /&gt;
When its rows are enumerated by the UI. Since the UI lacks a function to map a row to its M2DA ID, some of the M2DA files need to be treated as if they're actually just 2DAs. E.g, the classes and some backgrounds tables. E.g., if you had an M2DA with two rows, both with ID 0 and ID 5, then the UI only knows there are two rows, but doesn't know how to map the second row to ID 5. I.e., the UI sees this when trying to enumerate the rows of the M2DA file, but it's told there are only two rows by the functions available to it.&lt;br /&gt;
0 Data&lt;br /&gt;
1 (uninitialized)&lt;br /&gt;
2 (uninitialized)&lt;br /&gt;
3 (uninitialized)&lt;br /&gt;
4 (uninitialized)&lt;br /&gt;
5 Data&lt;br /&gt;
&lt;br /&gt;
Of course if there's a way to derive the row ID (by a prearranged formula or given by another M2DA cell's value), then the UI can use it just like a normal M2DA.&lt;br /&gt;
&lt;br /&gt;
== Is this correct? ==&lt;br /&gt;
&lt;br /&gt;
I have problems with this solution. I tried it twice now, once I tried to implement it into my module, the other time I did it exactly as written here. 1. The custom templates for the Backgrounds don't work (The character has no equipment, no matter what background I choose) with the scripts on this tutorial, although the changes work fine if I run RESOURCE_SCRIPT_MODULE_CORE 2. The race choice doesn't change the character (But that could be because the scripts are missing alot, it's not that important for test purposes) 3. The strings for the Background description don't work (Yes I have corrected them in the Toolset, because the ExcelProcessor can't handle that big numbers), they don't show up, when I'm clicking on the Backgrounds.&lt;br /&gt;
&lt;br /&gt;
I have not tested dialouge yet, but am I making something wrong? Or has this tutorial some errors? [[User:Nobody123456|Nobody123456]] 13:49, 26 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:I think you might be making some errors (although it is possible that there is some error or ommision in what I wrote). I tested the tutorial by running through it from scratch after I wrote it and my game worked fine. It is a very sensitive process though, so the slightest thing wrong can really throw you out. &lt;br /&gt;
&lt;br /&gt;
: The first thing I would suggest is to get the background description strings working because I know that can cause issues if you don't get it right. Try a new module and don't make any changes execpt for adding your own strings to the backgrounds and see if that works. Oh and be sure to export your talk table along with any other resources before you play. Actaully that's probably it - I should add that to the tutorial. [[User:Stuntpope|Stuntpope]] 15:01, 26 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:: I did export the string table, so that can't be it. I recreated it from scratch, now some equipment choices work, some don't. The race choices now works fine, but the strings still don't show up. I tested the background choices in a dialouge, and this works perfectly fine. I uploaded the module, so if you wanna take a quick look, that would be great. [http://www.megaupload.com/?d=CYHIVYJL Background Test Module] and if you want to install the module as an addin [http://www.megaupload.com/?d=2FILLQ5N DAZIP format] [[User:Nobody123456|Nobody123456]] 05:20, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:I notice your talk table is called strings.tlk. That seems strange to me, I didn't know you could rename tlk files but mine is called bg_demo_en-us, where bg_demo is what my module is called. so i would have expected yours to be bdm_2_en-us.tlk if you hadn't renamed it. You say that you are able to display strings in dialogue though so maybe that's not it. Another possibility is that this is another bug in the description strings. Your strings are a good million higher than mine - try using exctly the same string ID range that I used.&lt;br /&gt;
&lt;br /&gt;
:As for equipment - I didn't really spend any time looking at what equipment those templates start with. I just selected some that had the look I was going for in chargen, so the ones that are just dressed plainly and don't have weapons or anything are that way becasue that is what those templates are (I think i used those for the servants). To check that this is working go into the toolset and find those templates - compare them to what those characters have if you create them. If you want them to have equipment, simply create a new creature and give them whatever equipment you want, then use that template name in the GDA. Try and resolve your other issue first though before you try that. [[User:Stuntpope|Stuntpope]] 07:25, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:: It was indeed the table name. It was exportet that way, that's strange, but now the Strings work fine, thank you very much! [[User:Nobody123456|Nobody123456]] 07:52, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
::: I ran into this same problem which is a user error. Make sure you export the &amp;quot;talk table&amp;quot; and NOT &amp;quot;string table&amp;quot;. The export &amp;quot;string table&amp;quot; option appears on the export menu if you have the talk table open at the time. [[User:Deadrockstar|Deadrockstar]] 11:43, 8 December 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:Great to hear you got it working! [[User:Stuntpope|Stuntpope]] 08:14, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
==Why are the CHARGEN event scripts customised?==&lt;br /&gt;
&lt;br /&gt;
I managed to get my custom background working without customising the CHARGEN event scripts. In fact, I don't remember seeing those scripts, so maybe they were added later? At any rate, now we have a forum query about it. Can anyone explain why that customisation is proposed, and how the code differs from the Bioware script? That would help people to understand which lines they need to change to suit their own scenario. [[User:Proleric1|Proleric1]] 09:41, 7 January 2011 (UTC)&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Talk:Backgrounds_tutorial&amp;diff=16028</id>
		<title>Talk:Backgrounds tutorial</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Talk:Backgrounds_tutorial&amp;diff=16028"/>
				<updated>2011-03-29T03:24:01Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: /* Bugfixes and some comments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== Bugfixes and some comments ==&lt;br /&gt;
&lt;br /&gt;
The crashing because of the background description string ID is actually because of the UI and can be fixed by modders. In the chargen.gfx's ActionScript RaceGenderScene.GrabBackgrounds() static function, the following is what's causing the crash - basically using the StringID as an array index for the sole purpose of checking if that StringID has been seen yet, so this can be worked around to check it some way else - or just drop it if it's not strictly needed (Apparently it is, but see below the code). Incidentally, this is probably also why you need unique background description string IDs for each race for them to get properly enumerated.&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
var aStringCheck = [];&lt;br /&gt;
// ...&lt;br /&gt;
// ... nested for-loops&lt;br /&gt;
       var bBackgroundAllowedByRace = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       var nDescStringID = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND_DESC, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       if (bBackgroundAllowedByRace == 1 &amp;amp;&amp;amp; aStringCheck[nDescStringID] == null)&lt;br /&gt;
       {&lt;br /&gt;
                    aStringCheck[nDescStringID] = nDescStringID;&lt;br /&gt;
&lt;br /&gt;
       }&lt;br /&gt;
// ... end nested for-loops&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The check *is* needed or else the background will show up active in the list of each race that possesses it. One simple workaround is use a dictionary instead of an array:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
var aStringCheck = {};&lt;br /&gt;
// ...&lt;br /&gt;
// ... nested for-loops&lt;br /&gt;
       var bBackgroundAllowedByRace = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       var nDescStringID = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND_DESC, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       if (bBackgroundAllowedByRace == 1 &amp;amp;&amp;amp; aStringCheck[&amp;quot;&amp;quot; + nDescStringID] == null)&lt;br /&gt;
       {&lt;br /&gt;
                    aStringCheck[&amp;quot;&amp;quot; + nDescStringID] = nDescStringID;&lt;br /&gt;
&lt;br /&gt;
       }&lt;br /&gt;
// ... end nested for-loops&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I think it should be possible to make it so you can share background descriptions, but that would require a bit more work.&lt;br /&gt;
&lt;br /&gt;
--[[User:FollowTheGourd|FollowTheGourd]] 02:44, 29 March 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
== When is an M2DA not like an M2DA? ==&lt;br /&gt;
When its rows are enumerated by the UI. Since the UI lacks a function to map a row to its M2DA ID, some of the M2DA files need to be treated as if they're actually just 2DAs. E.g, the classes and some backgrounds tables. E.g., if you had an M2DA with two rows, both with ID 0 and ID 5, then the UI only knows there are two rows, but doesn't know how to map the second row to ID 5. I.e., the UI sees this when trying to enumerate the rows of the M2DA file, but it's told there are only two rows by the functions available to it.&lt;br /&gt;
0 Data&lt;br /&gt;
1 (uninitialized)&lt;br /&gt;
2 (uninitialized)&lt;br /&gt;
3 (uninitialized)&lt;br /&gt;
4 (uninitialized)&lt;br /&gt;
5 Data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Of course if there's a way to derive the row ID, then the UI can use it just like a normal M2DA.&lt;br /&gt;
&lt;br /&gt;
== Is this correct? ==&lt;br /&gt;
&lt;br /&gt;
I have problems with this solution. I tried it twice now, once I tried to implement it into my module, the other time I did it exactly as written here. 1. The custom templates for the Backgrounds don't work (The character has no equipment, no matter what background I choose) with the scripts on this tutorial, although the changes work fine if I run RESOURCE_SCRIPT_MODULE_CORE 2. The race choice doesn't change the character (But that could be because the scripts are missing alot, it's not that important for test purposes) 3. The strings for the Background description don't work (Yes I have corrected them in the Toolset, because the ExcelProcessor can't handle that big numbers), they don't show up, when I'm clicking on the Backgrounds.&lt;br /&gt;
&lt;br /&gt;
I have not tested dialouge yet, but am I making something wrong? Or has this tutorial some errors? [[User:Nobody123456|Nobody123456]] 13:49, 26 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:I think you might be making some errors (although it is possible that there is some error or ommision in what I wrote). I tested the tutorial by running through it from scratch after I wrote it and my game worked fine. It is a very sensitive process though, so the slightest thing wrong can really throw you out. &lt;br /&gt;
&lt;br /&gt;
: The first thing I would suggest is to get the background description strings working because I know that can cause issues if you don't get it right. Try a new module and don't make any changes execpt for adding your own strings to the backgrounds and see if that works. Oh and be sure to export your talk table along with any other resources before you play. Actaully that's probably it - I should add that to the tutorial. [[User:Stuntpope|Stuntpope]] 15:01, 26 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:: I did export the string table, so that can't be it. I recreated it from scratch, now some equipment choices work, some don't. The race choices now works fine, but the strings still don't show up. I tested the background choices in a dialouge, and this works perfectly fine. I uploaded the module, so if you wanna take a quick look, that would be great. [http://www.megaupload.com/?d=CYHIVYJL Background Test Module] and if you want to install the module as an addin [http://www.megaupload.com/?d=2FILLQ5N DAZIP format] [[User:Nobody123456|Nobody123456]] 05:20, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:I notice your talk table is called strings.tlk. That seems strange to me, I didn't know you could rename tlk files but mine is called bg_demo_en-us, where bg_demo is what my module is called. so i would have expected yours to be bdm_2_en-us.tlk if you hadn't renamed it. You say that you are able to display strings in dialogue though so maybe that's not it. Another possibility is that this is another bug in the description strings. Your strings are a good million higher than mine - try using exctly the same string ID range that I used.&lt;br /&gt;
&lt;br /&gt;
:As for equipment - I didn't really spend any time looking at what equipment those templates start with. I just selected some that had the look I was going for in chargen, so the ones that are just dressed plainly and don't have weapons or anything are that way becasue that is what those templates are (I think i used those for the servants). To check that this is working go into the toolset and find those templates - compare them to what those characters have if you create them. If you want them to have equipment, simply create a new creature and give them whatever equipment you want, then use that template name in the GDA. Try and resolve your other issue first though before you try that. [[User:Stuntpope|Stuntpope]] 07:25, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:: It was indeed the table name. It was exportet that way, that's strange, but now the Strings work fine, thank you very much! [[User:Nobody123456|Nobody123456]] 07:52, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
::: I ran into this same problem which is a user error. Make sure you export the &amp;quot;talk table&amp;quot; and NOT &amp;quot;string table&amp;quot;. The export &amp;quot;string table&amp;quot; option appears on the export menu if you have the talk table open at the time. [[User:Deadrockstar|Deadrockstar]] 11:43, 8 December 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:Great to hear you got it working! [[User:Stuntpope|Stuntpope]] 08:14, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
==Why are the CHARGEN event scripts customised?==&lt;br /&gt;
&lt;br /&gt;
I managed to get my custom background working without customising the CHARGEN event scripts. In fact, I don't remember seeing those scripts, so maybe they were added later? At any rate, now we have a forum query about it. Can anyone explain why that customisation is proposed, and how the code differs from the Bioware script? That would help people to understand which lines they need to change to suit their own scenario. [[User:Proleric1|Proleric1]] 09:41, 7 January 2011 (UTC)&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Talk:Backgrounds_tutorial&amp;diff=16027</id>
		<title>Talk:Backgrounds tutorial</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Talk:Backgrounds_tutorial&amp;diff=16027"/>
				<updated>2011-03-29T03:23:00Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: /* Bugfixes and some comments */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== Bugfixes and some comments ==&lt;br /&gt;
&lt;br /&gt;
The crashing because of the background description string ID is actually because of the UI and can be fixed by modders. In the chargen.gfx's ActionScript RaceGenderScene.GrabBackgrounds() static function, the following is what's causing the crash - basically using the StringID as an array index for the sole purpose of checking if that StringID has been seen yet, so this can be worked around to check it some way else - or just drop it if it's not strictly needed (Apparently it is, but see below the code). Incidentally, this is probably also why you need unique background description string IDs for each race for them to get properly enumerated.&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
var aStringCheck = [];&lt;br /&gt;
// ...&lt;br /&gt;
// ... nested 'for-loop's&lt;br /&gt;
       var bBackgroundAllowedByRace = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       var nDescStringID = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND_DESC, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       if (bBackgroundAllowedByRace == 1 &amp;amp;&amp;amp; aStringCheck[nDescStringID] == null)&lt;br /&gt;
       {&lt;br /&gt;
                    aStringCheck[nDescStringID] = nDescStringID;&lt;br /&gt;
&lt;br /&gt;
       }&lt;br /&gt;
// ... end nested 'for-loop's&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The check *is* needed or else the background will show up active in the list of each race that possesses it. One simple workaround is use a dictionary instead of an array:&lt;br /&gt;
var aStringCheck = {};&lt;br /&gt;
// ...&lt;br /&gt;
// ... nested 'for-loop's&lt;br /&gt;
       var bBackgroundAllowedByRace = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       var nDescStringID = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND_DESC, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       if (bBackgroundAllowedByRace == 1 &amp;amp;&amp;amp; aStringCheck[&amp;quot;&amp;quot; + nDescStringID] == null)&lt;br /&gt;
       {&lt;br /&gt;
                    aStringCheck[&amp;quot;&amp;quot; + nDescStringID] = nDescStringID;&lt;br /&gt;
&lt;br /&gt;
       }&lt;br /&gt;
// ... end nested 'for-loop's&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I think it should be possible to make it so you can share background descriptions, but that would require a bit more work.&lt;br /&gt;
&lt;br /&gt;
--[[User:FollowTheGourd|FollowTheGourd]] 02:44, 29 March 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
== When is an M2DA not like an M2DA? ==&lt;br /&gt;
When its rows are enumerated by the UI. Since the UI lacks a function to map a row to its M2DA ID, some of the M2DA files need to be treated as if they're actually just 2DAs. E.g, the classes and some backgrounds tables. E.g., if you had an M2DA with two rows, both with ID 0 and ID 5, then the UI only knows there are two rows, but doesn't know how to map the second row to ID 5. I.e., the UI sees this when trying to enumerate the rows of the M2DA file, but it's told there are only two rows by the functions available to it.&lt;br /&gt;
0 Data&lt;br /&gt;
1 (uninitialized)&lt;br /&gt;
2 (uninitialized)&lt;br /&gt;
3 (uninitialized)&lt;br /&gt;
4 (uninitialized)&lt;br /&gt;
5 Data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Of course if there's a way to derive the row ID, then the UI can use it just like a normal M2DA.&lt;br /&gt;
&lt;br /&gt;
== Is this correct? ==&lt;br /&gt;
&lt;br /&gt;
I have problems with this solution. I tried it twice now, once I tried to implement it into my module, the other time I did it exactly as written here. 1. The custom templates for the Backgrounds don't work (The character has no equipment, no matter what background I choose) with the scripts on this tutorial, although the changes work fine if I run RESOURCE_SCRIPT_MODULE_CORE 2. The race choice doesn't change the character (But that could be because the scripts are missing alot, it's not that important for test purposes) 3. The strings for the Background description don't work (Yes I have corrected them in the Toolset, because the ExcelProcessor can't handle that big numbers), they don't show up, when I'm clicking on the Backgrounds.&lt;br /&gt;
&lt;br /&gt;
I have not tested dialouge yet, but am I making something wrong? Or has this tutorial some errors? [[User:Nobody123456|Nobody123456]] 13:49, 26 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:I think you might be making some errors (although it is possible that there is some error or ommision in what I wrote). I tested the tutorial by running through it from scratch after I wrote it and my game worked fine. It is a very sensitive process though, so the slightest thing wrong can really throw you out. &lt;br /&gt;
&lt;br /&gt;
: The first thing I would suggest is to get the background description strings working because I know that can cause issues if you don't get it right. Try a new module and don't make any changes execpt for adding your own strings to the backgrounds and see if that works. Oh and be sure to export your talk table along with any other resources before you play. Actaully that's probably it - I should add that to the tutorial. [[User:Stuntpope|Stuntpope]] 15:01, 26 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:: I did export the string table, so that can't be it. I recreated it from scratch, now some equipment choices work, some don't. The race choices now works fine, but the strings still don't show up. I tested the background choices in a dialouge, and this works perfectly fine. I uploaded the module, so if you wanna take a quick look, that would be great. [http://www.megaupload.com/?d=CYHIVYJL Background Test Module] and if you want to install the module as an addin [http://www.megaupload.com/?d=2FILLQ5N DAZIP format] [[User:Nobody123456|Nobody123456]] 05:20, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:I notice your talk table is called strings.tlk. That seems strange to me, I didn't know you could rename tlk files but mine is called bg_demo_en-us, where bg_demo is what my module is called. so i would have expected yours to be bdm_2_en-us.tlk if you hadn't renamed it. You say that you are able to display strings in dialogue though so maybe that's not it. Another possibility is that this is another bug in the description strings. Your strings are a good million higher than mine - try using exctly the same string ID range that I used.&lt;br /&gt;
&lt;br /&gt;
:As for equipment - I didn't really spend any time looking at what equipment those templates start with. I just selected some that had the look I was going for in chargen, so the ones that are just dressed plainly and don't have weapons or anything are that way becasue that is what those templates are (I think i used those for the servants). To check that this is working go into the toolset and find those templates - compare them to what those characters have if you create them. If you want them to have equipment, simply create a new creature and give them whatever equipment you want, then use that template name in the GDA. Try and resolve your other issue first though before you try that. [[User:Stuntpope|Stuntpope]] 07:25, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:: It was indeed the table name. It was exportet that way, that's strange, but now the Strings work fine, thank you very much! [[User:Nobody123456|Nobody123456]] 07:52, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
::: I ran into this same problem which is a user error. Make sure you export the &amp;quot;talk table&amp;quot; and NOT &amp;quot;string table&amp;quot;. The export &amp;quot;string table&amp;quot; option appears on the export menu if you have the talk table open at the time. [[User:Deadrockstar|Deadrockstar]] 11:43, 8 December 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:Great to hear you got it working! [[User:Stuntpope|Stuntpope]] 08:14, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
==Why are the CHARGEN event scripts customised?==&lt;br /&gt;
&lt;br /&gt;
I managed to get my custom background working without customising the CHARGEN event scripts. In fact, I don't remember seeing those scripts, so maybe they were added later? At any rate, now we have a forum query about it. Can anyone explain why that customisation is proposed, and how the code differs from the Bioware script? That would help people to understand which lines they need to change to suit their own scenario. [[User:Proleric1|Proleric1]] 09:41, 7 January 2011 (UTC)&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Talk:Backgrounds_tutorial&amp;diff=16026</id>
		<title>Talk:Backgrounds tutorial</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Talk:Backgrounds_tutorial&amp;diff=16026"/>
				<updated>2011-03-29T02:44:01Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: /*And forgot again */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== Bugfixes and some comments ==&lt;br /&gt;
&lt;br /&gt;
The crashing because of the background description string ID is actually because of the UI and can be fixed by modders. In the chargen.gfx's ActionScript RaceGenderScene.GrabBackgrounds() static function, the following is what's causing the crash - basically using the StringID as an array index for the sole purpose of checking if that StringID has been seen yet, so this can be worked around to check it some way else - or just drop it if it's not strictly needed. Incidentally, this is probably also why you need unique background description string IDs for each race for them to get properly enumerated.&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
var aStringCheck = [];&lt;br /&gt;
// ...&lt;br /&gt;
// ... nested 'for-loop's&lt;br /&gt;
       var bBackgroundAllowedByRace = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       var nDescStringID = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND_DESC, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       if (bBackgroundAllowedByRace == 1 &amp;amp;&amp;amp; aStringCheck[nDescStringID] == null)&lt;br /&gt;
       {&lt;br /&gt;
                    aStringCheck[nDescStringID] = nDescStringID;&lt;br /&gt;
&lt;br /&gt;
       }&lt;br /&gt;
// ... end nested 'for-loop's&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--[[User:FollowTheGourd|FollowTheGourd]] 02:44, 29 March 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Is this correct? ==&lt;br /&gt;
&lt;br /&gt;
I have problems with this solution. I tried it twice now, once I tried to implement it into my module, the other time I did it exactly as written here. 1. The custom templates for the Backgrounds don't work (The character has no equipment, no matter what background I choose) with the scripts on this tutorial, although the changes work fine if I run RESOURCE_SCRIPT_MODULE_CORE 2. The race choice doesn't change the character (But that could be because the scripts are missing alot, it's not that important for test purposes) 3. The strings for the Background description don't work (Yes I have corrected them in the Toolset, because the ExcelProcessor can't handle that big numbers), they don't show up, when I'm clicking on the Backgrounds.&lt;br /&gt;
&lt;br /&gt;
I have not tested dialouge yet, but am I making something wrong? Or has this tutorial some errors? [[User:Nobody123456|Nobody123456]] 13:49, 26 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:I think you might be making some errors (although it is possible that there is some error or ommision in what I wrote). I tested the tutorial by running through it from scratch after I wrote it and my game worked fine. It is a very sensitive process though, so the slightest thing wrong can really throw you out. &lt;br /&gt;
&lt;br /&gt;
: The first thing I would suggest is to get the background description strings working because I know that can cause issues if you don't get it right. Try a new module and don't make any changes execpt for adding your own strings to the backgrounds and see if that works. Oh and be sure to export your talk table along with any other resources before you play. Actaully that's probably it - I should add that to the tutorial. [[User:Stuntpope|Stuntpope]] 15:01, 26 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:: I did export the string table, so that can't be it. I recreated it from scratch, now some equipment choices work, some don't. The race choices now works fine, but the strings still don't show up. I tested the background choices in a dialouge, and this works perfectly fine. I uploaded the module, so if you wanna take a quick look, that would be great. [http://www.megaupload.com/?d=CYHIVYJL Background Test Module] and if you want to install the module as an addin [http://www.megaupload.com/?d=2FILLQ5N DAZIP format] [[User:Nobody123456|Nobody123456]] 05:20, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:I notice your talk table is called strings.tlk. That seems strange to me, I didn't know you could rename tlk files but mine is called bg_demo_en-us, where bg_demo is what my module is called. so i would have expected yours to be bdm_2_en-us.tlk if you hadn't renamed it. You say that you are able to display strings in dialogue though so maybe that's not it. Another possibility is that this is another bug in the description strings. Your strings are a good million higher than mine - try using exctly the same string ID range that I used.&lt;br /&gt;
&lt;br /&gt;
:As for equipment - I didn't really spend any time looking at what equipment those templates start with. I just selected some that had the look I was going for in chargen, so the ones that are just dressed plainly and don't have weapons or anything are that way becasue that is what those templates are (I think i used those for the servants). To check that this is working go into the toolset and find those templates - compare them to what those characters have if you create them. If you want them to have equipment, simply create a new creature and give them whatever equipment you want, then use that template name in the GDA. Try and resolve your other issue first though before you try that. [[User:Stuntpope|Stuntpope]] 07:25, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:: It was indeed the table name. It was exportet that way, that's strange, but now the Strings work fine, thank you very much! [[User:Nobody123456|Nobody123456]] 07:52, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
::: I ran into this same problem which is a user error. Make sure you export the &amp;quot;talk table&amp;quot; and NOT &amp;quot;string table&amp;quot;. The export &amp;quot;string table&amp;quot; option appears on the export menu if you have the talk table open at the time. [[User:Deadrockstar|Deadrockstar]] 11:43, 8 December 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:Great to hear you got it working! [[User:Stuntpope|Stuntpope]] 08:14, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
==Why are the CHARGEN event scripts customised?==&lt;br /&gt;
&lt;br /&gt;
I managed to get my custom background working without customising the CHARGEN event scripts. In fact, I don't remember seeing those scripts, so maybe they were added later? At any rate, now we have a forum query about it. Can anyone explain why that customisation is proposed, and how the code differs from the Bioware script? That would help people to understand which lines they need to change to suit their own scenario. [[User:Proleric1|Proleric1]] 09:41, 7 January 2011 (UTC)&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Talk:Backgrounds_tutorial&amp;diff=16025</id>
		<title>Talk:Backgrounds tutorial</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Talk:Backgrounds_tutorial&amp;diff=16025"/>
				<updated>2011-03-29T02:42:08Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: /* oops */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== Bugfixes and some comments ==&lt;br /&gt;
&lt;br /&gt;
The crashing because of the background description string ID is actually because of the UI and can be fixed by modders. In the chargen.gfx's ActionScript RaceGenderScene.GrabBackgrounds() static function, the following is what's causing the crash - basically using the StringID as an array index for the sole purpose of checking if that StringID has been seen yet, so this can be worked around to check it some way else - or just drop it if it's not strictly needed. Incidentally, this is probably also why you need unique background description string IDs for each race for them to get properly enumerated.&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
var aStringCheck = [];&lt;br /&gt;
// ...&lt;br /&gt;
// ... nested 'for-loop's&lt;br /&gt;
       var bBackgroundAllowedByRace = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       var nDescStringID = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND_DESC, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       if (bBackgroundAllowedByRace == 1 &amp;amp;&amp;amp; aStringCheck[nDescStringID] == null)&lt;br /&gt;
       {&lt;br /&gt;
                    aStringCheck[nDescStringID] = nDescStringID;&lt;br /&gt;
&lt;br /&gt;
       }&lt;br /&gt;
// ... end nested 'for-loop's&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Is this correct? ==&lt;br /&gt;
&lt;br /&gt;
I have problems with this solution. I tried it twice now, once I tried to implement it into my module, the other time I did it exactly as written here. 1. The custom templates for the Backgrounds don't work (The character has no equipment, no matter what background I choose) with the scripts on this tutorial, although the changes work fine if I run RESOURCE_SCRIPT_MODULE_CORE 2. The race choice doesn't change the character (But that could be because the scripts are missing alot, it's not that important for test purposes) 3. The strings for the Background description don't work (Yes I have corrected them in the Toolset, because the ExcelProcessor can't handle that big numbers), they don't show up, when I'm clicking on the Backgrounds.&lt;br /&gt;
&lt;br /&gt;
I have not tested dialouge yet, but am I making something wrong? Or has this tutorial some errors? [[User:Nobody123456|Nobody123456]] 13:49, 26 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:I think you might be making some errors (although it is possible that there is some error or ommision in what I wrote). I tested the tutorial by running through it from scratch after I wrote it and my game worked fine. It is a very sensitive process though, so the slightest thing wrong can really throw you out. &lt;br /&gt;
&lt;br /&gt;
: The first thing I would suggest is to get the background description strings working because I know that can cause issues if you don't get it right. Try a new module and don't make any changes execpt for adding your own strings to the backgrounds and see if that works. Oh and be sure to export your talk table along with any other resources before you play. Actaully that's probably it - I should add that to the tutorial. [[User:Stuntpope|Stuntpope]] 15:01, 26 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:: I did export the string table, so that can't be it. I recreated it from scratch, now some equipment choices work, some don't. The race choices now works fine, but the strings still don't show up. I tested the background choices in a dialouge, and this works perfectly fine. I uploaded the module, so if you wanna take a quick look, that would be great. [http://www.megaupload.com/?d=CYHIVYJL Background Test Module] and if you want to install the module as an addin [http://www.megaupload.com/?d=2FILLQ5N DAZIP format] [[User:Nobody123456|Nobody123456]] 05:20, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:I notice your talk table is called strings.tlk. That seems strange to me, I didn't know you could rename tlk files but mine is called bg_demo_en-us, where bg_demo is what my module is called. so i would have expected yours to be bdm_2_en-us.tlk if you hadn't renamed it. You say that you are able to display strings in dialogue though so maybe that's not it. Another possibility is that this is another bug in the description strings. Your strings are a good million higher than mine - try using exctly the same string ID range that I used.&lt;br /&gt;
&lt;br /&gt;
:As for equipment - I didn't really spend any time looking at what equipment those templates start with. I just selected some that had the look I was going for in chargen, so the ones that are just dressed plainly and don't have weapons or anything are that way becasue that is what those templates are (I think i used those for the servants). To check that this is working go into the toolset and find those templates - compare them to what those characters have if you create them. If you want them to have equipment, simply create a new creature and give them whatever equipment you want, then use that template name in the GDA. Try and resolve your other issue first though before you try that. [[User:Stuntpope|Stuntpope]] 07:25, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:: It was indeed the table name. It was exportet that way, that's strange, but now the Strings work fine, thank you very much! [[User:Nobody123456|Nobody123456]] 07:52, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
::: I ran into this same problem which is a user error. Make sure you export the &amp;quot;talk table&amp;quot; and NOT &amp;quot;string table&amp;quot;. The export &amp;quot;string table&amp;quot; option appears on the export menu if you have the talk table open at the time. [[User:Deadrockstar|Deadrockstar]] 11:43, 8 December 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:Great to hear you got it working! [[User:Stuntpope|Stuntpope]] 08:14, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
==Why are the CHARGEN event scripts customised?==&lt;br /&gt;
&lt;br /&gt;
I managed to get my custom background working without customising the CHARGEN event scripts. In fact, I don't remember seeing those scripts, so maybe they were added later? At any rate, now we have a forum query about it. Can anyone explain why that customisation is proposed, and how the code differs from the Bioware script? That would help people to understand which lines they need to change to suit their own scenario. [[User:Proleric1|Proleric1]] 09:41, 7 January 2011 (UTC)&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Talk:Backgrounds_tutorial&amp;diff=16024</id>
		<title>Talk:Backgrounds tutorial</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Talk:Backgrounds_tutorial&amp;diff=16024"/>
				<updated>2011-03-29T02:37:53Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: Bug fix for crashing because of higher string IDs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
&lt;br /&gt;
== Bugfixes and some comments ==&lt;br /&gt;
&lt;br /&gt;
The crashing because of the background description string ID is actually because of the UI and can be fixed by modders. In the chargen.gfx's ActionScript RaceGenderScene.GrabBackgrounds() static function, the following is what's causing the crash - basically using the StringID as an array index for the sole purpose of checking if that StringID has been seen yet, so this can be worked around to check it some way else - or just drop it if it's not strictly needed. Incidentally, this is probably also why you need unique background description string IDs for each race for them to get properly enumerated.&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
var = aStringCheck[];&lt;br /&gt;
// ...&lt;br /&gt;
// ... nested 'for-loop's&lt;br /&gt;
       var bBackgroundAllowedByRace = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       var nDescStringID = Number(ExternalCommands.Get2DAValueByRowIndexColumnName(_2DA.TABLE_BACKGROUND_DESC, nBackgroundRow, RaceGenderScene.m_aRaces[nRaceIndex].sLabel));&lt;br /&gt;
       if (bBackgroundAllowedByRace == 1 &amp;amp;&amp;amp; aStringCheck[nDescStringID] == null)&lt;br /&gt;
       {&lt;br /&gt;
                    aStringCheck[nDescStringID] = nDescStringID;&lt;br /&gt;
&lt;br /&gt;
       }&lt;br /&gt;
// ... end nested 'for-loop's&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Is this correct? ==&lt;br /&gt;
&lt;br /&gt;
I have problems with this solution. I tried it twice now, once I tried to implement it into my module, the other time I did it exactly as written here. 1. The custom templates for the Backgrounds don't work (The character has no equipment, no matter what background I choose) with the scripts on this tutorial, although the changes work fine if I run RESOURCE_SCRIPT_MODULE_CORE 2. The race choice doesn't change the character (But that could be because the scripts are missing alot, it's not that important for test purposes) 3. The strings for the Background description don't work (Yes I have corrected them in the Toolset, because the ExcelProcessor can't handle that big numbers), they don't show up, when I'm clicking on the Backgrounds.&lt;br /&gt;
&lt;br /&gt;
I have not tested dialouge yet, but am I making something wrong? Or has this tutorial some errors? [[User:Nobody123456|Nobody123456]] 13:49, 26 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:I think you might be making some errors (although it is possible that there is some error or ommision in what I wrote). I tested the tutorial by running through it from scratch after I wrote it and my game worked fine. It is a very sensitive process though, so the slightest thing wrong can really throw you out. &lt;br /&gt;
&lt;br /&gt;
: The first thing I would suggest is to get the background description strings working because I know that can cause issues if you don't get it right. Try a new module and don't make any changes execpt for adding your own strings to the backgrounds and see if that works. Oh and be sure to export your talk table along with any other resources before you play. Actaully that's probably it - I should add that to the tutorial. [[User:Stuntpope|Stuntpope]] 15:01, 26 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:: I did export the string table, so that can't be it. I recreated it from scratch, now some equipment choices work, some don't. The race choices now works fine, but the strings still don't show up. I tested the background choices in a dialouge, and this works perfectly fine. I uploaded the module, so if you wanna take a quick look, that would be great. [http://www.megaupload.com/?d=CYHIVYJL Background Test Module] and if you want to install the module as an addin [http://www.megaupload.com/?d=2FILLQ5N DAZIP format] [[User:Nobody123456|Nobody123456]] 05:20, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:I notice your talk table is called strings.tlk. That seems strange to me, I didn't know you could rename tlk files but mine is called bg_demo_en-us, where bg_demo is what my module is called. so i would have expected yours to be bdm_2_en-us.tlk if you hadn't renamed it. You say that you are able to display strings in dialogue though so maybe that's not it. Another possibility is that this is another bug in the description strings. Your strings are a good million higher than mine - try using exctly the same string ID range that I used.&lt;br /&gt;
&lt;br /&gt;
:As for equipment - I didn't really spend any time looking at what equipment those templates start with. I just selected some that had the look I was going for in chargen, so the ones that are just dressed plainly and don't have weapons or anything are that way becasue that is what those templates are (I think i used those for the servants). To check that this is working go into the toolset and find those templates - compare them to what those characters have if you create them. If you want them to have equipment, simply create a new creature and give them whatever equipment you want, then use that template name in the GDA. Try and resolve your other issue first though before you try that. [[User:Stuntpope|Stuntpope]] 07:25, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:: It was indeed the table name. It was exportet that way, that's strange, but now the Strings work fine, thank you very much! [[User:Nobody123456|Nobody123456]] 07:52, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
::: I ran into this same problem which is a user error. Make sure you export the &amp;quot;talk table&amp;quot; and NOT &amp;quot;string table&amp;quot;. The export &amp;quot;string table&amp;quot; option appears on the export menu if you have the talk table open at the time. [[User:Deadrockstar|Deadrockstar]] 11:43, 8 December 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
:Great to hear you got it working! [[User:Stuntpope|Stuntpope]] 08:14, 27 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
==Why are the CHARGEN event scripts customised?==&lt;br /&gt;
&lt;br /&gt;
I managed to get my custom background working without customising the CHARGEN event scripts. In fact, I don't remember seeing those scripts, so maybe they were added later? At any rate, now we have a forum query about it. Can anyone explain why that customisation is proposed, and how the code differs from the Bioware script? That would help people to understand which lines they need to change to suit their own scenario. [[User:Proleric1|Proleric1]] 09:41, 7 January 2011 (UTC)&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Unable_to_connect_to_the_database&amp;diff=15522</id>
		<title>Unable to connect to the database</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Unable_to_connect_to_the_database&amp;diff=15522"/>
				<updated>2011-01-12T03:31:10Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: /* Permissions issues */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:unable to connect to database.png|right]]&lt;br /&gt;
When the toolset throws this error, it indicates that there was some kind of problem when attempting to connect to the SQL Server Express 2005 database. Unfortunately, this is common, but unpredictable. When the toolset starts up, it attempts to connect to the database.  If the database does not respond, it simply returns this error. The toolset has no ability to diagnose why   &lt;br /&gt;
&lt;br /&gt;
This error is kind of like the &amp;quot;Service Engine&amp;quot; light on your vehicle.  When the service engine light starts flashing, it means something is wrong, but it is a very general warning that does not give you much information on what is wrong, just that something is wrong.  The cause of it could be anything from a loose gas cap to a failed spark plug to some bad sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Diagnosing the Problem==&lt;br /&gt;
When it comes to the cannot connect error, it can range from the long file path issue to interference from UAC, to permissions issues, to a conflict with an existing installation of SQL Server, to registry entries, to the location of the installation file on your computer. The list is long. Here is a troubleshooting guide to try and help you diagnose what particular problem is vexing you and how to repair it.  If the troubleshooting is getting you nowhere, the [[#Full Manual Install|full manual install]] is another method that may be more effective, as you take things into your own hands and have better visibility to errors.&lt;br /&gt;
 &lt;br /&gt;
As a potential source of more information to diagnose the problem with, you could always look for connection errors in both {{dashedborder|C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\Log\ERRORLOG&lt;br /&gt;
and&lt;br /&gt;
C:\Program Files\Dragon Age\tools\toolssql\MSSQL.1\MSSQL\LOG\ERRORLOG}}. You may have to use an administrator account to read this file. As an example ERRORLOG entry:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2011-01-02 11:32:15.08 Logon       Error: 18456, Severity: 14, State: 38.&lt;br /&gt;
2011-01-02 11:32:15.08 Logon       Login failed for user 'EXAMPLE\Example'. Reason: Failed to open the explicitly specified database. [CLIENT: &amp;lt;named pipe&amp;gt;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please note that Windows 7 automatically locks the files found in c:/ and will have a lock icon on the folder. You will have to right click on the folder, choose share with and click on homegroup(read/write).&lt;br /&gt;
You also may have to exit and open c:/ again to make sure that it took affect. This would allow the installer to access the games file to properly install MSSQL Server Express.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
{| cellspacing = &amp;quot;5&amp;quot; cellpadding = &amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; class=&amp;quot;toc&amp;quot;&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; |  [[#Did the database get restored?|Did the database get restored / created?]]&lt;br /&gt;
| No&amp;lt;br/&amp;gt;&amp;amp;rarr;&lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; | [[#Did SQL Server Install?|Did MSSQL Express install?]]&lt;br /&gt;
| No&amp;lt;br/&amp;gt;&amp;amp;rarr;&lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; align=&amp;quot;left&amp;quot; | Possible solutions:&lt;br /&gt;
# Permissions issues: run installer as administrator&lt;br /&gt;
# Path length&lt;br /&gt;
# Compressed drive&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Yes&amp;lt;br/&amp;gt; &amp;amp;darr;&lt;br /&gt;
|&lt;br /&gt;
| Yes&amp;lt;br/&amp;gt; &amp;amp;darr;&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; | [[#Is the Database Service Running|Is the database service running?]]&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; | [[Database backup and restore#Restoring the Database if it failed after Installation|Restore database and re-run toolset]]&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
{| cellspacing = &amp;quot;5&amp;quot; cellpadding = &amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background-color:transparent&amp;quot;&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Yes&amp;lt;br/&amp;gt;&amp;amp;darr;&lt;br /&gt;
| No&amp;lt;br/&amp;gt;&amp;amp;darr;&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; | [[#Is the Toolset correctly pointing to database?|Is the Toolset correctly pointing to database?]]&lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; | Start service and re-run toolset&lt;br /&gt;
|}&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Is the Database Service Running===&lt;br /&gt;
&lt;br /&gt;
If the service is running, it is an indication that SQL Server has installed correctly and the database is available for use by the toolset.&lt;br /&gt;
&lt;br /&gt;
You can check to see if the Database Service is running by navigating to your the Services application.  Depending on your operating system, the path may be a bit different, but it should be along the lines of &amp;lt;code&amp;gt;Start&amp;gt;&amp;gt;Control Panel&amp;gt;&amp;gt;Administrative Tools&amp;gt;&amp;gt;Services&amp;lt;/code&amp;gt;(alternately type &amp;quot;services.msc&amp;quot; (excluding quotes) into a run window)&lt;br /&gt;
&lt;br /&gt;
Scroll down through the list and look for a service named &amp;quot;SQL Server (BWDATOOLSET)&amp;quot;.  Check the Status of the service.  If the status is anything other than &amp;quot;Running&amp;quot; (or, possibly, &amp;quot;Started&amp;quot; in the case of Windows XP users), right click on it and select &amp;quot;Start&amp;quot;.  If it then starts successfully the status will change to &amp;quot;Running&amp;quot; &lt;br /&gt;
&lt;br /&gt;
If the Service refuses to Start or does not exist, more troubleshooting is needed some kind of installation issue with SQL Server.  We need to look at the properties on the service and figure out where to go from here.  One thing I have seen is that it is left over from some manual file deletions,  the .mdf and .ldf files no longer exist, but the service is still there.  Path to executable field may hold some clues. here.&lt;br /&gt;
&lt;br /&gt;
* Ensure SQL Server (BWDATOOLSET): Open the '''SQL Server Configuration Manager''' (by default &amp;lt;code&amp;gt;Start | Microsoft SQL Server 2005 | Configuration Tools | SQL Server Configuration Manager&amp;lt;/code&amp;gt;) and in the object tree in the left hand panel click on the '''SQL Server 2005 Services''' entry. Ensure entry for '''SQL Server (BWDATOOLSET)''' appearing in the right hand panel has a '''State''' of '''Running'''.  If not select it and start it (either using the button on the toolbar or the option in the context menu).&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
===Did SQL Server Install?===&lt;br /&gt;
Check your Start menu and see if it installed at all.  Go to Start&amp;gt;&amp;gt;Program Files&amp;gt;&amp;gt;Microsoft SQL Server 2005.  If nothing exists here then there are two basic explanations:&lt;br /&gt;
# When you ran the installer, you may have unchecked the option to Install MSSQL Express 2005 SP3.  If this is the case.  Try running the toolset installer a second time, make sure that you leave that option checked so that the installer will attempt to install SQL Server 2005.&lt;br /&gt;
# Something went wrong with the SQL Server installation and it failed to install at all.  You can try installing the toolset again.  If this is unsuccessful, you can try downloading and installing it [[Manual database installation|manually]].&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
===Did the database get restored?===&lt;br /&gt;
Check the toolset installation directory for the restored database files.  Depending on where you installed the Game and Toolset, they will be in a location similar to&lt;br /&gt;
{{dashedborder|C:\Program Files\Dragon Age\tools\toolssql\Data\ &amp;lt;--- version 1.00 installed under the Tools folder&lt;br /&gt;
or&lt;br /&gt;
C:\Program Files\DAODB\ &amp;lt;--- version 1.01 of the toolset goes here, avoiding long path issue}}&lt;br /&gt;
Browse to this location and look for the existence of the following two files:&lt;br /&gt;
{{dashedborder|bw_dragonage_content.ldf}}&lt;br /&gt;
and&lt;br /&gt;
{{dashedborder|bw_dragonage_content.mdf}}&lt;br /&gt;
&lt;br /&gt;
'''If these files exist''', it indicates that the SQL Server was installed, and that the actual Dragon Age toolset database was restored.  If they are not present, the restore function failed for some reason.  If the files exist, continue on to the next step of the troubleshooter.&lt;br /&gt;
&lt;br /&gt;
'''If the files do not exist''', you can attempt to restore them in a number of ways:&lt;br /&gt;
&lt;br /&gt;
:'''1.''' Download and use SQL Management Studio to create the database and restore the content database.  This is covered in the [[Manual database installation|manual database installation]] article.  Since the SQL Server is installed, you should be able to skip the first step, and start from the heading &amp;quot;Installing SQL Server Management Studio Express&amp;quot;&lt;br /&gt;
:'''2.''' Running the restore operation through a &amp;quot;batch&amp;quot; file manually. See [[Database backup and restore#Restoring the Database if it failed after Installation|Restoring the Database if it failed after Installation]]. Also added a section about Error Handling, because the batch file presents error numbers.&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
===Is the Toolset correctly pointing to database?=== &lt;br /&gt;
Run [[Configure Toolset]] to send the toolset in the right direction and test the database connection.&lt;br /&gt;
&lt;br /&gt;
Notes: &lt;br /&gt;
*It has been observed that for some builds that the Toolset is not looking at the correct registry keys perhaps due to permission restrictions.  &lt;br /&gt;
*#First use the ConfigureToolset to set the correct string.&lt;br /&gt;
*#:If you don't use the default settings you can copy the string from from the ConfigureToolset tool otherwise use one of the following command line queries to get the connection string.&lt;br /&gt;
*#:''Win32:'' &amp;lt;code&amp;gt;reg query &amp;quot;HKLM\SOFTWARE\BioWare\Dragon Age\Toolset\Environment&amp;quot; /v DefaultDatabaseConnection&amp;lt;/code&amp;gt;&lt;br /&gt;
*#:''Win64:'' &amp;lt;code&amp;gt;reg query &amp;quot;HKLM\SOFTWARE\Wow6432Node\BioWare\Dragon Age\Toolset\Environment&amp;quot; /v DefaultDatabaseConnection&amp;lt;/code&amp;gt;&lt;br /&gt;
*#Now run the following command line (substituting your connection string for the final value)&lt;br /&gt;
*#:&amp;lt;code&amp;gt;reg add &amp;quot;HKCU\Software\BioWare\Dragon Age\Toolset\Environment&amp;quot; /v DefaultDatabaseConnection /t REG_SZ /d &amp;quot;Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=bw_dragonage_content;Data Source=.\BWDATOOLSET&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:Double check your entry, a single incorrect character will cause the same &amp;quot;Unable to Connect&amp;quot; error.&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
==Full Manual Install==&lt;br /&gt;
Manual database installation works almost every time.  If it does not, it should at least give you clues as to why it is failing, which you do not generally get when using the toolset installer.  If this &amp;quot;cannot connect to the database&amp;quot; error is frustrating you and you want to just make it work, and don't want to keep troubleshooting, this is probably your best bet:&lt;br /&gt;
&lt;br /&gt;
# '''Install the toolset without any of the database options checked'''.[[Image:Toolset setup screen.png|right]]&lt;br /&gt;
#:Uncheck the following both of the database settings options as shown here.  This will just install the toolset files and do nothing at all with the database itself.  Of course, since SQL Server is not installed, you would still get the &amp;quot;Unable to to connect to the database&amp;quot; error at this point.&lt;br /&gt;
# '''Manually install SQL Server and restore the database'''&lt;br /&gt;
#:It is not as hard as it may sound, and is documented [[manual database installation|here]].  Basically, when you do this, you are taking control of the two steps that you told the installer not to do, and doing them on your own.  This is effective as this way you can babysit the installation process.  Running the SQL installer this way will throw more explicit errors at you when it is having problems, making it easier to diagnose the problems and find solutions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Why does this work?'''&lt;br /&gt;
&lt;br /&gt;
The toolset needs a database engine to run.  The installer has a copy of SQL Server 2005 embedded in it.  The idea behind this is that we could hide all the SQL Server installation, setup and administration voodoo, and do it all in the background so that you wouldn't have to figure out how to do it on your own.  When it works - it is great, when it doesn't - you land on this page...&lt;br /&gt;
&lt;br /&gt;
When the toolset has finished doing its business (essentially unpacking some files and setting up some permissions and registry entries) it then runs the SQL Server 2005 installer in &amp;quot;silent&amp;quot; mode, where it just tries to install with its default settings.  The toolset installer is &amp;quot;blind&amp;quot; to what goes on during the SQL install, it just gets a message when the SQL installer says &amp;quot;''I'm done''&amp;quot;, regardless of what kind of &amp;quot;''done''&amp;quot; that is.  It could be &amp;quot;''I just failed horribly, but I'm done failing now''&amp;quot; or it could be &amp;quot;''Whew, everything went as planned, I'm done''&amp;quot;.  Once the toolset installer gets that message, it says &amp;quot;''SQL is done, so I can now restore the database''&amp;quot;.  It then runs a command line to restore the database.  Again this process does not give proper feedback either, it just spits back another &amp;quot;''I'm done''&amp;quot; message, at which the toolset installer comes back and tells you it is finished.  Anything that goes wrong in this process will cause the dreaded error when you start the toolset.  Unfortunately there is no easy way for the installer to catch these problems and alert you.  Taking this process out of the installer's hands and running it manually allows you to see what is going wrong and react to it.  A quick internet search for any error that you get will often help you figure out what SQL Server is choking on in your particular case.&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
==Additional ideas==&lt;br /&gt;
&lt;br /&gt;
=== MSSQL Server cannot install to compressed or encrypted folders ===&lt;br /&gt;
SQL Server Setup cannot install files.&lt;br /&gt;
&lt;br /&gt;
Product: Microsoft SQL Server 2005 -- Error 28062. SQL Server Setup cannot install files to the compressed or encrypted folder: X:\. To continue, make sure that your installation directories are not compressed or encrypted, or specify a different directory, and then run SQL Server Setup again.&lt;br /&gt;
&lt;br /&gt;
Cause.&lt;br /&gt;
SQL Server 2005 program files and data files cannot be installed on a file system that uses compression.&lt;br /&gt;
&lt;br /&gt;
Solution.&lt;br /&gt;
You need to uncompressed the drives or folders where the SQL Server 2005 program files and data files will be placed. Please follow the steps below:&lt;br /&gt;
# From your Windows Explorer, navigate to the path where the SQL Server program files and data files will be placed&lt;br /&gt;
# Make a right click on the drive or folder and select Properties&lt;br /&gt;
# If you are seeing the properties of a folder click the Advanced button&lt;br /&gt;
# Click to clear the &amp;quot;Compress drive to save disk space&amp;quot; or &amp;quot;Compress contents to save disk space&amp;quot; check box&lt;br /&gt;
# Return to setup and continue installation.&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
=== Permissions issues ===&lt;br /&gt;
&lt;br /&gt;
* Sometimes disabling UAC (User Account Control) and reinstalling the toolset will allow the database to install properly.&lt;br /&gt;
&lt;br /&gt;
* SQL Server needs permission to read from the directory that the you have put the installation files, if it does not have permissions, it may be unable to import resources into the database. To correct this change the administrative privileges for the directory you're installing the toolset from.&lt;br /&gt;
&lt;br /&gt;
*On Vista systems the toolset may need administrator privileges to read the database where it's installed but fail to prompt you for them. Try right-clicking the toolset's shortcut and selecting &amp;quot;Run as Administrator&amp;quot; from the dropdown menu.&lt;br /&gt;
&lt;br /&gt;
* On Windows XP systems, you may need to run the toolset as the Administrator by right-clicking on the toolset's shortcut, selecting the &amp;quot;Run as...&amp;quot; menu item, and then select &amp;quot;The following user&amp;quot; radio button where you can enter the password for the Administrator account. You can also run the toolset with a power user account, but you'll have to add a new database user to authenticate your user account with. An easy way is to run the Server Surface Area Configuration tool that should have been installed with the toolset and Microsoft SQL Server 2005 Express. Launch it with the Administrator account and then click the &amp;quot;Add New Administrator&amp;quot; link. For &amp;quot;user to provision&amp;quot;, enter your Windows account name and grant them the SysAdmin role from the window below. For possibly more information, see the forum thread [http://social.bioware.com/forum/1/topic/8/index/5517509/ Anyone able to run the toolset as NOT administrator in XP?]. If you were previously using the toolset under another account, then don't forget to check back in any outstanding resources so you can work on them from the current Windows account.&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
==Other Miscellaneous Solutions==&lt;br /&gt;
* You can use SQL Server Express 2008 instead of 2005.  It is better suited to some of the permissions issues that occur in Vista and Windows 7.  Many users have installed SQL Server Express 2008 and are using it instead of 2005.  You could download it and follow the instructions [[Manual database installation|here]] substituting 2008 for 2005.&lt;br /&gt;
* You can try setting up your database separately from the toolset installer. See [[Manual database installation]] for the steps needed to install MSSQL Express 2005 and configure it for use with the toolset manually.  Users have been successful by setting up the toolset this way.&lt;br /&gt;
&lt;br /&gt;
* One User has reported that this sequence of events works:&lt;br /&gt;
::*Uninstall SQL server and the Toolset from PC.&lt;br /&gt;
::*Delete C:\Program Files\Microsoft SQL Server&lt;br /&gt;
::*In Regedit, delete the following:&lt;br /&gt;
:::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\MSSQLServer&lt;br /&gt;
:::HKEY_LOCAL_MACHINE\Software\Microsoft\Microsoft SQL Server&lt;br /&gt;
::*Reboot&lt;br /&gt;
::*Install Toolset with the SQL.&lt;br /&gt;
&lt;br /&gt;
*If you already have MSSQLServer Express installed as part of a different program, the toolset may not get the correct configuration to use it. Run the toolset configuration program (configuretoolset.exe, in the same directory as the toolset itself) and then click &amp;quot;next&amp;quot; through the configuration wizard until you get to the &amp;quot;Content Database&amp;quot; field. It should read: &amp;quot;&amp;lt;code&amp;gt;Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=bw_dragonage_content;Data Source=.\BWDATOOLSET&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*Some users report that the installer fails to create the SQL database (e.g. your &amp;lt;code&amp;gt;Dragon Age\toolssql\data&amp;lt;/code&amp;gt; folder is empty). You can enter the following command to try restoring the database manually (Change the paths to &amp;lt;code&amp;gt;bw_dragonage_content.bak&amp;lt;/code&amp;gt; and your Dragon Age folder as appropriate): &amp;lt;code&amp;gt;&amp;quot;C:\Program Files\Microsoft SQL Server\90\Tools\Binn\&amp;quot;sqlcmd -S .\BWDATOOLSET -E -Q &amp;quot;RESTORE DATABASE bw_dragonage_content FROM DISK = 'C:\Program Files\Dragon Age\tools\dbbak\bw_dragonage_content.bak' WITH MOVE 'bw_dragonage_content' TO 'C:\Program Files\Dragon Age\tools\toolssql\Data\bw_dragonage_content.mdf', MOVE 'bw_dragonage_content_Log' TO 'C:\Program Files\Dragon Age\tools\toolssql\Data\bw_dragonage_content.ldf'&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You need to allow Users to Modify the DATA folder, before you can execute this command.&lt;br /&gt;
&lt;br /&gt;
*Some users have been successful simply installing from a more direct path (eg place the installer in C:\DAInstall and then run the exe file from that location rather than from My Documents or a similar long path).&lt;br /&gt;
&lt;br /&gt;
*[http://social.bioware.com/project/2804/ NErWOnek's pictorial guide] may help.&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Toolset bugs]]&lt;br /&gt;
[[Category:Database]]&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Unable_to_connect_to_the_database&amp;diff=15521</id>
		<title>Unable to connect to the database</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Unable_to_connect_to_the_database&amp;diff=15521"/>
				<updated>2011-01-12T03:28:27Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: Running the toolset on XP as a power user instead of using the admin account as per the forum thread&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:unable to connect to database.png|right]]&lt;br /&gt;
When the toolset throws this error, it indicates that there was some kind of problem when attempting to connect to the SQL Server Express 2005 database. Unfortunately, this is common, but unpredictable. When the toolset starts up, it attempts to connect to the database.  If the database does not respond, it simply returns this error. The toolset has no ability to diagnose why   &lt;br /&gt;
&lt;br /&gt;
This error is kind of like the &amp;quot;Service Engine&amp;quot; light on your vehicle.  When the service engine light starts flashing, it means something is wrong, but it is a very general warning that does not give you much information on what is wrong, just that something is wrong.  The cause of it could be anything from a loose gas cap to a failed spark plug to some bad sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Diagnosing the Problem==&lt;br /&gt;
When it comes to the cannot connect error, it can range from the long file path issue to interference from UAC, to permissions issues, to a conflict with an existing installation of SQL Server, to registry entries, to the location of the installation file on your computer. The list is long. Here is a troubleshooting guide to try and help you diagnose what particular problem is vexing you and how to repair it.  If the troubleshooting is getting you nowhere, the [[#Full Manual Install|full manual install]] is another method that may be more effective, as you take things into your own hands and have better visibility to errors.&lt;br /&gt;
 &lt;br /&gt;
As a potential source of more information to diagnose the problem with, you could always look for connection errors in both {{dashedborder|C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\Log\ERRORLOG&lt;br /&gt;
and&lt;br /&gt;
C:\Program Files\Dragon Age\tools\toolssql\MSSQL.1\MSSQL\LOG\ERRORLOG}}. You may have to use an administrator account to read this file. As an example ERRORLOG entry:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2011-01-02 11:32:15.08 Logon       Error: 18456, Severity: 14, State: 38.&lt;br /&gt;
2011-01-02 11:32:15.08 Logon       Login failed for user 'EXAMPLE\Example'. Reason: Failed to open the explicitly specified database. [CLIENT: &amp;lt;named pipe&amp;gt;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please note that Windows 7 automatically locks the files found in c:/ and will have a lock icon on the folder. You will have to right click on the folder, choose share with and click on homegroup(read/write).&lt;br /&gt;
You also may have to exit and open c:/ again to make sure that it took affect. This would allow the installer to access the games file to properly install MSSQL Server Express.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
{| cellspacing = &amp;quot;5&amp;quot; cellpadding = &amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; class=&amp;quot;toc&amp;quot;&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; |  [[#Did the database get restored?|Did the database get restored / created?]]&lt;br /&gt;
| No&amp;lt;br/&amp;gt;&amp;amp;rarr;&lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; | [[#Did SQL Server Install?|Did MSSQL Express install?]]&lt;br /&gt;
| No&amp;lt;br/&amp;gt;&amp;amp;rarr;&lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; align=&amp;quot;left&amp;quot; | Possible solutions:&lt;br /&gt;
# Permissions issues: run installer as administrator&lt;br /&gt;
# Path length&lt;br /&gt;
# Compressed drive&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Yes&amp;lt;br/&amp;gt; &amp;amp;darr;&lt;br /&gt;
|&lt;br /&gt;
| Yes&amp;lt;br/&amp;gt; &amp;amp;darr;&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; | [[#Is the Database Service Running|Is the database service running?]]&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; | [[Database backup and restore#Restoring the Database if it failed after Installation|Restore database and re-run toolset]]&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
{| cellspacing = &amp;quot;5&amp;quot; cellpadding = &amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background-color:transparent&amp;quot;&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Yes&amp;lt;br/&amp;gt;&amp;amp;darr;&lt;br /&gt;
| No&amp;lt;br/&amp;gt;&amp;amp;darr;&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; | [[#Is the Toolset correctly pointing to database?|Is the Toolset correctly pointing to database?]]&lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; | Start service and re-run toolset&lt;br /&gt;
|}&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Is the Database Service Running===&lt;br /&gt;
&lt;br /&gt;
If the service is running, it is an indication that SQL Server has installed correctly and the database is available for use by the toolset.&lt;br /&gt;
&lt;br /&gt;
You can check to see if the Database Service is running by navigating to your the Services application.  Depending on your operating system, the path may be a bit different, but it should be along the lines of &amp;lt;code&amp;gt;Start&amp;gt;&amp;gt;Control Panel&amp;gt;&amp;gt;Administrative Tools&amp;gt;&amp;gt;Services&amp;lt;/code&amp;gt;(alternately type &amp;quot;services.msc&amp;quot; (excluding quotes) into a run window)&lt;br /&gt;
&lt;br /&gt;
Scroll down through the list and look for a service named &amp;quot;SQL Server (BWDATOOLSET)&amp;quot;.  Check the Status of the service.  If the status is anything other than &amp;quot;Running&amp;quot; (or, possibly, &amp;quot;Started&amp;quot; in the case of Windows XP users), right click on it and select &amp;quot;Start&amp;quot;.  If it then starts successfully the status will change to &amp;quot;Running&amp;quot; &lt;br /&gt;
&lt;br /&gt;
If the Service refuses to Start or does not exist, more troubleshooting is needed some kind of installation issue with SQL Server.  We need to look at the properties on the service and figure out where to go from here.  One thing I have seen is that it is left over from some manual file deletions,  the .mdf and .ldf files no longer exist, but the service is still there.  Path to executable field may hold some clues. here.&lt;br /&gt;
&lt;br /&gt;
* Ensure SQL Server (BWDATOOLSET): Open the '''SQL Server Configuration Manager''' (by default &amp;lt;code&amp;gt;Start | Microsoft SQL Server 2005 | Configuration Tools | SQL Server Configuration Manager&amp;lt;/code&amp;gt;) and in the object tree in the left hand panel click on the '''SQL Server 2005 Services''' entry. Ensure entry for '''SQL Server (BWDATOOLSET)''' appearing in the right hand panel has a '''State''' of '''Running'''.  If not select it and start it (either using the button on the toolbar or the option in the context menu).&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
===Did SQL Server Install?===&lt;br /&gt;
Check your Start menu and see if it installed at all.  Go to Start&amp;gt;&amp;gt;Program Files&amp;gt;&amp;gt;Microsoft SQL Server 2005.  If nothing exists here then there are two basic explanations:&lt;br /&gt;
# When you ran the installer, you may have unchecked the option to Install MSSQL Express 2005 SP3.  If this is the case.  Try running the toolset installer a second time, make sure that you leave that option checked so that the installer will attempt to install SQL Server 2005.&lt;br /&gt;
# Something went wrong with the SQL Server installation and it failed to install at all.  You can try installing the toolset again.  If this is unsuccessful, you can try downloading and installing it [[Manual database installation|manually]].&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
===Did the database get restored?===&lt;br /&gt;
Check the toolset installation directory for the restored database files.  Depending on where you installed the Game and Toolset, they will be in a location similar to&lt;br /&gt;
{{dashedborder|C:\Program Files\Dragon Age\tools\toolssql\Data\ &amp;lt;--- version 1.00 installed under the Tools folder&lt;br /&gt;
or&lt;br /&gt;
C:\Program Files\DAODB\ &amp;lt;--- version 1.01 of the toolset goes here, avoiding long path issue}}&lt;br /&gt;
Browse to this location and look for the existence of the following two files:&lt;br /&gt;
{{dashedborder|bw_dragonage_content.ldf}}&lt;br /&gt;
and&lt;br /&gt;
{{dashedborder|bw_dragonage_content.mdf}}&lt;br /&gt;
&lt;br /&gt;
'''If these files exist''', it indicates that the SQL Server was installed, and that the actual Dragon Age toolset database was restored.  If they are not present, the restore function failed for some reason.  If the files exist, continue on to the next step of the troubleshooter.&lt;br /&gt;
&lt;br /&gt;
'''If the files do not exist''', you can attempt to restore them in a number of ways:&lt;br /&gt;
&lt;br /&gt;
:'''1.''' Download and use SQL Management Studio to create the database and restore the content database.  This is covered in the [[Manual database installation|manual database installation]] article.  Since the SQL Server is installed, you should be able to skip the first step, and start from the heading &amp;quot;Installing SQL Server Management Studio Express&amp;quot;&lt;br /&gt;
:'''2.''' Running the restore operation through a &amp;quot;batch&amp;quot; file manually. See [[Database backup and restore#Restoring the Database if it failed after Installation|Restoring the Database if it failed after Installation]]. Also added a section about Error Handling, because the batch file presents error numbers.&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
===Is the Toolset correctly pointing to database?=== &lt;br /&gt;
Run [[Configure Toolset]] to send the toolset in the right direction and test the database connection.&lt;br /&gt;
&lt;br /&gt;
Notes: &lt;br /&gt;
*It has been observed that for some builds that the Toolset is not looking at the correct registry keys perhaps due to permission restrictions.  &lt;br /&gt;
*#First use the ConfigureToolset to set the correct string.&lt;br /&gt;
*#:If you don't use the default settings you can copy the string from from the ConfigureToolset tool otherwise use one of the following command line queries to get the connection string.&lt;br /&gt;
*#:''Win32:'' &amp;lt;code&amp;gt;reg query &amp;quot;HKLM\SOFTWARE\BioWare\Dragon Age\Toolset\Environment&amp;quot; /v DefaultDatabaseConnection&amp;lt;/code&amp;gt;&lt;br /&gt;
*#:''Win64:'' &amp;lt;code&amp;gt;reg query &amp;quot;HKLM\SOFTWARE\Wow6432Node\BioWare\Dragon Age\Toolset\Environment&amp;quot; /v DefaultDatabaseConnection&amp;lt;/code&amp;gt;&lt;br /&gt;
*#Now run the following command line (substituting your connection string for the final value)&lt;br /&gt;
*#:&amp;lt;code&amp;gt;reg add &amp;quot;HKCU\Software\BioWare\Dragon Age\Toolset\Environment&amp;quot; /v DefaultDatabaseConnection /t REG_SZ /d &amp;quot;Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=bw_dragonage_content;Data Source=.\BWDATOOLSET&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:Double check your entry, a single incorrect character will cause the same &amp;quot;Unable to Connect&amp;quot; error.&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
==Full Manual Install==&lt;br /&gt;
Manual database installation works almost every time.  If it does not, it should at least give you clues as to why it is failing, which you do not generally get when using the toolset installer.  If this &amp;quot;cannot connect to the database&amp;quot; error is frustrating you and you want to just make it work, and don't want to keep troubleshooting, this is probably your best bet:&lt;br /&gt;
&lt;br /&gt;
# '''Install the toolset without any of the database options checked'''.[[Image:Toolset setup screen.png|right]]&lt;br /&gt;
#:Uncheck the following both of the database settings options as shown here.  This will just install the toolset files and do nothing at all with the database itself.  Of course, since SQL Server is not installed, you would still get the &amp;quot;Unable to to connect to the database&amp;quot; error at this point.&lt;br /&gt;
# '''Manually install SQL Server and restore the database'''&lt;br /&gt;
#:It is not as hard as it may sound, and is documented [[manual database installation|here]].  Basically, when you do this, you are taking control of the two steps that you told the installer not to do, and doing them on your own.  This is effective as this way you can babysit the installation process.  Running the SQL installer this way will throw more explicit errors at you when it is having problems, making it easier to diagnose the problems and find solutions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Why does this work?'''&lt;br /&gt;
&lt;br /&gt;
The toolset needs a database engine to run.  The installer has a copy of SQL Server 2005 embedded in it.  The idea behind this is that we could hide all the SQL Server installation, setup and administration voodoo, and do it all in the background so that you wouldn't have to figure out how to do it on your own.  When it works - it is great, when it doesn't - you land on this page...&lt;br /&gt;
&lt;br /&gt;
When the toolset has finished doing its business (essentially unpacking some files and setting up some permissions and registry entries) it then runs the SQL Server 2005 installer in &amp;quot;silent&amp;quot; mode, where it just tries to install with its default settings.  The toolset installer is &amp;quot;blind&amp;quot; to what goes on during the SQL install, it just gets a message when the SQL installer says &amp;quot;''I'm done''&amp;quot;, regardless of what kind of &amp;quot;''done''&amp;quot; that is.  It could be &amp;quot;''I just failed horribly, but I'm done failing now''&amp;quot; or it could be &amp;quot;''Whew, everything went as planned, I'm done''&amp;quot;.  Once the toolset installer gets that message, it says &amp;quot;''SQL is done, so I can now restore the database''&amp;quot;.  It then runs a command line to restore the database.  Again this process does not give proper feedback either, it just spits back another &amp;quot;''I'm done''&amp;quot; message, at which the toolset installer comes back and tells you it is finished.  Anything that goes wrong in this process will cause the dreaded error when you start the toolset.  Unfortunately there is no easy way for the installer to catch these problems and alert you.  Taking this process out of the installer's hands and running it manually allows you to see what is going wrong and react to it.  A quick internet search for any error that you get will often help you figure out what SQL Server is choking on in your particular case.&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
==Additional ideas==&lt;br /&gt;
&lt;br /&gt;
=== MSSQL Server cannot install to compressed or encrypted folders ===&lt;br /&gt;
SQL Server Setup cannot install files.&lt;br /&gt;
&lt;br /&gt;
Product: Microsoft SQL Server 2005 -- Error 28062. SQL Server Setup cannot install files to the compressed or encrypted folder: X:\. To continue, make sure that your installation directories are not compressed or encrypted, or specify a different directory, and then run SQL Server Setup again.&lt;br /&gt;
&lt;br /&gt;
Cause.&lt;br /&gt;
SQL Server 2005 program files and data files cannot be installed on a file system that uses compression.&lt;br /&gt;
&lt;br /&gt;
Solution.&lt;br /&gt;
You need to uncompressed the drives or folders where the SQL Server 2005 program files and data files will be placed. Please follow the steps below:&lt;br /&gt;
# From your Windows Explorer, navigate to the path where the SQL Server program files and data files will be placed&lt;br /&gt;
# Make a right click on the drive or folder and select Properties&lt;br /&gt;
# If you are seeing the properties of a folder click the Advanced button&lt;br /&gt;
# Click to clear the &amp;quot;Compress drive to save disk space&amp;quot; or &amp;quot;Compress contents to save disk space&amp;quot; check box&lt;br /&gt;
# Return to setup and continue installation.&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
=== Permissions issues ===&lt;br /&gt;
&lt;br /&gt;
* Sometimes disabling UAC (User Account Control) and reinstalling the toolset will allow the database to install properly.&lt;br /&gt;
&lt;br /&gt;
* SQL Server needs permission to read from the directory that the you have put the installation files, if it does not have permissions, it may be unable to import resources into the database. To correct this change the administrative privileges for the directory you're installing the toolset from.&lt;br /&gt;
&lt;br /&gt;
*On Vista systems the toolset may need administrator privileges to read the database where it's installed but fail to prompt you for them. Try right-clicking the toolset's shortcut and selecting &amp;quot;Run as Administrator&amp;quot; from the dropdown menu.&lt;br /&gt;
&lt;br /&gt;
* On Windows XP systems, you may need to run the toolset as the Administrator by right-clicking on the toolset's shortcut, selecting the &amp;quot;Run as...&amp;quot; menu item, and then select &amp;quot;The following user&amp;quot; radio button where you can enter the password for the Administrator account. You can also run the toolset with a power user account, but you'll have to add a new database user to authenticate your user account with. An easy way is to run the Server Surface Area Configuration tool that should have been installed with the toolset and Microsoft SQL Server 2005 Express. Launch it as a privileged account and then click the &amp;quot;Add New Administrator&amp;quot; link. For &amp;quot;user to provision&amp;quot;, enter your Windows account name and grant them the SysAdmin role from the window below. For possibly more information, see the forum thread [http://social.bioware.com/forum/1/topic/8/index/5517509/ Anyone able to run the toolset as NOT administrator in XP?].&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
==Other Miscellaneous Solutions==&lt;br /&gt;
* You can use SQL Server Express 2008 instead of 2005.  It is better suited to some of the permissions issues that occur in Vista and Windows 7.  Many users have installed SQL Server Express 2008 and are using it instead of 2005.  You could download it and follow the instructions [[Manual database installation|here]] substituting 2008 for 2005.&lt;br /&gt;
* You can try setting up your database separately from the toolset installer. See [[Manual database installation]] for the steps needed to install MSSQL Express 2005 and configure it for use with the toolset manually.  Users have been successful by setting up the toolset this way.&lt;br /&gt;
&lt;br /&gt;
* One User has reported that this sequence of events works:&lt;br /&gt;
::*Uninstall SQL server and the Toolset from PC.&lt;br /&gt;
::*Delete C:\Program Files\Microsoft SQL Server&lt;br /&gt;
::*In Regedit, delete the following:&lt;br /&gt;
:::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\MSSQLServer&lt;br /&gt;
:::HKEY_LOCAL_MACHINE\Software\Microsoft\Microsoft SQL Server&lt;br /&gt;
::*Reboot&lt;br /&gt;
::*Install Toolset with the SQL.&lt;br /&gt;
&lt;br /&gt;
*If you already have MSSQLServer Express installed as part of a different program, the toolset may not get the correct configuration to use it. Run the toolset configuration program (configuretoolset.exe, in the same directory as the toolset itself) and then click &amp;quot;next&amp;quot; through the configuration wizard until you get to the &amp;quot;Content Database&amp;quot; field. It should read: &amp;quot;&amp;lt;code&amp;gt;Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=bw_dragonage_content;Data Source=.\BWDATOOLSET&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*Some users report that the installer fails to create the SQL database (e.g. your &amp;lt;code&amp;gt;Dragon Age\toolssql\data&amp;lt;/code&amp;gt; folder is empty). You can enter the following command to try restoring the database manually (Change the paths to &amp;lt;code&amp;gt;bw_dragonage_content.bak&amp;lt;/code&amp;gt; and your Dragon Age folder as appropriate): &amp;lt;code&amp;gt;&amp;quot;C:\Program Files\Microsoft SQL Server\90\Tools\Binn\&amp;quot;sqlcmd -S .\BWDATOOLSET -E -Q &amp;quot;RESTORE DATABASE bw_dragonage_content FROM DISK = 'C:\Program Files\Dragon Age\tools\dbbak\bw_dragonage_content.bak' WITH MOVE 'bw_dragonage_content' TO 'C:\Program Files\Dragon Age\tools\toolssql\Data\bw_dragonage_content.mdf', MOVE 'bw_dragonage_content_Log' TO 'C:\Program Files\Dragon Age\tools\toolssql\Data\bw_dragonage_content.ldf'&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You need to allow Users to Modify the DATA folder, before you can execute this command.&lt;br /&gt;
&lt;br /&gt;
*Some users have been successful simply installing from a more direct path (eg place the installer in C:\DAInstall and then run the exe file from that location rather than from My Documents or a similar long path).&lt;br /&gt;
&lt;br /&gt;
*[http://social.bioware.com/project/2804/ NErWOnek's pictorial guide] may help.&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Toolset bugs]]&lt;br /&gt;
[[Category:Database]]&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Unable_to_connect_to_the_database&amp;diff=15378</id>
		<title>Unable to connect to the database</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Unable_to_connect_to_the_database&amp;diff=15378"/>
				<updated>2011-01-02T20:57:11Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: another log file&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:unable to connect to database.png|right]]&lt;br /&gt;
When the toolset throws this error, it indicates that there was some kind of problem when attempting to connect to the SQL Server Express 2005 database. Unfortunately, this is common, but unpredictable. When the toolset starts up, it attempts to connect to the database.  If the database does not respond, it simply returns this error. The toolset has no ability to diagnose why   &lt;br /&gt;
&lt;br /&gt;
This error is kind of like the &amp;quot;Service Engine&amp;quot; light on your vehicle.  When the service engine light starts flashing, it means something is wrong, but it is a very general warning that does not give you much information on what is wrong, just that something is wrong.  The cause of it could be anything from a loose gas cap to a failed spark plug to some bad sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Diagnosing the Problem==&lt;br /&gt;
When it comes to the cannot connect error, it can range from the long file path issue to interference from UAC, to permissions issues, to a conflict with an existing installation of SQL Server, to registry entries, to the location of the installation file on your computer. The list is long. Here is a troubleshooting guide to try and help you diagnose what particular problem is vexing you and how to repair it.  If the troubleshooting is getting you nowhere, the [[#Full Manual Install|full manual install]] is another method that may be more effective, as you take things into your own hands and have better visibility to errors.&lt;br /&gt;
 &lt;br /&gt;
As a potential source of more information to diagnose the problem with, you could always look for connection errors in both {{dashedborder|C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\Log\ERRORLOG&lt;br /&gt;
and&lt;br /&gt;
C:\Program Files\Dragon Age\tools\toolssql\MSSQL.1\MSSQL\LOG\ERRORLOG}}. You may have to use an administrator account to read this file. As an example ERRORLOG entry:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2011-01-02 11:32:15.08 Logon       Error: 18456, Severity: 14, State: 38.&lt;br /&gt;
2011-01-02 11:32:15.08 Logon       Login failed for user 'EXAMPLE\Example'. Reason: Failed to open the explicitly specified database. [CLIENT: &amp;lt;named pipe&amp;gt;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please note that Windows 7 automatically locks the files found in c:/ and will have a lock icon on the folder. You will have to right click on the folder, choose share with and click on homegroup(read/write).&lt;br /&gt;
You also may have to exit and open c:/ again to make sure that it took affect. This would allow the installer to access the games file to properly install MSSQL Server Express.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
{| cellspacing = &amp;quot;5&amp;quot; cellpadding = &amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; class=&amp;quot;toc&amp;quot;&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; |  [[#Did the database get restored?|Did the database get restored / created?]]&lt;br /&gt;
| No&amp;lt;br/&amp;gt;&amp;amp;rarr;&lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; | [[#Did SQL Server Install?|Did MSSQL Express install?]]&lt;br /&gt;
| No&amp;lt;br/&amp;gt;&amp;amp;rarr;&lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; align=&amp;quot;left&amp;quot; | Possible solutions:&lt;br /&gt;
# Permissions issues: run installer as administrator&lt;br /&gt;
# Path length&lt;br /&gt;
# Compressed drive&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Yes&amp;lt;br/&amp;gt; &amp;amp;darr;&lt;br /&gt;
|&lt;br /&gt;
| Yes&amp;lt;br/&amp;gt; &amp;amp;darr;&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; | [[#Is the Database Service Running|Is the database service running?]]&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; | [[Database backup and restore#Restoring the Database if it failed after Installation|Restore database and re-run toolset]]&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
{| cellspacing = &amp;quot;5&amp;quot; cellpadding = &amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background-color:transparent&amp;quot;&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Yes&amp;lt;br/&amp;gt;&amp;amp;darr;&lt;br /&gt;
| No&amp;lt;br/&amp;gt;&amp;amp;darr;&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; | [[#Is the Toolset correctly pointing to database?|Is the Toolset correctly pointing to database?]]&lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; | Start service and re-run toolset&lt;br /&gt;
|}&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Is the Database Service Running===&lt;br /&gt;
&lt;br /&gt;
If the service is running, it is an indication that SQL Server has installed correctly and the database is available for use by the toolset.&lt;br /&gt;
&lt;br /&gt;
You can check to see if the Database Service is running by navigating to your the Services application.  Depending on your operating system, the path may be a bit different, but it should be along the lines of &amp;lt;code&amp;gt;Start&amp;gt;&amp;gt;Control Panel&amp;gt;&amp;gt;Administrative Tools&amp;gt;&amp;gt;Services&amp;lt;/code&amp;gt;(alternately type &amp;quot;services.msc&amp;quot; (excluding quotes) into a run window)&lt;br /&gt;
&lt;br /&gt;
Scroll down through the list and look for a service named &amp;quot;SQL Server (BWDATOOLSET)&amp;quot;.  Check the Status of the service.  If the status is anything other than &amp;quot;Running&amp;quot; (or, possibly, &amp;quot;Started&amp;quot; in the case of Windows XP users), right click on it and select &amp;quot;Start&amp;quot;.  If it then starts successfully the status will change to &amp;quot;Running&amp;quot; &lt;br /&gt;
&lt;br /&gt;
If the Service refuses to Start or does not exist, more troubleshooting is needed some kind of installation issue with SQL Server.  We need to look at the properties on the service and figure out where to go from here.  One thing I have seen is that it is left over from some manual file deletions,  the .mdf and .ldf files no longer exist, but the service is still there.  Path to executable field may hold some clues. here.&lt;br /&gt;
&lt;br /&gt;
* Ensure SQL Server (BWDATOOLSET): Open the '''SQL Server Configuration Manager''' (by default &amp;lt;code&amp;gt;Start | Microsoft SQL Server 2005 | Configuration Tools | SQL Server Configuration Manager&amp;lt;/code&amp;gt;) and in the object tree in the left hand panel click on the '''SQL Server 2005 Services''' entry. Ensure entry for '''SQL Server (BWDATOOLSET)''' appearing in the right hand panel has a '''State''' of '''Running'''.  If not select it and start it (either using the button on the toolbar or the option in the context menu).&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
===Did SQL Server Install?===&lt;br /&gt;
Check your Start menu and see if it installed at all.  Go to Start&amp;gt;&amp;gt;Program Files&amp;gt;&amp;gt;Microsoft SQL Server 2005.  If nothing exists here then there are two basic explanations:&lt;br /&gt;
# When you ran the installer, you may have unchecked the option to Install MSSQL Express 2005 SP3.  If this is the case.  Try running the toolset installer a second time, make sure that you leave that option checked so that the installer will attempt to install SQL Server 2005.&lt;br /&gt;
# Something went wrong with the SQL Server installation and it failed to install at all.  You can try installing the toolset again.  If this is unsuccessful, you can try downloading and installing it [[Manual database installation|manually]].&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
===Did the database get restored?===&lt;br /&gt;
Check the toolset installation directory for the restored database files.  Depending on where you installed the Game and Toolset, they will be in a location similar to&lt;br /&gt;
{{dashedborder|C:\Program Files\Dragon Age\tools\toolssql\Data\ &amp;lt;--- version 1.00 installed under the Tools folder&lt;br /&gt;
or&lt;br /&gt;
C:\Program Files\DAODB\ &amp;lt;--- version 1.01 of the toolset goes here, avoiding long path issue}}&lt;br /&gt;
Browse to this location and look for the existence of the following two files:&lt;br /&gt;
{{dashedborder|bw_dragonage_content.ldf}}&lt;br /&gt;
and&lt;br /&gt;
{{dashedborder|bw_dragonage_content.mdf}}&lt;br /&gt;
&lt;br /&gt;
'''If these files exist''', it indicates that the SQL Server was installed, and that the actual Dragon Age toolset database was restored.  If they are not present, the restore function failed for some reason.  If the files exist, continue on to the next step of the troubleshooter.&lt;br /&gt;
&lt;br /&gt;
'''If the files do not exist''', you can attempt to restore them in a number of ways:&lt;br /&gt;
&lt;br /&gt;
:'''1.''' Download and use SQL Management Studio to create the database and restore the content database.  This is covered in the [[Manual database installation|manual database installation]] article.  Since the SQL Server is installed, you should be able to skip the first step, and start from the heading &amp;quot;Installing SQL Server Management Studio Express&amp;quot;&lt;br /&gt;
:'''2.''' Running the restore operation through a &amp;quot;batch&amp;quot; file manually. See [[Database backup and restore#Restoring the Database if it failed after Installation|Restoring the Database if it failed after Installation]]. Also added a section about Error Handling, because the batch file presents error numbers.&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
===Is the Toolset correctly pointing to database?=== &lt;br /&gt;
Run [[Configure Toolset]] to send the toolset in the right direction and test the database connection.&lt;br /&gt;
&lt;br /&gt;
Notes: &lt;br /&gt;
*It has been observed that for some builds that the Toolset is not looking at the correct registry keys perhaps due to permission restrictions.  &lt;br /&gt;
*#First use the ConfigureToolset to set the correct string.&lt;br /&gt;
*#:If you don't use the default settings you can copy the string from from the ConfigureToolset tool otherwise use one of the following command line queries to get the connection string.&lt;br /&gt;
*#:''Win32:'' &amp;lt;code&amp;gt;reg query &amp;quot;HKLM\SOFTWARE\BioWare\Dragon Age\Toolset\Environment&amp;quot; /v DefaultDatabaseConnection&amp;lt;/code&amp;gt;&lt;br /&gt;
*#:''Win64:'' &amp;lt;code&amp;gt;reg query &amp;quot;HKLM\SOFTWARE\Wow6432Node\BioWare\Dragon Age\Toolset\Environment&amp;quot; /v DefaultDatabaseConnection&amp;lt;/code&amp;gt;&lt;br /&gt;
*#Now run the following command line (substituting your connection string for the final value)&lt;br /&gt;
*#:&amp;lt;code&amp;gt;reg add &amp;quot;HKCU\Software\BioWare\Dragon Age\Toolset\Environment&amp;quot; /v DefaultDatabaseConnection /t REG_SZ /d &amp;quot;Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=bw_dragonage_content;Data Source=.\BWDATOOLSET&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:Double check your entry, a single incorrect character will cause the same &amp;quot;Unable to Connect&amp;quot; error.&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
==Full Manual Install==&lt;br /&gt;
Manual database installation works almost every time.  If it does not, it should at least give you clues as to why it is failing, which you do not generally get when using the toolset installer.  If this &amp;quot;cannot connect to the database&amp;quot; error is frustrating you and you want to just make it work, and don't want to keep troubleshooting, this is probably your best bet:&lt;br /&gt;
&lt;br /&gt;
# '''Install the toolset without any of the database options checked'''.[[Image:Toolset setup screen.png|right]]&lt;br /&gt;
#:Uncheck the following both of the database settings options as shown here.  This will just install the toolset files and do nothing at all with the database itself.  Of course, since SQL Server is not installed, you would still get the &amp;quot;Unable to to connect to the database&amp;quot; error at this point.&lt;br /&gt;
# '''Manually install SQL Server and restore the database'''&lt;br /&gt;
#:It is not as hard as it may sound, and is documented [[manual database installation|here]].  Basically, when you do this, you are taking control of the two steps that you told the installer not to do, and doing them on your own.  This is effective as this way you can babysit the installation process.  Running the SQL installer this way will throw more explicit errors at you when it is having problems, making it easier to diagnose the problems and find solutions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Why does this work?'''&lt;br /&gt;
&lt;br /&gt;
The toolset needs a database engine to run.  The installer has a copy of SQL Server 2005 embedded in it.  The idea behind this is that we could hide all the SQL Server installation, setup and administration voodoo, and do it all in the background so that you wouldn't have to figure out how to do it on your own.  When it works - it is great, when it doesn't - you land on this page...&lt;br /&gt;
&lt;br /&gt;
When the toolset has finished doing its business (essentially unpacking some files and setting up some permissions and registry entries) it then runs the SQL Server 2005 installer in &amp;quot;silent&amp;quot; mode, where it just tries to install with its default settings.  The toolset installer is &amp;quot;blind&amp;quot; to what goes on during the SQL install, it just gets a message when the SQL installer says &amp;quot;''I'm done''&amp;quot;, regardless of what kind of &amp;quot;''done''&amp;quot; that is.  It could be &amp;quot;''I just failed horribly, but I'm done failing now''&amp;quot; or it could be &amp;quot;''Whew, everything went as planned, I'm done''&amp;quot;.  Once the toolset installer gets that message, it says &amp;quot;''SQL is done, so I can now restore the database''&amp;quot;.  It then runs a command line to restore the database.  Again this process does not give proper feedback either, it just spits back another &amp;quot;''I'm done''&amp;quot; message, at which the toolset installer comes back and tells you it is finished.  Anything that goes wrong in this process will cause the dreaded error when you start the toolset.  Unfortunately there is no easy way for the installer to catch these problems and alert you.  Taking this process out of the installer's hands and running it manually allows you to see what is going wrong and react to it.  A quick internet search for any error that you get will often help you figure out what SQL Server is choking on in your particular case.&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
==Additional ideas==&lt;br /&gt;
&lt;br /&gt;
=== MSSQL Server cannot install to compressed or encrypted folders ===&lt;br /&gt;
SQL Server Setup cannot install files.&lt;br /&gt;
&lt;br /&gt;
Product: Microsoft SQL Server 2005 -- Error 28062. SQL Server Setup cannot install files to the compressed or encrypted folder: X:\. To continue, make sure that your installation directories are not compressed or encrypted, or specify a different directory, and then run SQL Server Setup again.&lt;br /&gt;
&lt;br /&gt;
Cause.&lt;br /&gt;
SQL Server 2005 program files and data files cannot be installed on a file system that uses compression.&lt;br /&gt;
&lt;br /&gt;
Solution.&lt;br /&gt;
You need to uncompressed the drives or folders where the SQL Server 2005 program files and data files will be placed. Please follow the steps below:&lt;br /&gt;
# From your Windows Explorer, navigate to the path where the SQL Server program files and data files will be placed&lt;br /&gt;
# Make a right click on the drive or folder and select Properties&lt;br /&gt;
# If you are seeing the properties of a folder click the Advanced button&lt;br /&gt;
# Click to clear the &amp;quot;Compress drive to save disk space&amp;quot; or &amp;quot;Compress contents to save disk space&amp;quot; check box&lt;br /&gt;
# Return to setup and continue installation.&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
=== Permissions issues ===&lt;br /&gt;
&lt;br /&gt;
* Sometimes disabling UAC (User Account Control) and reinstalling the toolset will allow the database to install properly.&lt;br /&gt;
&lt;br /&gt;
* SQL Server needs permission to read from the directory that the you have put the installation files, if it does not have permissions, it may be unable to import resources into the database. To correct this change the administrative privileges for the directory you're installing the toolset from.&lt;br /&gt;
&lt;br /&gt;
*On Vista systems the toolset may need administrator privileges to read the database where it's installed but fail to prompt you for them. Try right-clicking the toolset's shortcut and selecting &amp;quot;Run as Administrator&amp;quot; from the dropdown menu.&lt;br /&gt;
&lt;br /&gt;
* On Windows XP systems, you may need to run the toolset as the Administrator by right-clicking on the toolset's shortcut, selecting the &amp;quot;Run as...&amp;quot; menu item, and then select &amp;quot;The following user&amp;quot; radio button where you can enter the password for the Administrator account. &lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
==Other Miscellaneous Solutions==&lt;br /&gt;
* You can use SQL Server Express 2008 instead of 2005.  It is better suited to some of the permissions issues that occur in Vista and Windows 7.  Many users have installed SQL Server Express 2008 and are using it instead of 2005.  You could download it and follow the instructions [[Manual database installation|here]] substituting 2008 for 2005.&lt;br /&gt;
* You can try setting up your database separately from the toolset installer. See [[Manual database installation]] for the steps needed to install MSSQL Express 2005 and configure it for use with the toolset manually.  Users have been successful by setting up the toolset this way.&lt;br /&gt;
&lt;br /&gt;
* One User has reported that this sequence of events works:&lt;br /&gt;
::*Uninstall SQL server and the Toolset from PC.&lt;br /&gt;
::*Delete C:\Program Files\Microsoft SQL Server&lt;br /&gt;
::*In Regedit, delete the following:&lt;br /&gt;
:::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\MSSQLServer&lt;br /&gt;
:::HKEY_LOCAL_MACHINE\Software\Microsoft\Microsoft SQL Server&lt;br /&gt;
::*Reboot&lt;br /&gt;
::*Install Toolset with the SQL.&lt;br /&gt;
&lt;br /&gt;
*If you already have MSSQLServer Express installed as part of a different program, the toolset may not get the correct configuration to use it. Run the toolset configuration program (configuretoolset.exe, in the same directory as the toolset itself) and then click &amp;quot;next&amp;quot; through the configuration wizard until you get to the &amp;quot;Content Database&amp;quot; field. It should read: &amp;quot;&amp;lt;code&amp;gt;Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=bw_dragonage_content;Data Source=.\BWDATOOLSET&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*Some users report that the installer fails to create the SQL database (e.g. your &amp;lt;code&amp;gt;Dragon Age\toolssql\data&amp;lt;/code&amp;gt; folder is empty). You can enter the following command to try restoring the database manually (Change the paths to &amp;lt;code&amp;gt;bw_dragonage_content.bak&amp;lt;/code&amp;gt; and your Dragon Age folder as appropriate): &amp;lt;code&amp;gt;&amp;quot;C:\Program Files\Microsoft SQL Server\90\Tools\Binn\&amp;quot;sqlcmd -S .\BWDATOOLSET -E -Q &amp;quot;RESTORE DATABASE bw_dragonage_content FROM DISK = 'C:\Program Files\Dragon Age\tools\dbbak\bw_dragonage_content.bak' WITH MOVE 'bw_dragonage_content' TO 'C:\Program Files\Dragon Age\tools\toolssql\Data\bw_dragonage_content.mdf', MOVE 'bw_dragonage_content_Log' TO 'C:\Program Files\Dragon Age\tools\toolssql\Data\bw_dragonage_content.ldf'&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You need to allow Users to Modify the DATA folder, before you can execute this command.&lt;br /&gt;
&lt;br /&gt;
*Some users have been successful simply installing from a more direct path (eg place the installer in C:\DAInstall and then run the exe file from that location rather than from My Documents or a similar long path).&lt;br /&gt;
&lt;br /&gt;
*[http://social.bioware.com/project/2804/ NErWOnek's pictorial guide] may help.&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Toolset bugs]]&lt;br /&gt;
[[Category:Database]]&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Unable_to_connect_to_the_database&amp;diff=15376</id>
		<title>Unable to connect to the database</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Unable_to_connect_to_the_database&amp;diff=15376"/>
				<updated>2011-01-02T20:07:30Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: /*formatting */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:unable to connect to database.png|right]]&lt;br /&gt;
When the toolset throws this error, it indicates that there was some kind of problem when attempting to connect to the SQL Server Express 2005 database. Unfortunately, this is common, but unpredictable. When the toolset starts up, it attempts to connect to the database.  If the database does not respond, it simply returns this error. The toolset has no ability to diagnose why   &lt;br /&gt;
&lt;br /&gt;
This error is kind of like the &amp;quot;Service Engine&amp;quot; light on your vehicle.  When the service engine light starts flashing, it means something is wrong, but it is a very general warning that does not give you much information on what is wrong, just that something is wrong.  The cause of it could be anything from a loose gas cap to a failed spark plug to some bad sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Diagnosing the Problem==&lt;br /&gt;
When it comes to the cannot connect error, it can range from the long file path issue to interference from UAC, to permissions issues, to a conflict with an existing installation of SQL Server, to registry entries, to the location of the installation file on your computer. The list is long. Here is a troubleshooting guide to try and help you diagnose what particular problem is vexing you and how to repair it.  If the troubleshooting is getting you nowhere, the [[#Full Manual Install|full manual install]] is another method that may be more effective, as you take things into your own hands and have better visibility to errors.&lt;br /&gt;
 &lt;br /&gt;
As a potential source of more information to diagnose the problem with, you could always look for connection errors in {{dashedborder|C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\Log\ERRORLOG}}. You may have to use an administrator account to read this file. As an example ERRORLOG entry:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2011-01-02 11:32:15.08 Logon       Error: 18456, Severity: 14, State: 38.&lt;br /&gt;
2011-01-02 11:32:15.08 Logon       Login failed for user 'EXAMPLE\Example'. Reason: Failed to open the explicitly specified database. [CLIENT: &amp;lt;named pipe&amp;gt;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please note that Windows 7 automatically locks the files found in c:/ and will have a lock icon on the folder. You will have to right click on the folder, choose share with and click on homegroup(read/write).&lt;br /&gt;
You also may have to exit and open c:/ again to make sure that it took affect. This would allow the installer to access the games file to properly install MSSQL Server Express.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
{| cellspacing = &amp;quot;5&amp;quot; cellpadding = &amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; class=&amp;quot;toc&amp;quot;&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; |  [[#Did the database get restored?|Did the database get restored / created?]]&lt;br /&gt;
| No&amp;lt;br/&amp;gt;&amp;amp;rarr;&lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; | [[#Did SQL Server Install?|Did MSSQL Express install?]]&lt;br /&gt;
| No&amp;lt;br/&amp;gt;&amp;amp;rarr;&lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; align=&amp;quot;left&amp;quot; | Possible solutions:&lt;br /&gt;
# Permissions issues: run installer as administrator&lt;br /&gt;
# Path length&lt;br /&gt;
# Compressed drive&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Yes&amp;lt;br/&amp;gt; &amp;amp;darr;&lt;br /&gt;
|&lt;br /&gt;
| Yes&amp;lt;br/&amp;gt; &amp;amp;darr;&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; | [[#Is the Database Service Running|Is the database service running?]]&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; | [[Database backup and restore#Restoring the Database if it failed after Installation|Restore database and re-run toolset]]&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
{| cellspacing = &amp;quot;5&amp;quot; cellpadding = &amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background-color:transparent&amp;quot;&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Yes&amp;lt;br/&amp;gt;&amp;amp;darr;&lt;br /&gt;
| No&amp;lt;br/&amp;gt;&amp;amp;darr;&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; | [[#Is the Toolset correctly pointing to database?|Is the Toolset correctly pointing to database?]]&lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; | Start service and re-run toolset&lt;br /&gt;
|}&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Is the Database Service Running===&lt;br /&gt;
&lt;br /&gt;
If the service is running, it is an indication that SQL Server has installed correctly and the database is available for use by the toolset.&lt;br /&gt;
&lt;br /&gt;
You can check to see if the Database Service is running by navigating to your the Services application.  Depending on your operating system, the path may be a bit different, but it should be along the lines of &amp;lt;code&amp;gt;Start&amp;gt;&amp;gt;Control Panel&amp;gt;&amp;gt;Administrative Tools&amp;gt;&amp;gt;Services&amp;lt;/code&amp;gt;(alternately type &amp;quot;services.msc&amp;quot; (excluding quotes) into a run window)&lt;br /&gt;
&lt;br /&gt;
Scroll down through the list and look for a service named &amp;quot;SQL Server (BWDATOOLSET)&amp;quot;.  Check the Status of the service.  If the status is anything other than &amp;quot;Running&amp;quot; (or, possibly, &amp;quot;Started&amp;quot; in the case of Windows XP users), right click on it and select &amp;quot;Start&amp;quot;.  If it then starts successfully the status will change to &amp;quot;Running&amp;quot; &lt;br /&gt;
&lt;br /&gt;
If the Service refuses to Start or does not exist, more troubleshooting is needed some kind of installation issue with SQL Server.  We need to look at the properties on the service and figure out where to go from here.  One thing I have seen is that it is left over from some manual file deletions,  the .mdf and .ldf files no longer exist, but the service is still there.  Path to executable field may hold some clues. here.&lt;br /&gt;
&lt;br /&gt;
* Ensure SQL Server (BWDATOOLSET): Open the '''SQL Server Configuration Manager''' (by default &amp;lt;code&amp;gt;Start | Microsoft SQL Server 2005 | Configuration Tools | SQL Server Configuration Manager&amp;lt;/code&amp;gt;) and in the object tree in the left hand panel click on the '''SQL Server 2005 Services''' entry. Ensure entry for '''SQL Server (BWDATOOLSET)''' appearing in the right hand panel has a '''State''' of '''Running'''.  If not select it and start it (either using the button on the toolbar or the option in the context menu).&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
===Did SQL Server Install?===&lt;br /&gt;
Check your Start menu and see if it installed at all.  Go to Start&amp;gt;&amp;gt;Program Files&amp;gt;&amp;gt;Microsoft SQL Server 2005.  If nothing exists here then there are two basic explanations:&lt;br /&gt;
# When you ran the installer, you may have unchecked the option to Install MSSQL Express 2005 SP3.  If this is the case.  Try running the toolset installer a second time, make sure that you leave that option checked so that the installer will attempt to install SQL Server 2005.&lt;br /&gt;
# Something went wrong with the SQL Server installation and it failed to install at all.  You can try installing the toolset again.  If this is unsuccessful, you can try downloading and installing it [[Manual database installation|manually]].&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
===Did the database get restored?===&lt;br /&gt;
Check the toolset installation directory for the restored database files.  Depending on where you installed the Game and Toolset, they will be in a location similar to&lt;br /&gt;
{{dashedborder|C:\Program Files\Dragon Age\tools\toolssql\Data\ &amp;lt;--- version 1.00 installed under the Tools folder&lt;br /&gt;
or&lt;br /&gt;
C:\Program Files\DAODB\ &amp;lt;--- version 1.01 of the toolset goes here, avoiding long path issue}}&lt;br /&gt;
Browse to this location and look for the existence of the following two files:&lt;br /&gt;
{{dashedborder|bw_dragonage_content.ldf}}&lt;br /&gt;
and&lt;br /&gt;
{{dashedborder|bw_dragonage_content.mdf}}&lt;br /&gt;
&lt;br /&gt;
'''If these files exist''', it indicates that the SQL Server was installed, and that the actual Dragon Age toolset database was restored.  If they are not present, the restore function failed for some reason.  If the files exist, continue on to the next step of the troubleshooter.&lt;br /&gt;
&lt;br /&gt;
'''If the files do not exist''', you can attempt to restore them in a number of ways:&lt;br /&gt;
&lt;br /&gt;
:'''1.''' Download and use SQL Management Studio to create the database and restore the content database.  This is covered in the [[Manual database installation|manual database installation]] article.  Since the SQL Server is installed, you should be able to skip the first step, and start from the heading &amp;quot;Installing SQL Server Management Studio Express&amp;quot;&lt;br /&gt;
:'''2.''' Running the restore operation through a &amp;quot;batch&amp;quot; file manually. See [[Database backup and restore#Restoring the Database if it failed after Installation|Restoring the Database if it failed after Installation]]. Also added a section about Error Handling, because the batch file presents error numbers.&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
===Is the Toolset correctly pointing to database?=== &lt;br /&gt;
Run [[Configure Toolset]] to send the toolset in the right direction and test the database connection.&lt;br /&gt;
&lt;br /&gt;
Notes: &lt;br /&gt;
*It has been observed that for some builds that the Toolset is not looking at the correct registry keys perhaps due to permission restrictions.  &lt;br /&gt;
*#First use the ConfigureToolset to set the correct string.&lt;br /&gt;
*#:If you don't use the default settings you can copy the string from from the ConfigureToolset tool otherwise use one of the following command line queries to get the connection string.&lt;br /&gt;
*#:''Win32:'' &amp;lt;code&amp;gt;reg query &amp;quot;HKLM\SOFTWARE\BioWare\Dragon Age\Toolset\Environment&amp;quot; /v DefaultDatabaseConnection&amp;lt;/code&amp;gt;&lt;br /&gt;
*#:''Win64:'' &amp;lt;code&amp;gt;reg query &amp;quot;HKLM\SOFTWARE\Wow6432Node\BioWare\Dragon Age\Toolset\Environment&amp;quot; /v DefaultDatabaseConnection&amp;lt;/code&amp;gt;&lt;br /&gt;
*#Now run the following command line (substituting your connection string for the final value)&lt;br /&gt;
*#:&amp;lt;code&amp;gt;reg add &amp;quot;HKCU\Software\BioWare\Dragon Age\Toolset\Environment&amp;quot; /v DefaultDatabaseConnection /t REG_SZ /d &amp;quot;Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=bw_dragonage_content;Data Source=.\BWDATOOLSET&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:Double check your entry, a single incorrect character will cause the same &amp;quot;Unable to Connect&amp;quot; error.&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
==Full Manual Install==&lt;br /&gt;
Manual database installation works almost every time.  If it does not, it should at least give you clues as to why it is failing, which you do not generally get when using the toolset installer.  If this &amp;quot;cannot connect to the database&amp;quot; error is frustrating you and you want to just make it work, and don't want to keep troubleshooting, this is probably your best bet:&lt;br /&gt;
&lt;br /&gt;
# '''Install the toolset without any of the database options checked'''.[[Image:Toolset setup screen.png|right]]&lt;br /&gt;
#:Uncheck the following both of the database settings options as shown here.  This will just install the toolset files and do nothing at all with the database itself.  Of course, since SQL Server is not installed, you would still get the &amp;quot;Unable to to connect to the database&amp;quot; error at this point.&lt;br /&gt;
# '''Manually install SQL Server and restore the database'''&lt;br /&gt;
#:It is not as hard as it may sound, and is documented [[manual database installation|here]].  Basically, when you do this, you are taking control of the two steps that you told the installer not to do, and doing them on your own.  This is effective as this way you can babysit the installation process.  Running the SQL installer this way will throw more explicit errors at you when it is having problems, making it easier to diagnose the problems and find solutions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Why does this work?'''&lt;br /&gt;
&lt;br /&gt;
The toolset needs a database engine to run.  The installer has a copy of SQL Server 2005 embedded in it.  The idea behind this is that we could hide all the SQL Server installation, setup and administration voodoo, and do it all in the background so that you wouldn't have to figure out how to do it on your own.  When it works - it is great, when it doesn't - you land on this page...&lt;br /&gt;
&lt;br /&gt;
When the toolset has finished doing its business (essentially unpacking some files and setting up some permissions and registry entries) it then runs the SQL Server 2005 installer in &amp;quot;silent&amp;quot; mode, where it just tries to install with its default settings.  The toolset installer is &amp;quot;blind&amp;quot; to what goes on during the SQL install, it just gets a message when the SQL installer says &amp;quot;''I'm done''&amp;quot;, regardless of what kind of &amp;quot;''done''&amp;quot; that is.  It could be &amp;quot;''I just failed horribly, but I'm done failing now''&amp;quot; or it could be &amp;quot;''Whew, everything went as planned, I'm done''&amp;quot;.  Once the toolset installer gets that message, it says &amp;quot;''SQL is done, so I can now restore the database''&amp;quot;.  It then runs a command line to restore the database.  Again this process does not give proper feedback either, it just spits back another &amp;quot;''I'm done''&amp;quot; message, at which the toolset installer comes back and tells you it is finished.  Anything that goes wrong in this process will cause the dreaded error when you start the toolset.  Unfortunately there is no easy way for the installer to catch these problems and alert you.  Taking this process out of the installer's hands and running it manually allows you to see what is going wrong and react to it.  A quick internet search for any error that you get will often help you figure out what SQL Server is choking on in your particular case.&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
==Additional ideas==&lt;br /&gt;
&lt;br /&gt;
=== MSSQL Server cannot install to compressed or encrypted folders ===&lt;br /&gt;
SQL Server Setup cannot install files.&lt;br /&gt;
&lt;br /&gt;
Product: Microsoft SQL Server 2005 -- Error 28062. SQL Server Setup cannot install files to the compressed or encrypted folder: X:\. To continue, make sure that your installation directories are not compressed or encrypted, or specify a different directory, and then run SQL Server Setup again.&lt;br /&gt;
&lt;br /&gt;
Cause.&lt;br /&gt;
SQL Server 2005 program files and data files cannot be installed on a file system that uses compression.&lt;br /&gt;
&lt;br /&gt;
Solution.&lt;br /&gt;
You need to uncompressed the drives or folders where the SQL Server 2005 program files and data files will be placed. Please follow the steps below:&lt;br /&gt;
# From your Windows Explorer, navigate to the path where the SQL Server program files and data files will be placed&lt;br /&gt;
# Make a right click on the drive or folder and select Properties&lt;br /&gt;
# If you are seeing the properties of a folder click the Advanced button&lt;br /&gt;
# Click to clear the &amp;quot;Compress drive to save disk space&amp;quot; or &amp;quot;Compress contents to save disk space&amp;quot; check box&lt;br /&gt;
# Return to setup and continue installation.&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
=== Permissions issues ===&lt;br /&gt;
&lt;br /&gt;
* Sometimes disabling UAC (User Account Control) and reinstalling the toolset will allow the database to install properly.&lt;br /&gt;
&lt;br /&gt;
* SQL Server needs permission to read from the directory that the you have put the installation files, if it does not have permissions, it may be unable to import resources into the database. To correct this change the administrative privileges for the directory you're installing the toolset from.&lt;br /&gt;
&lt;br /&gt;
*On Vista systems the toolset may need administrator privileges to read the database where it's installed but fail to prompt you for them. Try right-clicking the toolset's shortcut and selecting &amp;quot;Run as Administrator&amp;quot; from the dropdown menu.&lt;br /&gt;
&lt;br /&gt;
* On Windows XP systems, you may need to run the toolset as the Administrator by right-clicking on the toolset's shortcut, selecting the &amp;quot;Run as...&amp;quot; menu item, and then select &amp;quot;The following user&amp;quot; radio button where you can enter the password for the Administrator account. &lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
==Other Miscellaneous Solutions==&lt;br /&gt;
* You can use SQL Server Express 2008 instead of 2005.  It is better suited to some of the permissions issues that occur in Vista and Windows 7.  Many users have installed SQL Server Express 2008 and are using it instead of 2005.  You could download it and follow the instructions [[Manual database installation|here]] substituting 2008 for 2005.&lt;br /&gt;
* You can try setting up your database separately from the toolset installer. See [[Manual database installation]] for the steps needed to install MSSQL Express 2005 and configure it for use with the toolset manually.  Users have been successful by setting up the toolset this way.&lt;br /&gt;
&lt;br /&gt;
* One User has reported that this sequence of events works:&lt;br /&gt;
::*Uninstall SQL server and the Toolset from PC.&lt;br /&gt;
::*Delete C:\Program Files\Microsoft SQL Server&lt;br /&gt;
::*In Regedit, delete the following:&lt;br /&gt;
:::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\MSSQLServer&lt;br /&gt;
:::HKEY_LOCAL_MACHINE\Software\Microsoft\Microsoft SQL Server&lt;br /&gt;
::*Reboot&lt;br /&gt;
::*Install Toolset with the SQL.&lt;br /&gt;
&lt;br /&gt;
*If you already have MSSQLServer Express installed as part of a different program, the toolset may not get the correct configuration to use it. Run the toolset configuration program (configuretoolset.exe, in the same directory as the toolset itself) and then click &amp;quot;next&amp;quot; through the configuration wizard until you get to the &amp;quot;Content Database&amp;quot; field. It should read: &amp;quot;&amp;lt;code&amp;gt;Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=bw_dragonage_content;Data Source=.\BWDATOOLSET&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*Some users report that the installer fails to create the SQL database (e.g. your &amp;lt;code&amp;gt;Dragon Age\toolssql\data&amp;lt;/code&amp;gt; folder is empty). You can enter the following command to try restoring the database manually (Change the paths to &amp;lt;code&amp;gt;bw_dragonage_content.bak&amp;lt;/code&amp;gt; and your Dragon Age folder as appropriate): &amp;lt;code&amp;gt;&amp;quot;C:\Program Files\Microsoft SQL Server\90\Tools\Binn\&amp;quot;sqlcmd -S .\BWDATOOLSET -E -Q &amp;quot;RESTORE DATABASE bw_dragonage_content FROM DISK = 'C:\Program Files\Dragon Age\tools\dbbak\bw_dragonage_content.bak' WITH MOVE 'bw_dragonage_content' TO 'C:\Program Files\Dragon Age\tools\toolssql\Data\bw_dragonage_content.mdf', MOVE 'bw_dragonage_content_Log' TO 'C:\Program Files\Dragon Age\tools\toolssql\Data\bw_dragonage_content.ldf'&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You need to allow Users to Modify the DATA folder, before you can execute this command.&lt;br /&gt;
&lt;br /&gt;
*Some users have been successful simply installing from a more direct path (eg place the installer in C:\DAInstall and then run the exe file from that location rather than from My Documents or a similar long path).&lt;br /&gt;
&lt;br /&gt;
*[http://social.bioware.com/project/2804/ NErWOnek's pictorial guide] may help.&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Toolset bugs]]&lt;br /&gt;
[[Category:Database]]&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Unable_to_connect_to_the_database&amp;diff=15375</id>
		<title>Unable to connect to the database</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Unable_to_connect_to_the_database&amp;diff=15375"/>
				<updated>2011-01-02T20:06:44Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: Mentioning the ERRORLOG file's information.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:unable to connect to database.png|right]]&lt;br /&gt;
When the toolset throws this error, it indicates that there was some kind of problem when attempting to connect to the SQL Server Express 2005 database. Unfortunately, this is common, but unpredictable. When the toolset starts up, it attempts to connect to the database.  If the database does not respond, it simply returns this error. The toolset has no ability to diagnose why   &lt;br /&gt;
&lt;br /&gt;
This error is kind of like the &amp;quot;Service Engine&amp;quot; light on your vehicle.  When the service engine light starts flashing, it means something is wrong, but it is a very general warning that does not give you much information on what is wrong, just that something is wrong.  The cause of it could be anything from a loose gas cap to a failed spark plug to some bad sensor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Diagnosing the Problem==&lt;br /&gt;
When it comes to the cannot connect error, it can range from the long file path issue to interference from UAC, to permissions issues, to a conflict with an existing installation of SQL Server, to registry entries, to the location of the installation file on your computer. The list is long. Here is a troubleshooting guide to try and help you diagnose what particular problem is vexing you and how to repair it.  If the troubleshooting is getting you nowhere, the [[#Full Manual Install|full manual install]] is another method that may be more effective, as you take things into your own hands and have better visibility to errors.&lt;br /&gt;
 &lt;br /&gt;
As a potential source of more information to diagnose the problem with, you could always look for connection errors in {{dashedborder|C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\Log\ERRORLOG''}}. You may have to use an administrator account to read this file. As an example ERRORLOG entry:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2011-01-02 11:32:15.08 Logon       Error: 18456, Severity: 14, State: 38.&lt;br /&gt;
2011-01-02 11:32:15.08 Logon       Login failed for user 'EXAMPLE\Example'. Reason: Failed to open the explicitly specified database. [CLIENT: &amp;lt;named pipe&amp;gt;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please note that Windows 7 automatically locks the files found in c:/ and will have a lock icon on the folder. You will have to right click on the folder, choose share with and click on homegroup(read/write).&lt;br /&gt;
You also may have to exit and open c:/ again to make sure that it took affect. This would allow the installer to access the games file to properly install MSSQL Server Express.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
{| cellspacing = &amp;quot;5&amp;quot; cellpadding = &amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; class=&amp;quot;toc&amp;quot;&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; |  [[#Did the database get restored?|Did the database get restored / created?]]&lt;br /&gt;
| No&amp;lt;br/&amp;gt;&amp;amp;rarr;&lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; | [[#Did SQL Server Install?|Did MSSQL Express install?]]&lt;br /&gt;
| No&amp;lt;br/&amp;gt;&amp;amp;rarr;&lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; align=&amp;quot;left&amp;quot; | Possible solutions:&lt;br /&gt;
# Permissions issues: run installer as administrator&lt;br /&gt;
# Path length&lt;br /&gt;
# Compressed drive&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Yes&amp;lt;br/&amp;gt; &amp;amp;darr;&lt;br /&gt;
|&lt;br /&gt;
| Yes&amp;lt;br/&amp;gt; &amp;amp;darr;&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; | [[#Is the Database Service Running|Is the database service running?]]&lt;br /&gt;
| &lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; | [[Database backup and restore#Restoring the Database if it failed after Installation|Restore database and re-run toolset]]&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
{| cellspacing = &amp;quot;5&amp;quot; cellpadding = &amp;quot;2&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;background-color:transparent&amp;quot;&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Yes&amp;lt;br/&amp;gt;&amp;amp;darr;&lt;br /&gt;
| No&amp;lt;br/&amp;gt;&amp;amp;darr;&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; | [[#Is the Toolset correctly pointing to database?|Is the Toolset correctly pointing to database?]]&lt;br /&gt;
| style=&amp;quot;border:solid 1px&amp;quot; | Start service and re-run toolset&lt;br /&gt;
|}&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Is the Database Service Running===&lt;br /&gt;
&lt;br /&gt;
If the service is running, it is an indication that SQL Server has installed correctly and the database is available for use by the toolset.&lt;br /&gt;
&lt;br /&gt;
You can check to see if the Database Service is running by navigating to your the Services application.  Depending on your operating system, the path may be a bit different, but it should be along the lines of &amp;lt;code&amp;gt;Start&amp;gt;&amp;gt;Control Panel&amp;gt;&amp;gt;Administrative Tools&amp;gt;&amp;gt;Services&amp;lt;/code&amp;gt;(alternately type &amp;quot;services.msc&amp;quot; (excluding quotes) into a run window)&lt;br /&gt;
&lt;br /&gt;
Scroll down through the list and look for a service named &amp;quot;SQL Server (BWDATOOLSET)&amp;quot;.  Check the Status of the service.  If the status is anything other than &amp;quot;Running&amp;quot; (or, possibly, &amp;quot;Started&amp;quot; in the case of Windows XP users), right click on it and select &amp;quot;Start&amp;quot;.  If it then starts successfully the status will change to &amp;quot;Running&amp;quot; &lt;br /&gt;
&lt;br /&gt;
If the Service refuses to Start or does not exist, more troubleshooting is needed some kind of installation issue with SQL Server.  We need to look at the properties on the service and figure out where to go from here.  One thing I have seen is that it is left over from some manual file deletions,  the .mdf and .ldf files no longer exist, but the service is still there.  Path to executable field may hold some clues. here.&lt;br /&gt;
&lt;br /&gt;
* Ensure SQL Server (BWDATOOLSET): Open the '''SQL Server Configuration Manager''' (by default &amp;lt;code&amp;gt;Start | Microsoft SQL Server 2005 | Configuration Tools | SQL Server Configuration Manager&amp;lt;/code&amp;gt;) and in the object tree in the left hand panel click on the '''SQL Server 2005 Services''' entry. Ensure entry for '''SQL Server (BWDATOOLSET)''' appearing in the right hand panel has a '''State''' of '''Running'''.  If not select it and start it (either using the button on the toolbar or the option in the context menu).&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
===Did SQL Server Install?===&lt;br /&gt;
Check your Start menu and see if it installed at all.  Go to Start&amp;gt;&amp;gt;Program Files&amp;gt;&amp;gt;Microsoft SQL Server 2005.  If nothing exists here then there are two basic explanations:&lt;br /&gt;
# When you ran the installer, you may have unchecked the option to Install MSSQL Express 2005 SP3.  If this is the case.  Try running the toolset installer a second time, make sure that you leave that option checked so that the installer will attempt to install SQL Server 2005.&lt;br /&gt;
# Something went wrong with the SQL Server installation and it failed to install at all.  You can try installing the toolset again.  If this is unsuccessful, you can try downloading and installing it [[Manual database installation|manually]].&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
===Did the database get restored?===&lt;br /&gt;
Check the toolset installation directory for the restored database files.  Depending on where you installed the Game and Toolset, they will be in a location similar to&lt;br /&gt;
{{dashedborder|C:\Program Files\Dragon Age\tools\toolssql\Data\ &amp;lt;--- version 1.00 installed under the Tools folder&lt;br /&gt;
or&lt;br /&gt;
C:\Program Files\DAODB\ &amp;lt;--- version 1.01 of the toolset goes here, avoiding long path issue}}&lt;br /&gt;
Browse to this location and look for the existence of the following two files:&lt;br /&gt;
{{dashedborder|bw_dragonage_content.ldf}}&lt;br /&gt;
and&lt;br /&gt;
{{dashedborder|bw_dragonage_content.mdf}}&lt;br /&gt;
&lt;br /&gt;
'''If these files exist''', it indicates that the SQL Server was installed, and that the actual Dragon Age toolset database was restored.  If they are not present, the restore function failed for some reason.  If the files exist, continue on to the next step of the troubleshooter.&lt;br /&gt;
&lt;br /&gt;
'''If the files do not exist''', you can attempt to restore them in a number of ways:&lt;br /&gt;
&lt;br /&gt;
:'''1.''' Download and use SQL Management Studio to create the database and restore the content database.  This is covered in the [[Manual database installation|manual database installation]] article.  Since the SQL Server is installed, you should be able to skip the first step, and start from the heading &amp;quot;Installing SQL Server Management Studio Express&amp;quot;&lt;br /&gt;
:'''2.''' Running the restore operation through a &amp;quot;batch&amp;quot; file manually. See [[Database backup and restore#Restoring the Database if it failed after Installation|Restoring the Database if it failed after Installation]]. Also added a section about Error Handling, because the batch file presents error numbers.&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
===Is the Toolset correctly pointing to database?=== &lt;br /&gt;
Run [[Configure Toolset]] to send the toolset in the right direction and test the database connection.&lt;br /&gt;
&lt;br /&gt;
Notes: &lt;br /&gt;
*It has been observed that for some builds that the Toolset is not looking at the correct registry keys perhaps due to permission restrictions.  &lt;br /&gt;
*#First use the ConfigureToolset to set the correct string.&lt;br /&gt;
*#:If you don't use the default settings you can copy the string from from the ConfigureToolset tool otherwise use one of the following command line queries to get the connection string.&lt;br /&gt;
*#:''Win32:'' &amp;lt;code&amp;gt;reg query &amp;quot;HKLM\SOFTWARE\BioWare\Dragon Age\Toolset\Environment&amp;quot; /v DefaultDatabaseConnection&amp;lt;/code&amp;gt;&lt;br /&gt;
*#:''Win64:'' &amp;lt;code&amp;gt;reg query &amp;quot;HKLM\SOFTWARE\Wow6432Node\BioWare\Dragon Age\Toolset\Environment&amp;quot; /v DefaultDatabaseConnection&amp;lt;/code&amp;gt;&lt;br /&gt;
*#Now run the following command line (substituting your connection string for the final value)&lt;br /&gt;
*#:&amp;lt;code&amp;gt;reg add &amp;quot;HKCU\Software\BioWare\Dragon Age\Toolset\Environment&amp;quot; /v DefaultDatabaseConnection /t REG_SZ /d &amp;quot;Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=bw_dragonage_content;Data Source=.\BWDATOOLSET&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
:Double check your entry, a single incorrect character will cause the same &amp;quot;Unable to Connect&amp;quot; error.&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
==Full Manual Install==&lt;br /&gt;
Manual database installation works almost every time.  If it does not, it should at least give you clues as to why it is failing, which you do not generally get when using the toolset installer.  If this &amp;quot;cannot connect to the database&amp;quot; error is frustrating you and you want to just make it work, and don't want to keep troubleshooting, this is probably your best bet:&lt;br /&gt;
&lt;br /&gt;
# '''Install the toolset without any of the database options checked'''.[[Image:Toolset setup screen.png|right]]&lt;br /&gt;
#:Uncheck the following both of the database settings options as shown here.  This will just install the toolset files and do nothing at all with the database itself.  Of course, since SQL Server is not installed, you would still get the &amp;quot;Unable to to connect to the database&amp;quot; error at this point.&lt;br /&gt;
# '''Manually install SQL Server and restore the database'''&lt;br /&gt;
#:It is not as hard as it may sound, and is documented [[manual database installation|here]].  Basically, when you do this, you are taking control of the two steps that you told the installer not to do, and doing them on your own.  This is effective as this way you can babysit the installation process.  Running the SQL installer this way will throw more explicit errors at you when it is having problems, making it easier to diagnose the problems and find solutions.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Why does this work?'''&lt;br /&gt;
&lt;br /&gt;
The toolset needs a database engine to run.  The installer has a copy of SQL Server 2005 embedded in it.  The idea behind this is that we could hide all the SQL Server installation, setup and administration voodoo, and do it all in the background so that you wouldn't have to figure out how to do it on your own.  When it works - it is great, when it doesn't - you land on this page...&lt;br /&gt;
&lt;br /&gt;
When the toolset has finished doing its business (essentially unpacking some files and setting up some permissions and registry entries) it then runs the SQL Server 2005 installer in &amp;quot;silent&amp;quot; mode, where it just tries to install with its default settings.  The toolset installer is &amp;quot;blind&amp;quot; to what goes on during the SQL install, it just gets a message when the SQL installer says &amp;quot;''I'm done''&amp;quot;, regardless of what kind of &amp;quot;''done''&amp;quot; that is.  It could be &amp;quot;''I just failed horribly, but I'm done failing now''&amp;quot; or it could be &amp;quot;''Whew, everything went as planned, I'm done''&amp;quot;.  Once the toolset installer gets that message, it says &amp;quot;''SQL is done, so I can now restore the database''&amp;quot;.  It then runs a command line to restore the database.  Again this process does not give proper feedback either, it just spits back another &amp;quot;''I'm done''&amp;quot; message, at which the toolset installer comes back and tells you it is finished.  Anything that goes wrong in this process will cause the dreaded error when you start the toolset.  Unfortunately there is no easy way for the installer to catch these problems and alert you.  Taking this process out of the installer's hands and running it manually allows you to see what is going wrong and react to it.  A quick internet search for any error that you get will often help you figure out what SQL Server is choking on in your particular case.&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
==Additional ideas==&lt;br /&gt;
&lt;br /&gt;
=== MSSQL Server cannot install to compressed or encrypted folders ===&lt;br /&gt;
SQL Server Setup cannot install files.&lt;br /&gt;
&lt;br /&gt;
Product: Microsoft SQL Server 2005 -- Error 28062. SQL Server Setup cannot install files to the compressed or encrypted folder: X:\. To continue, make sure that your installation directories are not compressed or encrypted, or specify a different directory, and then run SQL Server Setup again.&lt;br /&gt;
&lt;br /&gt;
Cause.&lt;br /&gt;
SQL Server 2005 program files and data files cannot be installed on a file system that uses compression.&lt;br /&gt;
&lt;br /&gt;
Solution.&lt;br /&gt;
You need to uncompressed the drives or folders where the SQL Server 2005 program files and data files will be placed. Please follow the steps below:&lt;br /&gt;
# From your Windows Explorer, navigate to the path where the SQL Server program files and data files will be placed&lt;br /&gt;
# Make a right click on the drive or folder and select Properties&lt;br /&gt;
# If you are seeing the properties of a folder click the Advanced button&lt;br /&gt;
# Click to clear the &amp;quot;Compress drive to save disk space&amp;quot; or &amp;quot;Compress contents to save disk space&amp;quot; check box&lt;br /&gt;
# Return to setup and continue installation.&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
=== Permissions issues ===&lt;br /&gt;
&lt;br /&gt;
* Sometimes disabling UAC (User Account Control) and reinstalling the toolset will allow the database to install properly.&lt;br /&gt;
&lt;br /&gt;
* SQL Server needs permission to read from the directory that the you have put the installation files, if it does not have permissions, it may be unable to import resources into the database. To correct this change the administrative privileges for the directory you're installing the toolset from.&lt;br /&gt;
&lt;br /&gt;
*On Vista systems the toolset may need administrator privileges to read the database where it's installed but fail to prompt you for them. Try right-clicking the toolset's shortcut and selecting &amp;quot;Run as Administrator&amp;quot; from the dropdown menu.&lt;br /&gt;
&lt;br /&gt;
* On Windows XP systems, you may need to run the toolset as the Administrator by right-clicking on the toolset's shortcut, selecting the &amp;quot;Run as...&amp;quot; menu item, and then select &amp;quot;The following user&amp;quot; radio button where you can enter the password for the Administrator account. &lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
==Other Miscellaneous Solutions==&lt;br /&gt;
* You can use SQL Server Express 2008 instead of 2005.  It is better suited to some of the permissions issues that occur in Vista and Windows 7.  Many users have installed SQL Server Express 2008 and are using it instead of 2005.  You could download it and follow the instructions [[Manual database installation|here]] substituting 2008 for 2005.&lt;br /&gt;
* You can try setting up your database separately from the toolset installer. See [[Manual database installation]] for the steps needed to install MSSQL Express 2005 and configure it for use with the toolset manually.  Users have been successful by setting up the toolset this way.&lt;br /&gt;
&lt;br /&gt;
* One User has reported that this sequence of events works:&lt;br /&gt;
::*Uninstall SQL server and the Toolset from PC.&lt;br /&gt;
::*Delete C:\Program Files\Microsoft SQL Server&lt;br /&gt;
::*In Regedit, delete the following:&lt;br /&gt;
:::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\MSSQLServer&lt;br /&gt;
:::HKEY_LOCAL_MACHINE\Software\Microsoft\Microsoft SQL Server&lt;br /&gt;
::*Reboot&lt;br /&gt;
::*Install Toolset with the SQL.&lt;br /&gt;
&lt;br /&gt;
*If you already have MSSQLServer Express installed as part of a different program, the toolset may not get the correct configuration to use it. Run the toolset configuration program (configuretoolset.exe, in the same directory as the toolset itself) and then click &amp;quot;next&amp;quot; through the configuration wizard until you get to the &amp;quot;Content Database&amp;quot; field. It should read: &amp;quot;&amp;lt;code&amp;gt;Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=bw_dragonage_content;Data Source=.\BWDATOOLSET&amp;lt;/code&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
*Some users report that the installer fails to create the SQL database (e.g. your &amp;lt;code&amp;gt;Dragon Age\toolssql\data&amp;lt;/code&amp;gt; folder is empty). You can enter the following command to try restoring the database manually (Change the paths to &amp;lt;code&amp;gt;bw_dragonage_content.bak&amp;lt;/code&amp;gt; and your Dragon Age folder as appropriate): &amp;lt;code&amp;gt;&amp;quot;C:\Program Files\Microsoft SQL Server\90\Tools\Binn\&amp;quot;sqlcmd -S .\BWDATOOLSET -E -Q &amp;quot;RESTORE DATABASE bw_dragonage_content FROM DISK = 'C:\Program Files\Dragon Age\tools\dbbak\bw_dragonage_content.bak' WITH MOVE 'bw_dragonage_content' TO 'C:\Program Files\Dragon Age\tools\toolssql\Data\bw_dragonage_content.mdf', MOVE 'bw_dragonage_content_Log' TO 'C:\Program Files\Dragon Age\tools\toolssql\Data\bw_dragonage_content.ldf'&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You need to allow Users to Modify the DATA folder, before you can execute this command.&lt;br /&gt;
&lt;br /&gt;
*Some users have been successful simply installing from a more direct path (eg place the installer in C:\DAInstall and then run the exe file from that location rather than from My Documents or a similar long path).&lt;br /&gt;
&lt;br /&gt;
*[http://social.bioware.com/project/2804/ NErWOnek's pictorial guide] may help.&lt;br /&gt;
&lt;br /&gt;
[[#top|&amp;amp;uarr; Return to top]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Toolset bugs]]&lt;br /&gt;
[[Category:Database]]&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Talk:Follower_tutorial&amp;diff=15347</id>
		<title>Talk:Follower tutorial</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Talk:Follower_tutorial&amp;diff=15347"/>
				<updated>2011-01-01T18:01:05Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Handling followers more robustly ==&lt;br /&gt;
&lt;br /&gt;
Just a few things&lt;br /&gt;
* I don't think the described behaviour is a bug in [[UT_HireFollower]](). It's documented that &amp;quot;This function will do nothing for plot followers&amp;quot;. It was never intended for use with normal followers, and the code even checks the object tag against the single player campaign's companions. It'll fail to check against your own module's custom followers, though, so it'll do something, but that something isn't always what you want either.&lt;br /&gt;
&lt;br /&gt;
* Plot script gen00pt_party.nss and party_h have some plot-companion handling functions. I wouldn't really give it a short treatment at the bottom under &amp;quot;Advanced Follower Creation&amp;quot; if it's a solid approach. See things like Party_GetFollowerByTag in party_h with an interesting function and comment:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
object Party_GetFollowerByTag(string sTag)&lt;br /&gt;
{&lt;br /&gt;
    // We have to retrieve the follower like this. Trying to do it with&lt;br /&gt;
    // GetObjectByTag proved to mess up lots of stuff. -- yaron.&lt;br /&gt;
    object [] arParty = GetPartyPoolList();&lt;br /&gt;
    int i;&lt;br /&gt;
    int nSize = GetArraySize(arParty);&lt;br /&gt;
    object oCurrent;&lt;br /&gt;
    for(i = 0; i &amp;lt; nSize; i++)&lt;br /&gt;
    {&lt;br /&gt;
        oCurrent = arParty[i];&lt;br /&gt;
        if(GetTag(oCurrent) == sTag)&lt;br /&gt;
            return oCurrent;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return UT_GetNearestObjectByTag(GetMainControlled(), sTag, TRUE);&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* It's probably worth going through those scripts and adapting them for general tutorial use. That way we can benefit from whatever gotchas have already been solved.&lt;br /&gt;
&lt;br /&gt;
--[[User:FollowTheGourd|FollowTheGourd]] 17:52, 1 January 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
== ==&lt;br /&gt;
&lt;br /&gt;
great tutorial. my only problem is: my companion, Erik has different skills and doesn't seem to follow his autolevel template. --[[User:Mono0x32440|Mono0x32440]] 17:46, 25 February 2010 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Follower's Portrait ==&lt;br /&gt;
&lt;br /&gt;
I cannot figure out how to change the default grey backgrounded portrait for the new followers. It would be nice to have pose and background options.&lt;br /&gt;
&lt;br /&gt;
== Dog equipment slots ==&lt;br /&gt;
&lt;br /&gt;
Mention should be made of the fact that a dog follower needs to have the appropriate equipment slot mask. I will make the addition to the text if no-one has any objections/suggestions in a couple of days. --[[User:Gaxkang55|Gaxkang55]] 09:38, 21 October 2010 (UTC)&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Talk:Follower_tutorial&amp;diff=15346</id>
		<title>Talk:Follower tutorial</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Talk:Follower_tutorial&amp;diff=15346"/>
				<updated>2011-01-01T17:53:38Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: /* Handling followers more robustly */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Handling followers more robustly ==&lt;br /&gt;
&lt;br /&gt;
Just a few things&lt;br /&gt;
* I don't think the described behaviour is a bug in [[UT_HireFollower]](). It's documented that &amp;quot;This function will do nothing for plot followers&amp;quot;. It was never intended for use with normal followers, and the code even checks the object tag against the single player campaign's companions. It'll fail to check against your own module's custom followers, though, so it'll do something, but that something isn't what you want either.&lt;br /&gt;
&lt;br /&gt;
* Plot script gen00pt_party.nss and party_h have some plot-companion handling functions. I wouldn't really give it a short treatment at the bottom under &amp;quot;Advanced Follower Creation&amp;quot; if it's a solid approach. See things like Party_GetFollowerByTag in party_h with an interesting function and comment:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
object Party_GetFollowerByTag(string sTag)&lt;br /&gt;
{&lt;br /&gt;
    // We have to retrieve the follower like this. Trying to do it with&lt;br /&gt;
    // GetObjectByTag proved to mess up lots of stuff. -- yaron.&lt;br /&gt;
    object [] arParty = GetPartyPoolList();&lt;br /&gt;
    int i;&lt;br /&gt;
    int nSize = GetArraySize(arParty);&lt;br /&gt;
    object oCurrent;&lt;br /&gt;
    for(i = 0; i &amp;lt; nSize; i++)&lt;br /&gt;
    {&lt;br /&gt;
        oCurrent = arParty[i];&lt;br /&gt;
        if(GetTag(oCurrent) == sTag)&lt;br /&gt;
            return oCurrent;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return UT_GetNearestObjectByTag(GetMainControlled(), sTag, TRUE);&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* It's probably worth going through those scripts and adapting them for general tutorial use. That way we can benefit from whatever gotchas have already been solved.&lt;br /&gt;
&lt;br /&gt;
--[[User:FollowTheGourd|FollowTheGourd]] 17:52, 1 January 2011 (UTC)&lt;br /&gt;
&lt;br /&gt;
== ==&lt;br /&gt;
&lt;br /&gt;
great tutorial. my only problem is: my companion, Erik has different skills and doesn't seem to follow his autolevel template. --[[User:Mono0x32440|Mono0x32440]] 17:46, 25 February 2010 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Follower's Portrait ==&lt;br /&gt;
&lt;br /&gt;
I cannot figure out how to change the default grey backgrounded portrait for the new followers. It would be nice to have pose and background options.&lt;br /&gt;
&lt;br /&gt;
== Dog equipment slots ==&lt;br /&gt;
&lt;br /&gt;
Mention should be made of the fact that a dog follower needs to have the appropriate equipment slot mask. I will make the addition to the text if no-one has any objections/suggestions in a couple of days. --[[User:Gaxkang55|Gaxkang55]] 09:38, 21 October 2010 (UTC)&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Talk:Follower_tutorial&amp;diff=15345</id>
		<title>Talk:Follower tutorial</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Talk:Follower_tutorial&amp;diff=15345"/>
				<updated>2011-01-01T17:52:56Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Handling followers more robustly ==&lt;br /&gt;
&lt;br /&gt;
Just a few things&lt;br /&gt;
* I don't think the described behaviour is a bug in [[UT_HireFollower]](). It's documented that ''This function will do nothing for plot followers'. It was never intended for use with normal followers, and the code even checks the object tag against the single player campaign's companions. It'll fail to check against your own module's custom followers, though, so it'll do something, but that something isn't what you want either.&lt;br /&gt;
&lt;br /&gt;
* Plot script gen00pt_party.nss and party_h have some plot-companion handling functions. I wouldn't really give it a short treatment at the bottom under &amp;quot;Advanced Follower Creation&amp;quot; if it's a solid approach. See things like Party_GetFollowerByTag in party_h with an interesting function and comment:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
object Party_GetFollowerByTag(string sTag)&lt;br /&gt;
{&lt;br /&gt;
    // We have to retrieve the follower like this. Trying to do it with&lt;br /&gt;
    // GetObjectByTag proved to mess up lots of stuff. -- yaron.&lt;br /&gt;
    object [] arParty = GetPartyPoolList();&lt;br /&gt;
    int i;&lt;br /&gt;
    int nSize = GetArraySize(arParty);&lt;br /&gt;
    object oCurrent;&lt;br /&gt;
    for(i = 0; i &amp;lt; nSize; i++)&lt;br /&gt;
    {&lt;br /&gt;
        oCurrent = arParty[i];&lt;br /&gt;
        if(GetTag(oCurrent) == sTag)&lt;br /&gt;
            return oCurrent;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return UT_GetNearestObjectByTag(GetMainControlled(), sTag, TRUE);&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* It's probably worth going through those scripts and adapting them for general tutorial use. That way we can benefit from whatever gotchas have already been solved.&lt;br /&gt;
&lt;br /&gt;
--[[User:FollowTheGourd|FollowTheGourd]] 17:52, 1 January 2011 (UTC)  &lt;br /&gt;
&lt;br /&gt;
== ==&lt;br /&gt;
&lt;br /&gt;
great tutorial. my only problem is: my companion, Erik has different skills and doesn't seem to follow his autolevel template. --[[User:Mono0x32440|Mono0x32440]] 17:46, 25 February 2010 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Follower's Portrait ==&lt;br /&gt;
&lt;br /&gt;
I cannot figure out how to change the default grey backgrounded portrait for the new followers. It would be nice to have pose and background options.&lt;br /&gt;
&lt;br /&gt;
== Dog equipment slots ==&lt;br /&gt;
&lt;br /&gt;
Mention should be made of the fact that a dog follower needs to have the appropriate equipment slot mask. I will make the addition to the text if no-one has any objections/suggestions in a couple of days. --[[User:Gaxkang55|Gaxkang55]] 09:38, 21 October 2010 (UTC)&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Talk:2DA_ranges_in_use&amp;diff=15164</id>
		<title>Talk:2DA ranges in use</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Talk:2DA_ranges_in_use&amp;diff=15164"/>
				<updated>2010-12-03T03:04:46Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;placeable_types is apparently restricted to 65535 entries, but even if that's enough, it might make some sense to reserve a range for all standalone modules, which don't need to worry about conflicting with each other. I can verify myself that they work in the addin's module directory. --[[User:FollowTheGourd|FollowTheGourd]] 07:52, 29 November 2010 (UTC)&lt;br /&gt;
:As a temporary expedient, the reserved range for all standalone campaigns is sensible, but maybe campaigns should claim unique ranges, too, in case the bug is fixed one day. Conflict between standalone campaigns can and will occur unless compatibility guidelines are followed by everyone (and that's not going to happen IMO). [[User:Proleric1|Proleric1]] 07:00, 30 November 2010 (UTC)&lt;br /&gt;
::But if they don't care about compatibility, couldn't conflicts still happen either way? I guess the one advantage of still having a unique range for a standalone module is if others unnecessarily put their GDAs into core. --[[User:FollowTheGourd|FollowTheGourd]] 02:41, 2 December 2010 (UTC)&lt;br /&gt;
:::You're right, we can't be certain of achieving compatibility. However, using a unique range for the module tends to reduce the probability of conflict (especially if it's a very large number c.f. string id). Assigning the same range to all standalone modules strikes me as especially risky, because it only takes one to put its M2DA in packages override to corrupt them all. What do you think? [[User:Proleric1|Proleric1]] 10:01, 2 December 2010 (UTC)   &lt;br /&gt;
::::Yeah, I see your point there - not just an issue of conflicting with one mod but with all that tried to be compatible by using the smaller, less random, reserved range. --[[User:FollowTheGourd|FollowTheGourd]] 03:04, 3 December 2010 (UTC)&lt;br /&gt;
&lt;br /&gt;
Are we not bothering with reserving variant ranges until the &amp;gt;255 bug is fixed? Or should we start a land grab for this valuable space? I've been using variant IDs of 137-140 in my current stuff. [[User:Nezroy|Nezroy]] 10:28, 25 February 2010 (UTC)&lt;br /&gt;
:I don't think it would hurt to still mention what you're using... I guess we'll run out of space at which point it'll probably be a good way to pick and choose who you want to be incompatible with. [[User:FollowTheGourd|FollowTheGourd]] 02:38, 9 April 2010 (UTC)&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Talk:2DA_ranges_in_use&amp;diff=15155</id>
		<title>Talk:2DA ranges in use</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Talk:2DA_ranges_in_use&amp;diff=15155"/>
				<updated>2010-12-02T02:41:43Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;placeable_types is apparently restricted to 65535 entries, but even if that's enough, it might make some sense to reserve a range for all standalone modules, which don't need to worry about conflicting with each other. I can verify myself that they work in the addin's module directory. --[[User:FollowTheGourd|FollowTheGourd]] 07:52, 29 November 2010 (UTC)&lt;br /&gt;
:As a temporary expedient, the reserved range for all standalone campaigns is sensible, but maybe campaigns should claim unique ranges, too, in case the bug is fixed one day. Conflict between standalone campaigns can and will occur unless compatibility guidelines are followed by everyone (and that's not going to happen IMO). [[User:Proleric1|Proleric1]] 07:00, 30 November 2010 (UTC)&lt;br /&gt;
::But if they don't care about compatibility, couldn't conflicts still happen either way? I guess the one advantage of still having a unique range for a standalone module is if others unnecessarily put their GDAs into core. --[[User:FollowTheGourd|FollowTheGourd]] 02:41, 2 December 2010 (UTC)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Are we not bothering with reserving variant ranges until the &amp;gt;255 bug is fixed? Or should we start a land grab for this valuable space? I've been using variant IDs of 137-140 in my current stuff. [[User:Nezroy|Nezroy]] 10:28, 25 February 2010 (UTC)&lt;br /&gt;
:I don't think it would hurt to still mention what you're using... I guess we'll run out of space at which point it'll probably be a good way to pick and choose who you want to be incompatible with. [[User:FollowTheGourd|FollowTheGourd]] 02:38, 9 April 2010 (UTC)&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Talk:2DA_ranges_in_use&amp;diff=15044</id>
		<title>Talk:2DA ranges in use</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Talk:2DA_ranges_in_use&amp;diff=15044"/>
				<updated>2010-11-29T07:52:20Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;placeable_types is apparently restricted to 65535 entries, but even if that's enough, it might make some sense to reserve a range for all standalone modules, which don't need to worry about conflicting with each other. I can verify myself that they work in the addin's module directory. --[[User:FollowTheGourd|FollowTheGourd]] 07:52, 29 November 2010 (UTC)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Are we not bothering with reserving variant ranges until the &amp;gt;255 bug is fixed? Or should we start a land grab for this valuable space? I've been using variant IDs of 137-140 in my current stuff. [[User:Nezroy|Nezroy]] 10:28, 25 February 2010 (UTC)&lt;br /&gt;
:I don't think it would hurt to still mention what you're using... I guess we'll run out of space at which point it'll probably be a good way to pick and choose who you want to be incompatible with. [[User:FollowTheGourd|FollowTheGourd]] 02:38, 9 April 2010 (UTC)&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=2DA_ranges_in_use&amp;diff=15043</id>
		<title>2DA ranges in use</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=2DA_ranges_in_use&amp;diff=15043"/>
				<updated>2010-11-29T07:50:21Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: /* placeable_types */ stand alone modules - couldn't we just use a shared range for those?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is meant to enumerate row ID ranges that are used by the main game and by various popular addins, to avoid accidental overlap. See also [[Prefixes in use]] and [[Compatibility]].&lt;br /&gt;
&lt;br /&gt;
Note that there's no need for 2DA row IDs to be sequential, so you can use very large row ID numbers to reduce the chances of collision.&lt;br /&gt;
&lt;br /&gt;
Version 1.0 of the toolset had a bug in ExcelProcessor that caused problems with high row ID numbers, but this has been fixed in subsequent releases. See [[Bug: ExcelProcessor doesn't handle row IDs above 8.3 million correctly|the bug report]].&lt;br /&gt;
&lt;br /&gt;
As of now there is a bug that prevents ID's above 255 to be used for some M2DA's. Most certainly it is ''&amp;quot;only&amp;quot;'' [[ItemVariations.xls]] related. See [[Bug: High M2DA ID ranges might work in the toolset, but not in game|Bug report]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ABI_base ==&lt;br /&gt;
&lt;br /&gt;
According to the [[ABI_base]] page under the ''tooltipstrref'' column, anything over 500000 is considered a debuff. This would limit the range a fair amount.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 200262'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000 - 38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 50000 - 50001&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/861/ Advanced Tactics]&lt;br /&gt;
|-&lt;br /&gt;
| 51000 - 51002&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/1888/ Advanced Quickbar]&lt;br /&gt;
|-&lt;br /&gt;
| 901974-903000 and 401974-401990(modal)&lt;br /&gt;
| Idomeneas' [http://social.bioware.com/project/3152/ Valeria Addon]&lt;br /&gt;
|-&lt;br /&gt;
| 2560000 - 2560500&lt;br /&gt;
| Timelord's [http://social.bioware.com/project/1845/ Blood and Lyrium]&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680250&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000 - 40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 300000-300047&lt;br /&gt;
| rebel5555's [http://social.bioware.com/project/2646/ 2 Handed Weapon Abilities for Arcane Warriors]&lt;br /&gt;
|-&lt;br /&gt;
| 300000-300047&lt;br /&gt;
| rebel5555's [http://social.bioware.com/project/3637/ Dual Weapon Abilities for Arcane Warriors]&lt;br /&gt;
|-&lt;br /&gt;
| 300000-300047&lt;br /&gt;
| rebel5555's [http://social.bioware.com/project/2644/ Weapon and Shield Abilities for Arcane Warriors]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== AI_TacticsPresets ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 9'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| 10 - 15&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/861/ Advanced Tactics]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
== ambient_ai ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| 1000000-1001000&lt;br /&gt;
| [http://social.bioware.com/project/178/ Crown of Creation]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== ANIM_base ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| 65000 - 65002&lt;br /&gt;
| BioSpirit's [http://social.bioware.com/project/1647/ Hilltop Under Siege]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== APR_base ==&lt;br /&gt;
&lt;br /&gt;
Note that there is a bug involving this 2DA: [[Bug: APR base maximum M2DA row ID is 65535 in the toolset]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 90'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000 - 38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 40000 - 40010&lt;br /&gt;
| [http://social.bioware.com/project/3175/ Horses]&lt;br /&gt;
|-&lt;br /&gt;
| 65000 - 65001&lt;br /&gt;
| BioSpirit's [http://social.bioware.com/project/1647/ Hilltop Under Siege]&lt;br /&gt;
|-&lt;br /&gt;
| 55000 - 57000&lt;br /&gt;
| World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
||-&lt;br /&gt;
| 65010 - 65025&lt;br /&gt;
| Mutantspicy Oracle and Enchanted Armor [Dragonage Nexus]&lt;br /&gt;
|--&lt;br /&gt;
| 1000001 - 1100000&lt;br /&gt;
| DA Workshop / by frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
== armor_massive_variation ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 8'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| 50-50&lt;br /&gt;
| [http://social.bioware.com/project/3666/ Sandbox]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: the highest working tested ID for this variation is 141. See [http://social.bioware.com/wiki/datoolset/index.php/Bug:_High_M2DA_ID_ranges_might_work_in_the_toolset,_but_not_in_game bug report]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== BITM_base and ItemStats_ ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 30000 - 30500&lt;br /&gt;
| Ambaryerno - [http://social.bioware.com/project/415/ Arms and Armor]&lt;br /&gt;
|-&lt;br /&gt;
| 37000-38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 40000 - 40200&lt;br /&gt;
| DA Workshop / by frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
| 57000-59000&lt;br /&gt;
| [World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 50000 - 50100&lt;br /&gt;
| Feline Fuelled Games - (by Silk) [http://www.felinefuelledgames.de/ Feline Fuelled Games]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== CLA_base ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 25'''&lt;br /&gt;
| '''Bioware&lt;br /&gt;
|-&lt;br /&gt;
| 10000 - 10012&lt;br /&gt;
| Ladydesire&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== crafting_recipe_types ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 7'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680020&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== crafting_recipes ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 91'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5682000&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== engineevents ==&lt;br /&gt;
&lt;br /&gt;
Those ranges relates to custom events types/ID and not to engineevents based [[Event_override|events overriding]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 500 - 500&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/861/ Advanced Tactics]&lt;br /&gt;
|-&lt;br /&gt;
| 510 - 511&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/1888/ Advanced Quickbar]&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680050&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== guitypes ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 600 - 600&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/861/ Advanced Tactics]&lt;br /&gt;
|-&lt;br /&gt;
| 601 - 601&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/1888/ Advanced Quickbar]&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 1974100-1974200&lt;br /&gt;
| Idomeneas' [http://social.bioware.com/project/3152/ Valeria Addon]&lt;br /&gt;
|-&lt;br /&gt;
| 2560000 - 2560050&lt;br /&gt;
| Timelord's [http://social.bioware.com/project/1845/ Blood and Lyrium]&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680010&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Heraldry ==&lt;br /&gt;
There is a [[Bug:_High_M2DA_ID_ranges_might_work_in_the_toolset,_but_not_in_game | bug]] with this table. The range 0-255 is known to work.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 1000001 - 1001000&lt;br /&gt;
| [http://social.bioware.com/project/178/ Crown of Creation] (using 201 onwards temporarily) &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== itemprps ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 10022'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000-38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 1000001 - 2000000&lt;br /&gt;
| DA Workshop / by frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680050&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
| 7570000-7770000&lt;br /&gt;
| [World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone]&lt;br /&gt;
|-&lt;br /&gt;
| 536873321 - 536873322&lt;br /&gt;
| Elys' [http://social.bioware.com/project/522/ Mysterious Gifts]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 2560000-2560050&lt;br /&gt;
| Timelord's [http://social.bioware.com/project/1845/ Blood and Lyrium]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== itemsets ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 30'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680500&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
| 7570000-7770000&lt;br /&gt;
| [World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone]&lt;br /&gt;
|-&lt;br /&gt;
| 1405261000 - 1405261999&lt;br /&gt;
| nezroy - [http://social.bioware.com/project/1834/ Warden Shields], [http://www.dragonagenexus.com/downloads/file.php?id=793 Leliana Item Set]&lt;br /&gt;
|-&lt;br /&gt;
| 1000001 - 2000000&lt;br /&gt;
| DA Workshop / by frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
| 7771000 - 7771500&lt;br /&gt;
| [http://social.bioware.com/project/2157/ Dark Times: The Confederacy of Malkuth] (reserved by Starlight on Questorion's behalf)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== ItemVariations (all) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 30'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000'''&lt;br /&gt;
| '''Bioware - reserved (guessed)'''&lt;br /&gt;
|-&lt;br /&gt;
| 12000 - 12100&lt;br /&gt;
| [http://social.bioware.com/project/1923/ Adonnay's Weaponry] (reserved by mikemike37 on his behalf)&lt;br /&gt;
|-&lt;br /&gt;
| 140 - 160&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 101000 - 400000&lt;br /&gt;
| [http://social.bioware.com/project/2157/ Dark Times: The Confederacy of Malkuth] (reserved by Starlight on Questorion's behalf)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
note: ItemVariations are affected by the bug which prevents ID's above 255 from appearing properly in the game. See [[Bug: High M2DA ID ranges might work in the toolset, but not in game|Bug report]].&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== M2DA_base ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1016, 2000 - 2010, 10011 - 10142, ...? '''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 5000 - 5014&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/861/ Advanced Tactics]&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000 - 38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 100000 - 100000&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/1907/ Event Manager]&lt;br /&gt;
|-&lt;br /&gt;
| 690000 - 690100&lt;br /&gt;
| [http://www.dragonagenexus.com/downloads/file.php?id=1617 Karma's Origins Companions]&lt;br /&gt;
|-&lt;br /&gt;
| 1000001 - 1100000&lt;br /&gt;
| DA Workshop / by frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
| 2300000 - 2300100&lt;br /&gt;
| [http://social.bioware.com/project/178/ Crown of Creation] (M2DA prefix: COC)&lt;br /&gt;
|-&lt;br /&gt;
| 2560000 - 2560050&lt;br /&gt;
| Timelord's [http://social.bioware.com/project/1845/ Blood and Lyrium]&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680050&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
| 5680050 - 5680055&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/3185/ Flexible craft UI]&lt;br /&gt;
|-&lt;br /&gt;
| 5681000 - 5681005&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/2896/ DACrafting framework]&lt;br /&gt;
|-&lt;br /&gt;
| 6000000 - 6000050&lt;br /&gt;
| TreDawn - [http://social.bioware.com/project/1750/ Nesiara Companion]&lt;br /&gt;
|-&lt;br /&gt;
| 7000000 - 7000050&lt;br /&gt;
| FtG - [http://social.bioware.com/project/1688/ UI Mod]&lt;br /&gt;
|-&lt;br /&gt;
| 7000051 - 7000055&lt;br /&gt;
| FtG - [http://social.bioware.com/project/3663/ Custom Loading Screen]&lt;br /&gt;
|-&lt;br /&gt;
| 7570000 - 7770000&lt;br /&gt;
| [World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone] &lt;br /&gt;
|-&lt;br /&gt;
| 7777770 - 7777799&lt;br /&gt;
| Magic - [http://social.bioware.com/project/1429/ Void Walker] (M2DA prefix: VWK)&lt;br /&gt;
|-&lt;br /&gt;
| 9000000 - 9000050&lt;br /&gt;
| Ambaryerno - [http://social.bioware.com/project/415/ Arms and Armor]&lt;br /&gt;
|- &lt;br /&gt;
| 30000000 - 40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 1140150041 - 1140150091&lt;br /&gt;
| DLAN_Immortality - [http://social.bioware.com/project/789/ Ser Gilmore NPC]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== materialrules ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000-38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 536873321 - 536873323&lt;br /&gt;
| Elys' [http://social.bioware.com/project/522/ Mysterious Gifts]&lt;br /&gt;
|-&lt;br /&gt;
| 1405261000 - 1405261999&lt;br /&gt;
| nezroy - [http://social.bioware.com/project/1834/ Warden Shields], [http://www.dragonagenexus.com/downloads/file.php?id=793 Leliana Item Set]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== materialtypes ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 88'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000-38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680300&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
| 536873321 - 536873340&lt;br /&gt;
| Elys' [http://social.bioware.com/project/522/ Mysterious Gifts]&lt;br /&gt;
|-&lt;br /&gt;
| 1405261000 - 1405261999&lt;br /&gt;
| nezroy - [http://social.bioware.com/project/1834/ Warden Shields], [http://www.dragonagenexus.com/downloads/file.php?id=793 Leliana Item Set]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== PartyPicker ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 11'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''????'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 101-199&lt;br /&gt;
| [http://social.bioware.com/project/178/ Crown of Creation]&lt;br /&gt;
|-&lt;br /&gt;
| 200 - 299&lt;br /&gt;
| DA Workshop / Author: frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
| 300 - 350&lt;br /&gt;
| [World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone]&lt;br /&gt;
|-&lt;br /&gt;
| 1974-1980&lt;br /&gt;
| Idomeneas' [http://social.bioware.com/project/3152/ Valeria Addon]&lt;br /&gt;
|-&lt;br /&gt;
| 6900000 - 6900200&lt;br /&gt;
| [http://www.dragonagenexus.com/downloads/file.php?id=1617 Karma's Origins Companions]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== PRCSCR ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000-38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 690000 - 690100&lt;br /&gt;
| [http://www.dragonagenexus.com/downloads/file.php?id=1617 Karma's Origins Companions]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 10100000&lt;br /&gt;
| Camp [http://social.bioware.com/project/463/ storage chest]&lt;br /&gt;
|-&lt;br /&gt;
| 10100011-10100013&lt;br /&gt;
| Didymos' [http://social.bioware.com/project/2620/ Camp Merchant Chest]&lt;br /&gt;
|-&lt;br /&gt;
| 10100014-10100016&lt;br /&gt;
| Didymos' [http://social.bioware.com/project/2717/ Item Sets Fix]&lt;br /&gt;
|-&lt;br /&gt;
| 10100100-10100110&lt;br /&gt;
| Eshme's [http://social.bioware.com/project/1929/ Sleeping Tent]&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680020&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
| 6000000 - 6000050&lt;br /&gt;
| TreDawn - [http://social.bioware.com/project/1750/ Nesiara Companion]&lt;br /&gt;
|-&lt;br /&gt;
| 7570000-7770000&lt;br /&gt;
| [World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone]&lt;br /&gt;
|-&lt;br /&gt;
| 1140150041 - 1140150091&lt;br /&gt;
| DLAN_Immortality - [http://social.bioware.com/project/789/ Ser Gilmore NPC]&lt;br /&gt;
|-&lt;br /&gt;
| 1672464532 - 1672464542&lt;br /&gt;
| DLAN_Immortality - [http://social.bioware.com/project/2991/ Ser Gilmore NPC Awakening]&lt;br /&gt;
|-&lt;br /&gt;
| 1405261000 - 1405261999&lt;br /&gt;
| nezroy - [http://social.bioware.com/project/1834/ Warden Shields], [http://www.dragonagenexus.com/downloads/file.php?id=793 Leliana Item Set]&lt;br /&gt;
|-&lt;br /&gt;
| 1000001 - 1100000&lt;br /&gt;
| DA Workshop / by frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
| 2000000-2000050&lt;br /&gt;
| [http://www.dragonagenexus.com/downloads/file.php?id=942 Oracle,mutantspicy's magic vault, and other custom armors]&lt;br /&gt;
|-&lt;br /&gt;
| 42006090 - 42006100&lt;br /&gt;
| [http://www.dragonagenexus.com/downloads/file.php?id=1120 Morrigan Restoration Patch]&lt;br /&gt;
|-&lt;br /&gt;
| 1109197751 - 1109197799&lt;br /&gt;
| Schwinni - [http://dragonagenexus.com/downloads/file.php?id=1020 Awakening Runes Fixes], [http://dragonagenexus.com/downloads/file.php?id=1112 Awakening Blackblade Armor Dragon Drop Fix]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== placeable_types ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 14000 - 16000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 17000 - 19000&lt;br /&gt;
| Standalone modules (see discussion tab)&lt;br /&gt;
|-&lt;br /&gt;
| 37000-38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 43050-43061&lt;br /&gt;
| Eshme's [http://social.bioware.com/project/1929/ Sleeping Tent]  (Greater 65535 is showing bugs so this is until it is fixed)&lt;br /&gt;
|-&lt;br /&gt;
| 43062-43065&lt;br /&gt;
| BioSpirit's [http://social.bioware.com/project/1647/ Hilltop Under Siege]&lt;br /&gt;
|-&lt;br /&gt;
| 56000-56200&lt;br /&gt;
| [http://social.bioware.com/project/2472/#details Mikes Invisible Boxes]&lt;br /&gt;
|-&lt;br /&gt;
| 2696549 - 2696700&lt;br /&gt;
| PavelNovotny - [http://social.bioware.com/project/517/ Gay Bars of Ferelden] (NOTE: I'm using the 6000-6200 range until Bioware fixes the bug which prevents m2da ID ranges above 900000 from showing up in game.)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 7570000-7770000&lt;br /&gt;
| [World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 1000001 - 1100000&lt;br /&gt;
| DA Workshop / Author: frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== popups ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 1000001-1001000&lt;br /&gt;
| [http://social.bioware.com/project/178/ Crown of Creation]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== PRJ_base ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680050&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
== String ID ==&lt;br /&gt;
It is not generally necessary to register String ID ranges here. The values generated by the toolset are sufficiently random to minimise the risk of collision. Exception : the Community Contest reserved the range below so that the builders will stick to that and can import VO without having to renumber the VO files.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 10000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 89000000  - 89999999&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== tint_override ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| 500 - 520&lt;br /&gt;
| PavelNovotny - [http://social.bioware.com/project/517/ Gay Bars of Ferelden]&lt;br /&gt;
|-&lt;br /&gt;
| 6900 - 6920&lt;br /&gt;
| [http://www.dragonagenexus.com/downloads/file.php?id=1617 Karma's Origins Companions]&lt;br /&gt;
|-&lt;br /&gt;
| 1000001-1001000&lt;br /&gt;
| [http://social.bioware.com/project/178/ Crown of Creation]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 1109197701 - 1109197750&lt;br /&gt;
| Schwinni - [http://dragonagenexus.com/downloads/file.php?id=1064 Helmets without wings and retints]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== ts_material ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| 1405261000 - 1405261999&lt;br /&gt;
| nezroy - [http://social.bioware.com/project/1834/ Warden Shields], [http://www.dragonagenexus.com/downloads/file.php?id=793 Leliana Item Set]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== TS_Category ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680005&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
| 1000001 - 1100000&lt;br /&gt;
| DA Workshop / by frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
| 7570000-7770000&lt;br /&gt;
| [World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== vfx_base ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000-38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680010&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
| 5680011 - 5680019&lt;br /&gt;
| BioSpirit's [http://social.bioware.com/project/1647/ Hilltop Under Siege]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== worldmaps (has to be less than 256) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 6'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| '''210 - 220'''&lt;br /&gt;
| [http://social.bioware.com/project/1845/ Blood and Lyrium]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=UI_Tutorial_(draft)&amp;diff=14679</id>
		<title>UI Tutorial (draft)</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=UI_Tutorial_(draft)&amp;diff=14679"/>
				<updated>2010-11-13T02:17:47Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: /* Other information sources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Author's note''': STILL A WORK IN PROGRESS - FIRST DUMPING INFORMATION OUT, THEN I'LL FORMAT AND SECTION IT OFF BETTER. This isn't a very good tutorial, but as I said, I'm just trying to get the information out there and I'm slow to update this. Also, it may be simpler now that the UDK has support for GFX files, but I don't know the cross-licensing or technical situation on that right now.&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
The UI files are basically just version 8 Adobe Flash files, but extended with some extra properties and image handling (they even use nonstandard tags in the SWF for that). GFX files supposedly have more optimized fonts and who really knows what else, but you shouldn't have to worry about font embedding in Dragon Age.&lt;br /&gt;
&lt;br /&gt;
This means they use the older ActionScript 2.0, which you can find some learning resources on here [http://download.macromedia.com/pub/documentation/en/flash/fl8/fl8_learning_as2.pdf fl8_learning_as2.pdf] and here [http://livedocs.adobe.com/flash/9.0/main/flash_as2_learning.pdf flash_as2_learning.pdf], among other places scattered on the web. You can download the API reference, but a decent online location is [http://flash-reference.icod.de/ here] (faster than Adobe's site I find).&lt;br /&gt;
&lt;br /&gt;
=== Other information sources ===&lt;br /&gt;
There's a woefully incomplete GUI category on the wiki here [[:Category:GUI]]. It was an early effort at detailing some of the class specifics in the UI files. There are a lot of stubs, but some classes are more detailed.&lt;br /&gt;
&lt;br /&gt;
There's also a long-standing draft article on the profile page here [[User:FollowTheGourd]] about the conversation UI. It could also be ammended to explain things like 800x600 is treated as if it were 1024x768, and that the cutscene bars actually have a negative height if the screen width is much longer than the screen height, as seen with Eyefinity display setups.&lt;br /&gt;
&lt;br /&gt;
Another thing to realize is the game's aspect ratio correction and how one resolution in window mode will get stretched to fill your screen space in fullscreen mode. So then there's a difference between the Stage (Flash term) width and height and the video settings which you can access using the ExternalCommands ActionScript class. The point is that the Stage dimensions are more reliable than the video settings you can retrieve through the ExternalCommands class, although it doesn't stop the quickbar UI file from reading the attribute ''&amp;quot;ClientOptions.VideoOptions.ResolutionWidth&amp;quot;'' from it, but there might be a perfectly good reason for that like the engine notifying the GUI when it changes.&lt;br /&gt;
&lt;br /&gt;
== Toolchain ==&lt;br /&gt;
&lt;br /&gt;
[http://www.flashdevelop.org/ FlashDevelop IDE.]&lt;br /&gt;
etc&lt;br /&gt;
&lt;br /&gt;
== Organizing Sources ==&lt;br /&gt;
&lt;br /&gt;
Obtain an ActionScript 2.0 decompiler such as Sothink or Trillix. Each has their shortcomings and will require further post-processing. Sothink's ActionScript output will probably require more work to make compile with MTASC, but Trillix's output seems to have some stranger bugs I'll mention later, which makes me more hesitant to recommend it. Sothink's tool still seems to have an issue formatting double-precision values as single-precision, as detailed in the section below. [http://www.nowrap.de/flare.html Flare] is also a nice free tool to compare output against, but it unfortunately isn't in a format that you can simply recompile.&lt;br /&gt;
&lt;br /&gt;
[http://www.nowrap.de/flasm.html Flasm] is also a useful tool if you wish to examine the p-code directly (as a debug or learning aid perhaps), or even modify it that way.&lt;br /&gt;
&lt;br /&gt;
=== GFX to SWF ===&lt;br /&gt;
&lt;br /&gt;
If you want your changes to be compatible with a certain or the latest game patch, then you'll also have to first merge the appropriate [[GFX]] files. For example, to be compatible with game v1.03, you'll first need to extract the GFX files from guiexport.erf, and then from the patch000.erf, patch001.erf, and patch002.erf files found under C:\Program Files\Dragon Age\packages\core\patch. If you want to be compatible with v1.02a, then it should suffice to stop merging after patch001.erf.&lt;br /&gt;
&lt;br /&gt;
Then you want to change the first three bytes for the GFX to CWS and change the file suffix to SWF.&lt;br /&gt;
Example Python script:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
from __future__ import with_statement&lt;br /&gt;
# The first line is required if you get the following error when running the python script under 2.5.4/2.5.5&lt;br /&gt;
# SyntaxError: invalid syntax - with open(gfxPath, &amp;quot;rb+&amp;quot;) as gfxFile:&lt;br /&gt;
import glob&lt;br /&gt;
import os&lt;br /&gt;
import struct&lt;br /&gt;
&lt;br /&gt;
for gfxPath in glob.glob('*.gfx'):&lt;br /&gt;
	with open(gfxPath, &amp;quot;rb+&amp;quot;) as gfxFile:&lt;br /&gt;
		print(gfxPath)&lt;br /&gt;
		gfxFile.write(struct.pack('3s', &amp;quot;CWS&amp;quot;))&lt;br /&gt;
	os.rename(gfxPath, os.path.splitext(gfxPath)[0] + &amp;quot;.swf&amp;quot;) &lt;br /&gt;
		&lt;br /&gt;
line = input(&amp;quot;Press enter to exit.&amp;quot;)&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Obtain ActionScript Sources ===&lt;br /&gt;
&lt;br /&gt;
If you're using Sothink's tool, then here's an example of how you would quickly retrieve the ActionScript, if you've converted the GFX into SWFs as mentioned above. Do a multi-file export with all of the SWF files (merged to whichever patch version you wish). [http://i1002.photobucket.com/albums/af150/FollowTheGourd/sothink_swf.jpg Screen shot]&lt;br /&gt;
&lt;br /&gt;
=== Merge ActionScript Classes ===&lt;br /&gt;
&lt;br /&gt;
It's a good idea to create a single ActionScript library of all the game sources; that way you don't have to repeatedly make the same modifications for every SWF file that uses the same modified classes. As you'll see later when using the SWF injection method, that this doesn't make available all of the classes to every SWF file, but it's a way to avoid redundant editing.&lt;br /&gt;
&lt;br /&gt;
For instance, here's a embarrassingly quick and dirty way of doing it with a Python script:&lt;br /&gt;
''Note:'' this will throw an exception on later versions of Python because shutil.move undocumentedly doesn't want to clobber existing files. You could add a check if the file already exists and not move it - or rewrite the script and make something better.&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
from __future__ import with_statement&lt;br /&gt;
# The first line is required if you get the following error when running the python script under 2.5.4/2.5.5&lt;br /&gt;
# SyntaxError: invalid syntax - with open(gfxPath, &amp;quot;rb+&amp;quot;) as gfxFile:&lt;br /&gt;
# [Yes, this code probably sucks]&lt;br /&gt;
&lt;br /&gt;
import shutil&lt;br /&gt;
import os&lt;br /&gt;
import re&lt;br /&gt;
import zlib&lt;br /&gt;
&lt;br /&gt;
# Usage: have the batch exported ActionScript from the decompiler (say Sothink) in a dir called export. Then run this &lt;br /&gt;
# script at the same level as the export dir. It will create a C:\commonlib folder with the ActionScript merged into it.&lt;br /&gt;
# Left over in export is what you can import into a FlashDevelop project. You'll also want to make&lt;br /&gt;
# intrinsics out of export and commonlib, but commlib goes in the global classpath, while&lt;br /&gt;
# the appropriate export subfolder goes in the appropriate project classpath.&lt;br /&gt;
&lt;br /&gt;
mergedir = r'C:\commonlib'&lt;br /&gt;
scriptdict = {}&lt;br /&gt;
for dirpath, dirnames, filenames in os.walk('export'):&lt;br /&gt;
	print(dirpath)&lt;br /&gt;
	for junk in filter (lambda x: not x.endswith(&amp;quot;.as&amp;quot;), filenames):&lt;br /&gt;
		os.remove(os.path.join(dirpath, junk))&lt;br /&gt;
	for script in filter( lambda x : x.endswith(&amp;quot;.as&amp;quot;), filenames):&lt;br /&gt;
		scriptfile = open(os.path.join(dirpath, script))&lt;br /&gt;
		relativedir = re.sub(r'export\\[^\\]+\\?', '', dirpath)&lt;br /&gt;
		relativepath = os.path.join(relativedir, script)&lt;br /&gt;
		crc32 = zlib.crc32(scriptfile.read())&lt;br /&gt;
		scriptfile.close()&lt;br /&gt;
		sourcepath = os.path.join(dirpath, script)&lt;br /&gt;
		if relativepath in scriptdict:&lt;br /&gt;
			lastval = scriptdict[relativepath]&lt;br /&gt;
			if lastval['crc32'] == crc32:&lt;br /&gt;
				destdir = os.path.join(mergedir, relativedir)&lt;br /&gt;
				if os.path.exists(lastval['sourcepath']):&lt;br /&gt;
					os.remove(lastval['sourcepath'])&lt;br /&gt;
				if not os.path.exists(destdir):&lt;br /&gt;
					os.makedirs(destdir)&lt;br /&gt;
				#print(&amp;quot;move &amp;quot; + sourcepath + &amp;quot; to &amp;quot; + destdir)&lt;br /&gt;
				shutil.move(sourcepath, destdir)&lt;br /&gt;
			else:&lt;br /&gt;
				# There any many *Scene.as files that are the same&lt;br /&gt;
				# BUT there's an &amp;quot;emptyish&amp;quot; Scene.as used an as interface as well.&lt;br /&gt;
				# So you probably want Scene.as as common, but the other scenes as unique&lt;br /&gt;
				# even if they have the same name. Still throw if script is Scene.as but not if it ends with it.&lt;br /&gt;
				if not re.search(r'.Scene\.as$', script):&lt;br /&gt;
					raise Exception(&amp;quot;Same name, different CRC32: &amp;quot; + sourcepath)&lt;br /&gt;
		else:&lt;br /&gt;
			scriptdict[relativepath] = { 'crc32': crc32, 'sourcepath': sourcepath }&lt;br /&gt;
&lt;br /&gt;
# Find unique entries in SharedLibary, GUI, etc. Copy them over to commonlib but print out what we found.&lt;br /&gt;
# [Bit of a copy-pasta job here...]&lt;br /&gt;
for dirpath, dirnames, filenames in os.walk('export'):&lt;br /&gt;
	for script in filter (lambda x: x.endswith(&amp;quot;.as&amp;quot;), filenames):&lt;br /&gt;
		relativedir = re.sub(r'export\\[^\\]+\\?', '', dirpath)&lt;br /&gt;
		if relativedir == '':&lt;br /&gt;
			continue&lt;br /&gt;
		relativepath = os.path.join(relativedir, script)&lt;br /&gt;
		sourcepath = os.path.join(dirpath, script)&lt;br /&gt;
		destdir = os.path.join(mergedir, relativedir)&lt;br /&gt;
		if not os.path.exists(destdir):&lt;br /&gt;
			os.makedirs(destdir)&lt;br /&gt;
		print(&amp;quot;Unique commonlib: &amp;quot; + sourcepath)&lt;br /&gt;
		shutil.move(sourcepath, destdir)&lt;br /&gt;
&lt;br /&gt;
# Clean up empty dirs&lt;br /&gt;
for dirpath, dirnames, filenames in os.walk('export', topdown=False):&lt;br /&gt;
	for d in dirnames:&lt;br /&gt;
		try:&lt;br /&gt;
			os.rmdir(os.path.join(dirpath, d))&lt;br /&gt;
		except OSError:&lt;br /&gt;
			pass&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Making Modifications ==&lt;br /&gt;
=== Bugs and getting sources to compile ===&lt;br /&gt;
[ Note: this is mostly just copy and pasted from my post in another forum at the moment. It still needs some reworking to better explain things ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can first get the open source FlashDevelop IDE which comes with MTASC and the standard Flash library. If you have the SWFs and the ActionScript *.as files, then what you can do is create an empty ActionScript 2 project, in the project settings turn off &amp;quot;use main entry point&amp;quot; and under the project &amp;quot;injection&amp;quot; tab, point it to the SWF you want to update with your new ActionScript.&lt;br /&gt;
&lt;br /&gt;
You'll also want to update the project classpaths to point to your game's ActionScript library. Just in my experience, there seem to be some properties on some of the standard classes that would normally prevent the script from compiling - but in that case what you can do is modify the so-called intrinsic files to let the compiler know about them. E.g., you can add needed function and var declarations to the intrinsic class interfaces under C:\Program Files\FlashDevelop\Tools\mtasc. The nice thing about ActionScript and intrinsics is that you don't even need to know the values of these &amp;quot;missing&amp;quot; properties or functions if they're basically defined in the runtime environment. E.g., Mouse.LEFT isn't standard Flash, but if you edit Mouse.as and add '''static var LEFT;''' to the intrinsic class definition, then you're good to go, as the value gets looked up during execution like a dictionary value (in fact, Mouse[&amp;quot;left&amp;quot;] should yield the same result).&lt;br /&gt;
&lt;br /&gt;
Also if you press Ctrl+J you'll get the type explorer where you can right click on a folder (that you've added to your classpath) and select &amp;quot;convert to intrinsic&amp;quot;. So this way you only need to compile the actual *.as file you're making changes to and keep the others around as intrinsics. Using the IDE's SWF injection I mentioned above will make it so you don't have to worry about recompiling everything.&lt;br /&gt;
&lt;br /&gt;
You'll probably get a bunch of warnings like &amp;quot;... needs the class &amp;lt;Whatever&amp;gt; which was not compiled&amp;quot; but that's just MTASC not liking how some class names are used outside of what you're compiling like in Flash registerObject calls.&lt;br /&gt;
&lt;br /&gt;
Now the bigger issue is that MTASC is pickier about things than Adobe's compiler. You'll often have to write this.varname or ClassName.varname instead of just varname, and MTASC doesn't like named *nested* functions. So you'll sometimes have to convert function FooBar() { ... } into something like &amp;quot;this.FooBar = function() { };&amp;quot; or &amp;quot;_root.FooBar = function() { };&amp;quot;. But also make sure that the variable for the function is a class member and not function-local or it'll just be a register or randomly named variable when compiled, or just not be available in the scope you need it to be.&lt;br /&gt;
&lt;br /&gt;
MTASC is also pickier about the scope of local variables. It may sound weird, but in ActionScript 2.0 a function-local variable is defined for the scope of the function - it doesn't matter if declared in an if-statement or in braces. But the MTASC compiler will enforce that you define the variable in a &amp;quot;proper&amp;quot; scope, so you may need to move where it's declared if you want things to compile. E.g., &amp;quot;if (foo) { var tmp = 1; } else { tmp = 2; }&amp;quot; won't fly with MTASC.&lt;br /&gt;
&lt;br /&gt;
Also it seems like MTASC doesn't like the global function &amp;quot;Array&amp;quot;, but doesn't mind if you use the constructor instead. E.g., I've had issues with var ar = Array(...), but var ar = new Array(...) works or you could use the square-bracket notation instead.&lt;br /&gt;
&lt;br /&gt;
Some other stuff... if you want multiple projects, just create the projects all in the same dir (but create folders if you want to separate stuff and adjust the project classpath accordingly).&lt;br /&gt;
Also, don't necessarily set &amp;quot;Always compile&amp;quot; for the *.as file or you might run into duplicate definition errors - things should get drawn in as needed, but I think you need to set it for classes in the original SWF you wish to update. That might be a little hit and miss at first, but you can always check to make sure your changes got in.&lt;br /&gt;
&lt;br /&gt;
Also, looking at the output in FLASM, MTASC might not generate the most blazing bytecode ever - but neither does Adobe's compiler. Just some things I noticed is that Adobe's will use function argument registers more than MTASC seems to... e.g., &amp;quot;push '_root'; getVariable&amp;quot; vs just a r:_root register.&lt;br /&gt;
&lt;br /&gt;
Another apparent annoyance with MTASC is that it doesn't seem to recognize some global variables (which you can confirm with flasm's output (push 'somevar'; getVariable). Workarounds include ''_global.someVariable'', or sometimes ''_root.someVariable'' as appropriate.&lt;br /&gt;
&lt;br /&gt;
One last thing... you may want to organize your *.as files so you combine the ones that are commonly used across different SWF files so you're not always having to edit multiple copies of SomeClass.as for each SWF that uses it.&lt;br /&gt;
&lt;br /&gt;
Also, I noticed a bug in sothink that I emailed them about: doubles are formatted as single-precision floating point. But some other tools, e.g., flare, get the value correctly. You might want to search your *.as files for &amp;quot;E-&amp;quot; and &amp;quot;E+&amp;quot; to look for these misformatted values if you're using it.&lt;br /&gt;
&lt;br /&gt;
EDIT: Here's a bug with Trillix I noticed, but they said it'll be fixed soon: if you have &amp;quot;var foo = this&amp;quot; and if a register is used for 'foo', then Trillix doesn't properly initialize the register... but instead just uses 'this' everywhere else. This causes problems if you needed that variable to choose between using 'this' and possibly another object. E.g., &amp;quot;var obj = this; if (something) { obj = someOtherObject; } someFunc.doIt(obj);&amp;quot; only works as long as &amp;quot;obj&amp;quot; is stored as a variable and not a register, which is up to the original compiler. In reply, they mentioned that you could work around that issue by turning off the &amp;quot;ActionScript 'Recover arguments' names&amp;quot; setting, which makes it a bit more difficult to keep track of function arguments, so it's less than ideal.&lt;br /&gt;
&lt;br /&gt;
=== Issues displaying custom MovieClip subclasses ===&lt;br /&gt;
'''Note:''' this tries to explain some of the issues, and isn't suggesting best practices. This is a bit rambling and should be presented with more concrete examples. Ideally it wouldn't be needed at all and we could use the Scaleform SDK to convert our SWFs into GFX, or we could splice in our own movieclip symbol tags into the GFX file.&lt;br /&gt;
&lt;br /&gt;
The simple issue is this: if it wasn't originally created in the Flash designer (also having a symbol in the Flash library), then you'll have a harder time of showing custom MovieClip objects through ActionScript alone. This would appear to be a bug, but speculatively, it could be for performance reasons.&lt;br /&gt;
&lt;br /&gt;
==== Using swfmill ====&lt;br /&gt;
This hasn't been thoroughly tested, but swfmill may be a simple way to add you own symbols. Use swfmill to convert the SWF into an XML file, edit it, and then use swfmill to convert it back. It appears to work, and even properly retains the non-standard SWF tags. For custom class behavior, you'll still need to make an ''Object.registerClass'' call to associate the library symbol with the class. If you do use this method, one thing to make sure of is that the embedded textures display properly, since they're being referred to using a non-standard SWF tag.&lt;br /&gt;
&lt;br /&gt;
==== createEmptyMovieClip method ====&lt;br /&gt;
So until splicing in tags becomes more streamlined, or some other method is found, then it may be easier to just create an empty movieclip and then populate the member fields using a mixin from another class or manually, although that's probably still less than ideal for classes that use the onLoad event. Another thing as mentioned below is the possibility of abusing prototype mechanics (which can be somewhat messy) or subclass an existing class to specialize the beha&lt;br /&gt;
&lt;br /&gt;
It would appear that the ''MovieClip'' method ''createEmptyMovieClip'' is of limited use unless you then load another movieclip (such as an icon image) into it or or do a ''beginFill ... endFill'' ('''fill-code''') for a few frames to define its dimensions, filling it for as many frames until, say, its '''_height''' property becomes non-zero. It's ugly, but works. Also, if you do a fill on an object in the library, then you actually affect its '''_xscale''' and '''_yscale''' by making the object stretch to fit into your fill. Ultimately, it'd probably be less of a hassle to alter the SWF file to insert your object. Because of having to rerun the code, you'll probably want to delay having to reload images or other intensive operations. You'll have to rerun the fill-code at least twice for this to work, timing alone doesn't matter as has been determined through trial and error.&lt;br /&gt;
&lt;br /&gt;
==== attachMovie method ====&lt;br /&gt;
Perhaps a simpler way is to use ''attachMovie'', although you'll have to find a pre-existing movieclip symbol that suites your needs, and if you want to change its default dimensions then you'll have to delay the fill-code for a few (let's say 150 or so since the scene began) frames after the game loads until it actually works. '''NOTE:''' Reconfirm this is actually necessary instead of just being able to set the _height/_width/_xscale/_yscale, although you may still need to delay setting those for the change to take effect. This way you shouldn't have to keep rerunning the fill-code as with the above ''createEmptyMovieClip'' method. This whole delay business is probably more of an issue in UI elements that are on the HUD instead of selected later from the navbar. You can probably check for when you've waited enough frames by running some simple fill-code on an empty movieclip and checking whether the '''_height''' property changes. &lt;br /&gt;
E.g., the PieCooldown symbol exists in the quickbar.swf file and isn't the worst choice for an empty MovieClip. You can use programs like swix, swfmill, and probably others to find simple objects without much embedded graphics.&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
private static var EMPTYMC_LINKID:String = &amp;quot;PieCooldown&amp;quot;;	&lt;br /&gt;
var mc:MovieClip = someClip_mc.attachMovie(EMPTYMC_LINKID, &amp;quot;SomeName_mc&amp;quot;, someClip_mc.getNextHighestDepth(), {_x:10, _y:10});&lt;br /&gt;
&lt;br /&gt;
// Changing the default dimensions of &amp;quot;PieCooldown&amp;quot;&lt;br /&gt;
// Although you can probably just change the _height, _width or scales after the&lt;br /&gt;
// needed delay instead, unlike with the createEmptyMovieClip method apparently.&lt;br /&gt;
// Also not really necessary if you just want to use it as an invisible container,&lt;br /&gt;
// since other items can be positioned outside of it, relative to its local &lt;br /&gt;
// coordinates.&lt;br /&gt;
with(mc)&lt;br /&gt;
{&lt;br /&gt;
   beginFill(0, 0); // alpha is zero.&lt;br /&gt;
   moveTo(0, 0);&lt;br /&gt;
   lineTo(21, 0);&lt;br /&gt;
   lineTo(21, 21);&lt;br /&gt;
   lineTo(0, 21);&lt;br /&gt;
   endFill();	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The game's script sources also come with a ''MovieUtils'' class, which has a wrapper around ''attachMovie''. This can be useful to create an instance of a library symbol in the SWF file and use it instead for another purpose. &lt;br /&gt;
&lt;br /&gt;
Other useful workaround would be abusing prototype mechanics of ActionScript to give an already existing class other behavior if desired, and can be switched using a custom argument for the initObject during the attachMovie call. This way you don't have to edit the actual class file, if making it recompile is problematic or time consuming. Although this is a kludge method of doing it.&lt;br /&gt;
&lt;br /&gt;
Also of note is that ''Object.registerClass'' or the so-called [http://www.google.com/search?hl=en&amp;amp;source=hp&amp;amp;q=attachMovie+__packages+trick __Packages trick] won't really get you anywhere either. You'll be able to create the MovieClip subclass, but it won't display properly (or just differently) without the above-mentioned tricks.&lt;br /&gt;
&lt;br /&gt;
Creating a subclass of an existing class that's registered with ''Object.registerClass'' may also be a convenient way to customize class behavior without having to recompile the base class if you then change the registerClass call to use the subclass.&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=UI_Tutorial_(draft)&amp;diff=14678</id>
		<title>UI Tutorial (draft)</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=UI_Tutorial_(draft)&amp;diff=14678"/>
				<updated>2010-11-13T02:16:59Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: /* Other information sources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Author's note''': STILL A WORK IN PROGRESS - FIRST DUMPING INFORMATION OUT, THEN I'LL FORMAT AND SECTION IT OFF BETTER. This isn't a very good tutorial, but as I said, I'm just trying to get the information out there and I'm slow to update this. Also, it may be simpler now that the UDK has support for GFX files, but I don't know the cross-licensing or technical situation on that right now.&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
The UI files are basically just version 8 Adobe Flash files, but extended with some extra properties and image handling (they even use nonstandard tags in the SWF for that). GFX files supposedly have more optimized fonts and who really knows what else, but you shouldn't have to worry about font embedding in Dragon Age.&lt;br /&gt;
&lt;br /&gt;
This means they use the older ActionScript 2.0, which you can find some learning resources on here [http://download.macromedia.com/pub/documentation/en/flash/fl8/fl8_learning_as2.pdf fl8_learning_as2.pdf] and here [http://livedocs.adobe.com/flash/9.0/main/flash_as2_learning.pdf flash_as2_learning.pdf], among other places scattered on the web. You can download the API reference, but a decent online location is [http://flash-reference.icod.de/ here] (faster than Adobe's site I find).&lt;br /&gt;
&lt;br /&gt;
=== Other information sources ===&lt;br /&gt;
There's a woefully incomplete GUI category on the wiki here [[:Category:GUI]]. It was an early effort at detailing some of the class specifics in the UI files. There are a lot of stubs, but some classes are more detailed.&lt;br /&gt;
&lt;br /&gt;
There's also a long-standing draft article on the profile page here [[User:FollowTheGourd]] about the conversation UI. It could also be ammended to explain things like 800x600 is treated as if it were 1024x768, and that the cutscene bars actually have a negative height if the screen width is much longer than the screen height, as seen with Eyefinity display setups.&lt;br /&gt;
&lt;br /&gt;
Another thing to realize is the game's aspect ratio correction and how one resolution in window mode will get stretched to fill your screen space in fullscreen mode. So then there's a difference between the Stage (Flash term) width and height and the video settings which you can access using the ExternalCommands ActionScript class. The point is that the Stage dimensions are more reliable than the video settings you can retrieve through the ExternalCommands class, although it doesn't stop the quickbar UI file from reading the attribute ''&amp;quot;ClientOptions.VideoOptions.ResolutionWidth&amp;quot;'' from it, although there might be a perfectly good reason for that - I haven't really looked too far into why they made that choice other than the engine notifying the GUI when it changes.&lt;br /&gt;
&lt;br /&gt;
== Toolchain ==&lt;br /&gt;
&lt;br /&gt;
[http://www.flashdevelop.org/ FlashDevelop IDE.]&lt;br /&gt;
etc&lt;br /&gt;
&lt;br /&gt;
== Organizing Sources ==&lt;br /&gt;
&lt;br /&gt;
Obtain an ActionScript 2.0 decompiler such as Sothink or Trillix. Each has their shortcomings and will require further post-processing. Sothink's ActionScript output will probably require more work to make compile with MTASC, but Trillix's output seems to have some stranger bugs I'll mention later, which makes me more hesitant to recommend it. Sothink's tool still seems to have an issue formatting double-precision values as single-precision, as detailed in the section below. [http://www.nowrap.de/flare.html Flare] is also a nice free tool to compare output against, but it unfortunately isn't in a format that you can simply recompile.&lt;br /&gt;
&lt;br /&gt;
[http://www.nowrap.de/flasm.html Flasm] is also a useful tool if you wish to examine the p-code directly (as a debug or learning aid perhaps), or even modify it that way.&lt;br /&gt;
&lt;br /&gt;
=== GFX to SWF ===&lt;br /&gt;
&lt;br /&gt;
If you want your changes to be compatible with a certain or the latest game patch, then you'll also have to first merge the appropriate [[GFX]] files. For example, to be compatible with game v1.03, you'll first need to extract the GFX files from guiexport.erf, and then from the patch000.erf, patch001.erf, and patch002.erf files found under C:\Program Files\Dragon Age\packages\core\patch. If you want to be compatible with v1.02a, then it should suffice to stop merging after patch001.erf.&lt;br /&gt;
&lt;br /&gt;
Then you want to change the first three bytes for the GFX to CWS and change the file suffix to SWF.&lt;br /&gt;
Example Python script:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
from __future__ import with_statement&lt;br /&gt;
# The first line is required if you get the following error when running the python script under 2.5.4/2.5.5&lt;br /&gt;
# SyntaxError: invalid syntax - with open(gfxPath, &amp;quot;rb+&amp;quot;) as gfxFile:&lt;br /&gt;
import glob&lt;br /&gt;
import os&lt;br /&gt;
import struct&lt;br /&gt;
&lt;br /&gt;
for gfxPath in glob.glob('*.gfx'):&lt;br /&gt;
	with open(gfxPath, &amp;quot;rb+&amp;quot;) as gfxFile:&lt;br /&gt;
		print(gfxPath)&lt;br /&gt;
		gfxFile.write(struct.pack('3s', &amp;quot;CWS&amp;quot;))&lt;br /&gt;
	os.rename(gfxPath, os.path.splitext(gfxPath)[0] + &amp;quot;.swf&amp;quot;) &lt;br /&gt;
		&lt;br /&gt;
line = input(&amp;quot;Press enter to exit.&amp;quot;)&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Obtain ActionScript Sources ===&lt;br /&gt;
&lt;br /&gt;
If you're using Sothink's tool, then here's an example of how you would quickly retrieve the ActionScript, if you've converted the GFX into SWFs as mentioned above. Do a multi-file export with all of the SWF files (merged to whichever patch version you wish). [http://i1002.photobucket.com/albums/af150/FollowTheGourd/sothink_swf.jpg Screen shot]&lt;br /&gt;
&lt;br /&gt;
=== Merge ActionScript Classes ===&lt;br /&gt;
&lt;br /&gt;
It's a good idea to create a single ActionScript library of all the game sources; that way you don't have to repeatedly make the same modifications for every SWF file that uses the same modified classes. As you'll see later when using the SWF injection method, that this doesn't make available all of the classes to every SWF file, but it's a way to avoid redundant editing.&lt;br /&gt;
&lt;br /&gt;
For instance, here's a embarrassingly quick and dirty way of doing it with a Python script:&lt;br /&gt;
''Note:'' this will throw an exception on later versions of Python because shutil.move undocumentedly doesn't want to clobber existing files. You could add a check if the file already exists and not move it - or rewrite the script and make something better.&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
from __future__ import with_statement&lt;br /&gt;
# The first line is required if you get the following error when running the python script under 2.5.4/2.5.5&lt;br /&gt;
# SyntaxError: invalid syntax - with open(gfxPath, &amp;quot;rb+&amp;quot;) as gfxFile:&lt;br /&gt;
# [Yes, this code probably sucks]&lt;br /&gt;
&lt;br /&gt;
import shutil&lt;br /&gt;
import os&lt;br /&gt;
import re&lt;br /&gt;
import zlib&lt;br /&gt;
&lt;br /&gt;
# Usage: have the batch exported ActionScript from the decompiler (say Sothink) in a dir called export. Then run this &lt;br /&gt;
# script at the same level as the export dir. It will create a C:\commonlib folder with the ActionScript merged into it.&lt;br /&gt;
# Left over in export is what you can import into a FlashDevelop project. You'll also want to make&lt;br /&gt;
# intrinsics out of export and commonlib, but commlib goes in the global classpath, while&lt;br /&gt;
# the appropriate export subfolder goes in the appropriate project classpath.&lt;br /&gt;
&lt;br /&gt;
mergedir = r'C:\commonlib'&lt;br /&gt;
scriptdict = {}&lt;br /&gt;
for dirpath, dirnames, filenames in os.walk('export'):&lt;br /&gt;
	print(dirpath)&lt;br /&gt;
	for junk in filter (lambda x: not x.endswith(&amp;quot;.as&amp;quot;), filenames):&lt;br /&gt;
		os.remove(os.path.join(dirpath, junk))&lt;br /&gt;
	for script in filter( lambda x : x.endswith(&amp;quot;.as&amp;quot;), filenames):&lt;br /&gt;
		scriptfile = open(os.path.join(dirpath, script))&lt;br /&gt;
		relativedir = re.sub(r'export\\[^\\]+\\?', '', dirpath)&lt;br /&gt;
		relativepath = os.path.join(relativedir, script)&lt;br /&gt;
		crc32 = zlib.crc32(scriptfile.read())&lt;br /&gt;
		scriptfile.close()&lt;br /&gt;
		sourcepath = os.path.join(dirpath, script)&lt;br /&gt;
		if relativepath in scriptdict:&lt;br /&gt;
			lastval = scriptdict[relativepath]&lt;br /&gt;
			if lastval['crc32'] == crc32:&lt;br /&gt;
				destdir = os.path.join(mergedir, relativedir)&lt;br /&gt;
				if os.path.exists(lastval['sourcepath']):&lt;br /&gt;
					os.remove(lastval['sourcepath'])&lt;br /&gt;
				if not os.path.exists(destdir):&lt;br /&gt;
					os.makedirs(destdir)&lt;br /&gt;
				#print(&amp;quot;move &amp;quot; + sourcepath + &amp;quot; to &amp;quot; + destdir)&lt;br /&gt;
				shutil.move(sourcepath, destdir)&lt;br /&gt;
			else:&lt;br /&gt;
				# There any many *Scene.as files that are the same&lt;br /&gt;
				# BUT there's an &amp;quot;emptyish&amp;quot; Scene.as used an as interface as well.&lt;br /&gt;
				# So you probably want Scene.as as common, but the other scenes as unique&lt;br /&gt;
				# even if they have the same name. Still throw if script is Scene.as but not if it ends with it.&lt;br /&gt;
				if not re.search(r'.Scene\.as$', script):&lt;br /&gt;
					raise Exception(&amp;quot;Same name, different CRC32: &amp;quot; + sourcepath)&lt;br /&gt;
		else:&lt;br /&gt;
			scriptdict[relativepath] = { 'crc32': crc32, 'sourcepath': sourcepath }&lt;br /&gt;
&lt;br /&gt;
# Find unique entries in SharedLibary, GUI, etc. Copy them over to commonlib but print out what we found.&lt;br /&gt;
# [Bit of a copy-pasta job here...]&lt;br /&gt;
for dirpath, dirnames, filenames in os.walk('export'):&lt;br /&gt;
	for script in filter (lambda x: x.endswith(&amp;quot;.as&amp;quot;), filenames):&lt;br /&gt;
		relativedir = re.sub(r'export\\[^\\]+\\?', '', dirpath)&lt;br /&gt;
		if relativedir == '':&lt;br /&gt;
			continue&lt;br /&gt;
		relativepath = os.path.join(relativedir, script)&lt;br /&gt;
		sourcepath = os.path.join(dirpath, script)&lt;br /&gt;
		destdir = os.path.join(mergedir, relativedir)&lt;br /&gt;
		if not os.path.exists(destdir):&lt;br /&gt;
			os.makedirs(destdir)&lt;br /&gt;
		print(&amp;quot;Unique commonlib: &amp;quot; + sourcepath)&lt;br /&gt;
		shutil.move(sourcepath, destdir)&lt;br /&gt;
&lt;br /&gt;
# Clean up empty dirs&lt;br /&gt;
for dirpath, dirnames, filenames in os.walk('export', topdown=False):&lt;br /&gt;
	for d in dirnames:&lt;br /&gt;
		try:&lt;br /&gt;
			os.rmdir(os.path.join(dirpath, d))&lt;br /&gt;
		except OSError:&lt;br /&gt;
			pass&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Making Modifications ==&lt;br /&gt;
=== Bugs and getting sources to compile ===&lt;br /&gt;
[ Note: this is mostly just copy and pasted from my post in another forum at the moment. It still needs some reworking to better explain things ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can first get the open source FlashDevelop IDE which comes with MTASC and the standard Flash library. If you have the SWFs and the ActionScript *.as files, then what you can do is create an empty ActionScript 2 project, in the project settings turn off &amp;quot;use main entry point&amp;quot; and under the project &amp;quot;injection&amp;quot; tab, point it to the SWF you want to update with your new ActionScript.&lt;br /&gt;
&lt;br /&gt;
You'll also want to update the project classpaths to point to your game's ActionScript library. Just in my experience, there seem to be some properties on some of the standard classes that would normally prevent the script from compiling - but in that case what you can do is modify the so-called intrinsic files to let the compiler know about them. E.g., you can add needed function and var declarations to the intrinsic class interfaces under C:\Program Files\FlashDevelop\Tools\mtasc. The nice thing about ActionScript and intrinsics is that you don't even need to know the values of these &amp;quot;missing&amp;quot; properties or functions if they're basically defined in the runtime environment. E.g., Mouse.LEFT isn't standard Flash, but if you edit Mouse.as and add '''static var LEFT;''' to the intrinsic class definition, then you're good to go, as the value gets looked up during execution like a dictionary value (in fact, Mouse[&amp;quot;left&amp;quot;] should yield the same result).&lt;br /&gt;
&lt;br /&gt;
Also if you press Ctrl+J you'll get the type explorer where you can right click on a folder (that you've added to your classpath) and select &amp;quot;convert to intrinsic&amp;quot;. So this way you only need to compile the actual *.as file you're making changes to and keep the others around as intrinsics. Using the IDE's SWF injection I mentioned above will make it so you don't have to worry about recompiling everything.&lt;br /&gt;
&lt;br /&gt;
You'll probably get a bunch of warnings like &amp;quot;... needs the class &amp;lt;Whatever&amp;gt; which was not compiled&amp;quot; but that's just MTASC not liking how some class names are used outside of what you're compiling like in Flash registerObject calls.&lt;br /&gt;
&lt;br /&gt;
Now the bigger issue is that MTASC is pickier about things than Adobe's compiler. You'll often have to write this.varname or ClassName.varname instead of just varname, and MTASC doesn't like named *nested* functions. So you'll sometimes have to convert function FooBar() { ... } into something like &amp;quot;this.FooBar = function() { };&amp;quot; or &amp;quot;_root.FooBar = function() { };&amp;quot;. But also make sure that the variable for the function is a class member and not function-local or it'll just be a register or randomly named variable when compiled, or just not be available in the scope you need it to be.&lt;br /&gt;
&lt;br /&gt;
MTASC is also pickier about the scope of local variables. It may sound weird, but in ActionScript 2.0 a function-local variable is defined for the scope of the function - it doesn't matter if declared in an if-statement or in braces. But the MTASC compiler will enforce that you define the variable in a &amp;quot;proper&amp;quot; scope, so you may need to move where it's declared if you want things to compile. E.g., &amp;quot;if (foo) { var tmp = 1; } else { tmp = 2; }&amp;quot; won't fly with MTASC.&lt;br /&gt;
&lt;br /&gt;
Also it seems like MTASC doesn't like the global function &amp;quot;Array&amp;quot;, but doesn't mind if you use the constructor instead. E.g., I've had issues with var ar = Array(...), but var ar = new Array(...) works or you could use the square-bracket notation instead.&lt;br /&gt;
&lt;br /&gt;
Some other stuff... if you want multiple projects, just create the projects all in the same dir (but create folders if you want to separate stuff and adjust the project classpath accordingly).&lt;br /&gt;
Also, don't necessarily set &amp;quot;Always compile&amp;quot; for the *.as file or you might run into duplicate definition errors - things should get drawn in as needed, but I think you need to set it for classes in the original SWF you wish to update. That might be a little hit and miss at first, but you can always check to make sure your changes got in.&lt;br /&gt;
&lt;br /&gt;
Also, looking at the output in FLASM, MTASC might not generate the most blazing bytecode ever - but neither does Adobe's compiler. Just some things I noticed is that Adobe's will use function argument registers more than MTASC seems to... e.g., &amp;quot;push '_root'; getVariable&amp;quot; vs just a r:_root register.&lt;br /&gt;
&lt;br /&gt;
Another apparent annoyance with MTASC is that it doesn't seem to recognize some global variables (which you can confirm with flasm's output (push 'somevar'; getVariable). Workarounds include ''_global.someVariable'', or sometimes ''_root.someVariable'' as appropriate.&lt;br /&gt;
&lt;br /&gt;
One last thing... you may want to organize your *.as files so you combine the ones that are commonly used across different SWF files so you're not always having to edit multiple copies of SomeClass.as for each SWF that uses it.&lt;br /&gt;
&lt;br /&gt;
Also, I noticed a bug in sothink that I emailed them about: doubles are formatted as single-precision floating point. But some other tools, e.g., flare, get the value correctly. You might want to search your *.as files for &amp;quot;E-&amp;quot; and &amp;quot;E+&amp;quot; to look for these misformatted values if you're using it.&lt;br /&gt;
&lt;br /&gt;
EDIT: Here's a bug with Trillix I noticed, but they said it'll be fixed soon: if you have &amp;quot;var foo = this&amp;quot; and if a register is used for 'foo', then Trillix doesn't properly initialize the register... but instead just uses 'this' everywhere else. This causes problems if you needed that variable to choose between using 'this' and possibly another object. E.g., &amp;quot;var obj = this; if (something) { obj = someOtherObject; } someFunc.doIt(obj);&amp;quot; only works as long as &amp;quot;obj&amp;quot; is stored as a variable and not a register, which is up to the original compiler. In reply, they mentioned that you could work around that issue by turning off the &amp;quot;ActionScript 'Recover arguments' names&amp;quot; setting, which makes it a bit more difficult to keep track of function arguments, so it's less than ideal.&lt;br /&gt;
&lt;br /&gt;
=== Issues displaying custom MovieClip subclasses ===&lt;br /&gt;
'''Note:''' this tries to explain some of the issues, and isn't suggesting best practices. This is a bit rambling and should be presented with more concrete examples. Ideally it wouldn't be needed at all and we could use the Scaleform SDK to convert our SWFs into GFX, or we could splice in our own movieclip symbol tags into the GFX file.&lt;br /&gt;
&lt;br /&gt;
The simple issue is this: if it wasn't originally created in the Flash designer (also having a symbol in the Flash library), then you'll have a harder time of showing custom MovieClip objects through ActionScript alone. This would appear to be a bug, but speculatively, it could be for performance reasons.&lt;br /&gt;
&lt;br /&gt;
==== Using swfmill ====&lt;br /&gt;
This hasn't been thoroughly tested, but swfmill may be a simple way to add you own symbols. Use swfmill to convert the SWF into an XML file, edit it, and then use swfmill to convert it back. It appears to work, and even properly retains the non-standard SWF tags. For custom class behavior, you'll still need to make an ''Object.registerClass'' call to associate the library symbol with the class. If you do use this method, one thing to make sure of is that the embedded textures display properly, since they're being referred to using a non-standard SWF tag.&lt;br /&gt;
&lt;br /&gt;
==== createEmptyMovieClip method ====&lt;br /&gt;
So until splicing in tags becomes more streamlined, or some other method is found, then it may be easier to just create an empty movieclip and then populate the member fields using a mixin from another class or manually, although that's probably still less than ideal for classes that use the onLoad event. Another thing as mentioned below is the possibility of abusing prototype mechanics (which can be somewhat messy) or subclass an existing class to specialize the beha&lt;br /&gt;
&lt;br /&gt;
It would appear that the ''MovieClip'' method ''createEmptyMovieClip'' is of limited use unless you then load another movieclip (such as an icon image) into it or or do a ''beginFill ... endFill'' ('''fill-code''') for a few frames to define its dimensions, filling it for as many frames until, say, its '''_height''' property becomes non-zero. It's ugly, but works. Also, if you do a fill on an object in the library, then you actually affect its '''_xscale''' and '''_yscale''' by making the object stretch to fit into your fill. Ultimately, it'd probably be less of a hassle to alter the SWF file to insert your object. Because of having to rerun the code, you'll probably want to delay having to reload images or other intensive operations. You'll have to rerun the fill-code at least twice for this to work, timing alone doesn't matter as has been determined through trial and error.&lt;br /&gt;
&lt;br /&gt;
==== attachMovie method ====&lt;br /&gt;
Perhaps a simpler way is to use ''attachMovie'', although you'll have to find a pre-existing movieclip symbol that suites your needs, and if you want to change its default dimensions then you'll have to delay the fill-code for a few (let's say 150 or so since the scene began) frames after the game loads until it actually works. '''NOTE:''' Reconfirm this is actually necessary instead of just being able to set the _height/_width/_xscale/_yscale, although you may still need to delay setting those for the change to take effect. This way you shouldn't have to keep rerunning the fill-code as with the above ''createEmptyMovieClip'' method. This whole delay business is probably more of an issue in UI elements that are on the HUD instead of selected later from the navbar. You can probably check for when you've waited enough frames by running some simple fill-code on an empty movieclip and checking whether the '''_height''' property changes. &lt;br /&gt;
E.g., the PieCooldown symbol exists in the quickbar.swf file and isn't the worst choice for an empty MovieClip. You can use programs like swix, swfmill, and probably others to find simple objects without much embedded graphics.&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
private static var EMPTYMC_LINKID:String = &amp;quot;PieCooldown&amp;quot;;	&lt;br /&gt;
var mc:MovieClip = someClip_mc.attachMovie(EMPTYMC_LINKID, &amp;quot;SomeName_mc&amp;quot;, someClip_mc.getNextHighestDepth(), {_x:10, _y:10});&lt;br /&gt;
&lt;br /&gt;
// Changing the default dimensions of &amp;quot;PieCooldown&amp;quot;&lt;br /&gt;
// Although you can probably just change the _height, _width or scales after the&lt;br /&gt;
// needed delay instead, unlike with the createEmptyMovieClip method apparently.&lt;br /&gt;
// Also not really necessary if you just want to use it as an invisible container,&lt;br /&gt;
// since other items can be positioned outside of it, relative to its local &lt;br /&gt;
// coordinates.&lt;br /&gt;
with(mc)&lt;br /&gt;
{&lt;br /&gt;
   beginFill(0, 0); // alpha is zero.&lt;br /&gt;
   moveTo(0, 0);&lt;br /&gt;
   lineTo(21, 0);&lt;br /&gt;
   lineTo(21, 21);&lt;br /&gt;
   lineTo(0, 21);&lt;br /&gt;
   endFill();	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The game's script sources also come with a ''MovieUtils'' class, which has a wrapper around ''attachMovie''. This can be useful to create an instance of a library symbol in the SWF file and use it instead for another purpose. &lt;br /&gt;
&lt;br /&gt;
Other useful workaround would be abusing prototype mechanics of ActionScript to give an already existing class other behavior if desired, and can be switched using a custom argument for the initObject during the attachMovie call. This way you don't have to edit the actual class file, if making it recompile is problematic or time consuming. Although this is a kludge method of doing it.&lt;br /&gt;
&lt;br /&gt;
Also of note is that ''Object.registerClass'' or the so-called [http://www.google.com/search?hl=en&amp;amp;source=hp&amp;amp;q=attachMovie+__packages+trick __Packages trick] won't really get you anywhere either. You'll be able to create the MovieClip subclass, but it won't display properly (or just differently) without the above-mentioned tricks.&lt;br /&gt;
&lt;br /&gt;
Creating a subclass of an existing class that's registered with ''Object.registerClass'' may also be a convenient way to customize class behavior without having to recompile the base class if you then change the registerClass call to use the subclass.&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=UI_Tutorial_(draft)&amp;diff=14677</id>
		<title>UI Tutorial (draft)</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=UI_Tutorial_(draft)&amp;diff=14677"/>
				<updated>2010-11-13T02:16:18Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: /* Other information sources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Author's note''': STILL A WORK IN PROGRESS - FIRST DUMPING INFORMATION OUT, THEN I'LL FORMAT AND SECTION IT OFF BETTER. This isn't a very good tutorial, but as I said, I'm just trying to get the information out there and I'm slow to update this. Also, it may be simpler now that the UDK has support for GFX files, but I don't know the cross-licensing or technical situation on that right now.&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
The UI files are basically just version 8 Adobe Flash files, but extended with some extra properties and image handling (they even use nonstandard tags in the SWF for that). GFX files supposedly have more optimized fonts and who really knows what else, but you shouldn't have to worry about font embedding in Dragon Age.&lt;br /&gt;
&lt;br /&gt;
This means they use the older ActionScript 2.0, which you can find some learning resources on here [http://download.macromedia.com/pub/documentation/en/flash/fl8/fl8_learning_as2.pdf fl8_learning_as2.pdf] and here [http://livedocs.adobe.com/flash/9.0/main/flash_as2_learning.pdf flash_as2_learning.pdf], among other places scattered on the web. You can download the API reference, but a decent online location is [http://flash-reference.icod.de/ here] (faster than Adobe's site I find).&lt;br /&gt;
&lt;br /&gt;
=== Other information sources ===&lt;br /&gt;
There's a woefully incomplete GUI category on the wiki here [[:Category:GUI]]. It was an early effort at detailing some of the class specifics in the UI files. There are a lot of stubs, but some classes are more detailed.&lt;br /&gt;
&lt;br /&gt;
There's also a long-standing draft article on the profile page here [[User:FollowTheGourd]] about the conversation UI. It could also be ammended to explain things like 800x600 is treated as if it were 1024x768, and that the cutscene bars actually have a negative height if the screen width is much longer than the screen height, as seen with Eyefinity display setups.&lt;br /&gt;
&lt;br /&gt;
Another thing to realize is the game's aspect ratio correction and how one resolution in window mode will get stretched to fill your screen space in fullscreen mode. So then there's a difference between the Stage (Flash term) width and height and the video settings which you can access using the ExternalCommands ActionScript class. The point is that the Stage dimensions are more reliable than the video settings you can retrieve through the ExternalCommands class, although it doesn't stop the quickbar UI file from reading the attribute ''&amp;quot;ClientOptions.VideoOptions.ResolutionWidth&amp;quot;'' from it, although there might be a perfectly good reason for that - I haven't really looked too far into why they made that choice.&lt;br /&gt;
&lt;br /&gt;
== Toolchain ==&lt;br /&gt;
&lt;br /&gt;
[http://www.flashdevelop.org/ FlashDevelop IDE.]&lt;br /&gt;
etc&lt;br /&gt;
&lt;br /&gt;
== Organizing Sources ==&lt;br /&gt;
&lt;br /&gt;
Obtain an ActionScript 2.0 decompiler such as Sothink or Trillix. Each has their shortcomings and will require further post-processing. Sothink's ActionScript output will probably require more work to make compile with MTASC, but Trillix's output seems to have some stranger bugs I'll mention later, which makes me more hesitant to recommend it. Sothink's tool still seems to have an issue formatting double-precision values as single-precision, as detailed in the section below. [http://www.nowrap.de/flare.html Flare] is also a nice free tool to compare output against, but it unfortunately isn't in a format that you can simply recompile.&lt;br /&gt;
&lt;br /&gt;
[http://www.nowrap.de/flasm.html Flasm] is also a useful tool if you wish to examine the p-code directly (as a debug or learning aid perhaps), or even modify it that way.&lt;br /&gt;
&lt;br /&gt;
=== GFX to SWF ===&lt;br /&gt;
&lt;br /&gt;
If you want your changes to be compatible with a certain or the latest game patch, then you'll also have to first merge the appropriate [[GFX]] files. For example, to be compatible with game v1.03, you'll first need to extract the GFX files from guiexport.erf, and then from the patch000.erf, patch001.erf, and patch002.erf files found under C:\Program Files\Dragon Age\packages\core\patch. If you want to be compatible with v1.02a, then it should suffice to stop merging after patch001.erf.&lt;br /&gt;
&lt;br /&gt;
Then you want to change the first three bytes for the GFX to CWS and change the file suffix to SWF.&lt;br /&gt;
Example Python script:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
from __future__ import with_statement&lt;br /&gt;
# The first line is required if you get the following error when running the python script under 2.5.4/2.5.5&lt;br /&gt;
# SyntaxError: invalid syntax - with open(gfxPath, &amp;quot;rb+&amp;quot;) as gfxFile:&lt;br /&gt;
import glob&lt;br /&gt;
import os&lt;br /&gt;
import struct&lt;br /&gt;
&lt;br /&gt;
for gfxPath in glob.glob('*.gfx'):&lt;br /&gt;
	with open(gfxPath, &amp;quot;rb+&amp;quot;) as gfxFile:&lt;br /&gt;
		print(gfxPath)&lt;br /&gt;
		gfxFile.write(struct.pack('3s', &amp;quot;CWS&amp;quot;))&lt;br /&gt;
	os.rename(gfxPath, os.path.splitext(gfxPath)[0] + &amp;quot;.swf&amp;quot;) &lt;br /&gt;
		&lt;br /&gt;
line = input(&amp;quot;Press enter to exit.&amp;quot;)&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Obtain ActionScript Sources ===&lt;br /&gt;
&lt;br /&gt;
If you're using Sothink's tool, then here's an example of how you would quickly retrieve the ActionScript, if you've converted the GFX into SWFs as mentioned above. Do a multi-file export with all of the SWF files (merged to whichever patch version you wish). [http://i1002.photobucket.com/albums/af150/FollowTheGourd/sothink_swf.jpg Screen shot]&lt;br /&gt;
&lt;br /&gt;
=== Merge ActionScript Classes ===&lt;br /&gt;
&lt;br /&gt;
It's a good idea to create a single ActionScript library of all the game sources; that way you don't have to repeatedly make the same modifications for every SWF file that uses the same modified classes. As you'll see later when using the SWF injection method, that this doesn't make available all of the classes to every SWF file, but it's a way to avoid redundant editing.&lt;br /&gt;
&lt;br /&gt;
For instance, here's a embarrassingly quick and dirty way of doing it with a Python script:&lt;br /&gt;
''Note:'' this will throw an exception on later versions of Python because shutil.move undocumentedly doesn't want to clobber existing files. You could add a check if the file already exists and not move it - or rewrite the script and make something better.&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
from __future__ import with_statement&lt;br /&gt;
# The first line is required if you get the following error when running the python script under 2.5.4/2.5.5&lt;br /&gt;
# SyntaxError: invalid syntax - with open(gfxPath, &amp;quot;rb+&amp;quot;) as gfxFile:&lt;br /&gt;
# [Yes, this code probably sucks]&lt;br /&gt;
&lt;br /&gt;
import shutil&lt;br /&gt;
import os&lt;br /&gt;
import re&lt;br /&gt;
import zlib&lt;br /&gt;
&lt;br /&gt;
# Usage: have the batch exported ActionScript from the decompiler (say Sothink) in a dir called export. Then run this &lt;br /&gt;
# script at the same level as the export dir. It will create a C:\commonlib folder with the ActionScript merged into it.&lt;br /&gt;
# Left over in export is what you can import into a FlashDevelop project. You'll also want to make&lt;br /&gt;
# intrinsics out of export and commonlib, but commlib goes in the global classpath, while&lt;br /&gt;
# the appropriate export subfolder goes in the appropriate project classpath.&lt;br /&gt;
&lt;br /&gt;
mergedir = r'C:\commonlib'&lt;br /&gt;
scriptdict = {}&lt;br /&gt;
for dirpath, dirnames, filenames in os.walk('export'):&lt;br /&gt;
	print(dirpath)&lt;br /&gt;
	for junk in filter (lambda x: not x.endswith(&amp;quot;.as&amp;quot;), filenames):&lt;br /&gt;
		os.remove(os.path.join(dirpath, junk))&lt;br /&gt;
	for script in filter( lambda x : x.endswith(&amp;quot;.as&amp;quot;), filenames):&lt;br /&gt;
		scriptfile = open(os.path.join(dirpath, script))&lt;br /&gt;
		relativedir = re.sub(r'export\\[^\\]+\\?', '', dirpath)&lt;br /&gt;
		relativepath = os.path.join(relativedir, script)&lt;br /&gt;
		crc32 = zlib.crc32(scriptfile.read())&lt;br /&gt;
		scriptfile.close()&lt;br /&gt;
		sourcepath = os.path.join(dirpath, script)&lt;br /&gt;
		if relativepath in scriptdict:&lt;br /&gt;
			lastval = scriptdict[relativepath]&lt;br /&gt;
			if lastval['crc32'] == crc32:&lt;br /&gt;
				destdir = os.path.join(mergedir, relativedir)&lt;br /&gt;
				if os.path.exists(lastval['sourcepath']):&lt;br /&gt;
					os.remove(lastval['sourcepath'])&lt;br /&gt;
				if not os.path.exists(destdir):&lt;br /&gt;
					os.makedirs(destdir)&lt;br /&gt;
				#print(&amp;quot;move &amp;quot; + sourcepath + &amp;quot; to &amp;quot; + destdir)&lt;br /&gt;
				shutil.move(sourcepath, destdir)&lt;br /&gt;
			else:&lt;br /&gt;
				# There any many *Scene.as files that are the same&lt;br /&gt;
				# BUT there's an &amp;quot;emptyish&amp;quot; Scene.as used an as interface as well.&lt;br /&gt;
				# So you probably want Scene.as as common, but the other scenes as unique&lt;br /&gt;
				# even if they have the same name. Still throw if script is Scene.as but not if it ends with it.&lt;br /&gt;
				if not re.search(r'.Scene\.as$', script):&lt;br /&gt;
					raise Exception(&amp;quot;Same name, different CRC32: &amp;quot; + sourcepath)&lt;br /&gt;
		else:&lt;br /&gt;
			scriptdict[relativepath] = { 'crc32': crc32, 'sourcepath': sourcepath }&lt;br /&gt;
&lt;br /&gt;
# Find unique entries in SharedLibary, GUI, etc. Copy them over to commonlib but print out what we found.&lt;br /&gt;
# [Bit of a copy-pasta job here...]&lt;br /&gt;
for dirpath, dirnames, filenames in os.walk('export'):&lt;br /&gt;
	for script in filter (lambda x: x.endswith(&amp;quot;.as&amp;quot;), filenames):&lt;br /&gt;
		relativedir = re.sub(r'export\\[^\\]+\\?', '', dirpath)&lt;br /&gt;
		if relativedir == '':&lt;br /&gt;
			continue&lt;br /&gt;
		relativepath = os.path.join(relativedir, script)&lt;br /&gt;
		sourcepath = os.path.join(dirpath, script)&lt;br /&gt;
		destdir = os.path.join(mergedir, relativedir)&lt;br /&gt;
		if not os.path.exists(destdir):&lt;br /&gt;
			os.makedirs(destdir)&lt;br /&gt;
		print(&amp;quot;Unique commonlib: &amp;quot; + sourcepath)&lt;br /&gt;
		shutil.move(sourcepath, destdir)&lt;br /&gt;
&lt;br /&gt;
# Clean up empty dirs&lt;br /&gt;
for dirpath, dirnames, filenames in os.walk('export', topdown=False):&lt;br /&gt;
	for d in dirnames:&lt;br /&gt;
		try:&lt;br /&gt;
			os.rmdir(os.path.join(dirpath, d))&lt;br /&gt;
		except OSError:&lt;br /&gt;
			pass&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Making Modifications ==&lt;br /&gt;
=== Bugs and getting sources to compile ===&lt;br /&gt;
[ Note: this is mostly just copy and pasted from my post in another forum at the moment. It still needs some reworking to better explain things ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can first get the open source FlashDevelop IDE which comes with MTASC and the standard Flash library. If you have the SWFs and the ActionScript *.as files, then what you can do is create an empty ActionScript 2 project, in the project settings turn off &amp;quot;use main entry point&amp;quot; and under the project &amp;quot;injection&amp;quot; tab, point it to the SWF you want to update with your new ActionScript.&lt;br /&gt;
&lt;br /&gt;
You'll also want to update the project classpaths to point to your game's ActionScript library. Just in my experience, there seem to be some properties on some of the standard classes that would normally prevent the script from compiling - but in that case what you can do is modify the so-called intrinsic files to let the compiler know about them. E.g., you can add needed function and var declarations to the intrinsic class interfaces under C:\Program Files\FlashDevelop\Tools\mtasc. The nice thing about ActionScript and intrinsics is that you don't even need to know the values of these &amp;quot;missing&amp;quot; properties or functions if they're basically defined in the runtime environment. E.g., Mouse.LEFT isn't standard Flash, but if you edit Mouse.as and add '''static var LEFT;''' to the intrinsic class definition, then you're good to go, as the value gets looked up during execution like a dictionary value (in fact, Mouse[&amp;quot;left&amp;quot;] should yield the same result).&lt;br /&gt;
&lt;br /&gt;
Also if you press Ctrl+J you'll get the type explorer where you can right click on a folder (that you've added to your classpath) and select &amp;quot;convert to intrinsic&amp;quot;. So this way you only need to compile the actual *.as file you're making changes to and keep the others around as intrinsics. Using the IDE's SWF injection I mentioned above will make it so you don't have to worry about recompiling everything.&lt;br /&gt;
&lt;br /&gt;
You'll probably get a bunch of warnings like &amp;quot;... needs the class &amp;lt;Whatever&amp;gt; which was not compiled&amp;quot; but that's just MTASC not liking how some class names are used outside of what you're compiling like in Flash registerObject calls.&lt;br /&gt;
&lt;br /&gt;
Now the bigger issue is that MTASC is pickier about things than Adobe's compiler. You'll often have to write this.varname or ClassName.varname instead of just varname, and MTASC doesn't like named *nested* functions. So you'll sometimes have to convert function FooBar() { ... } into something like &amp;quot;this.FooBar = function() { };&amp;quot; or &amp;quot;_root.FooBar = function() { };&amp;quot;. But also make sure that the variable for the function is a class member and not function-local or it'll just be a register or randomly named variable when compiled, or just not be available in the scope you need it to be.&lt;br /&gt;
&lt;br /&gt;
MTASC is also pickier about the scope of local variables. It may sound weird, but in ActionScript 2.0 a function-local variable is defined for the scope of the function - it doesn't matter if declared in an if-statement or in braces. But the MTASC compiler will enforce that you define the variable in a &amp;quot;proper&amp;quot; scope, so you may need to move where it's declared if you want things to compile. E.g., &amp;quot;if (foo) { var tmp = 1; } else { tmp = 2; }&amp;quot; won't fly with MTASC.&lt;br /&gt;
&lt;br /&gt;
Also it seems like MTASC doesn't like the global function &amp;quot;Array&amp;quot;, but doesn't mind if you use the constructor instead. E.g., I've had issues with var ar = Array(...), but var ar = new Array(...) works or you could use the square-bracket notation instead.&lt;br /&gt;
&lt;br /&gt;
Some other stuff... if you want multiple projects, just create the projects all in the same dir (but create folders if you want to separate stuff and adjust the project classpath accordingly).&lt;br /&gt;
Also, don't necessarily set &amp;quot;Always compile&amp;quot; for the *.as file or you might run into duplicate definition errors - things should get drawn in as needed, but I think you need to set it for classes in the original SWF you wish to update. That might be a little hit and miss at first, but you can always check to make sure your changes got in.&lt;br /&gt;
&lt;br /&gt;
Also, looking at the output in FLASM, MTASC might not generate the most blazing bytecode ever - but neither does Adobe's compiler. Just some things I noticed is that Adobe's will use function argument registers more than MTASC seems to... e.g., &amp;quot;push '_root'; getVariable&amp;quot; vs just a r:_root register.&lt;br /&gt;
&lt;br /&gt;
Another apparent annoyance with MTASC is that it doesn't seem to recognize some global variables (which you can confirm with flasm's output (push 'somevar'; getVariable). Workarounds include ''_global.someVariable'', or sometimes ''_root.someVariable'' as appropriate.&lt;br /&gt;
&lt;br /&gt;
One last thing... you may want to organize your *.as files so you combine the ones that are commonly used across different SWF files so you're not always having to edit multiple copies of SomeClass.as for each SWF that uses it.&lt;br /&gt;
&lt;br /&gt;
Also, I noticed a bug in sothink that I emailed them about: doubles are formatted as single-precision floating point. But some other tools, e.g., flare, get the value correctly. You might want to search your *.as files for &amp;quot;E-&amp;quot; and &amp;quot;E+&amp;quot; to look for these misformatted values if you're using it.&lt;br /&gt;
&lt;br /&gt;
EDIT: Here's a bug with Trillix I noticed, but they said it'll be fixed soon: if you have &amp;quot;var foo = this&amp;quot; and if a register is used for 'foo', then Trillix doesn't properly initialize the register... but instead just uses 'this' everywhere else. This causes problems if you needed that variable to choose between using 'this' and possibly another object. E.g., &amp;quot;var obj = this; if (something) { obj = someOtherObject; } someFunc.doIt(obj);&amp;quot; only works as long as &amp;quot;obj&amp;quot; is stored as a variable and not a register, which is up to the original compiler. In reply, they mentioned that you could work around that issue by turning off the &amp;quot;ActionScript 'Recover arguments' names&amp;quot; setting, which makes it a bit more difficult to keep track of function arguments, so it's less than ideal.&lt;br /&gt;
&lt;br /&gt;
=== Issues displaying custom MovieClip subclasses ===&lt;br /&gt;
'''Note:''' this tries to explain some of the issues, and isn't suggesting best practices. This is a bit rambling and should be presented with more concrete examples. Ideally it wouldn't be needed at all and we could use the Scaleform SDK to convert our SWFs into GFX, or we could splice in our own movieclip symbol tags into the GFX file.&lt;br /&gt;
&lt;br /&gt;
The simple issue is this: if it wasn't originally created in the Flash designer (also having a symbol in the Flash library), then you'll have a harder time of showing custom MovieClip objects through ActionScript alone. This would appear to be a bug, but speculatively, it could be for performance reasons.&lt;br /&gt;
&lt;br /&gt;
==== Using swfmill ====&lt;br /&gt;
This hasn't been thoroughly tested, but swfmill may be a simple way to add you own symbols. Use swfmill to convert the SWF into an XML file, edit it, and then use swfmill to convert it back. It appears to work, and even properly retains the non-standard SWF tags. For custom class behavior, you'll still need to make an ''Object.registerClass'' call to associate the library symbol with the class. If you do use this method, one thing to make sure of is that the embedded textures display properly, since they're being referred to using a non-standard SWF tag.&lt;br /&gt;
&lt;br /&gt;
==== createEmptyMovieClip method ====&lt;br /&gt;
So until splicing in tags becomes more streamlined, or some other method is found, then it may be easier to just create an empty movieclip and then populate the member fields using a mixin from another class or manually, although that's probably still less than ideal for classes that use the onLoad event. Another thing as mentioned below is the possibility of abusing prototype mechanics (which can be somewhat messy) or subclass an existing class to specialize the beha&lt;br /&gt;
&lt;br /&gt;
It would appear that the ''MovieClip'' method ''createEmptyMovieClip'' is of limited use unless you then load another movieclip (such as an icon image) into it or or do a ''beginFill ... endFill'' ('''fill-code''') for a few frames to define its dimensions, filling it for as many frames until, say, its '''_height''' property becomes non-zero. It's ugly, but works. Also, if you do a fill on an object in the library, then you actually affect its '''_xscale''' and '''_yscale''' by making the object stretch to fit into your fill. Ultimately, it'd probably be less of a hassle to alter the SWF file to insert your object. Because of having to rerun the code, you'll probably want to delay having to reload images or other intensive operations. You'll have to rerun the fill-code at least twice for this to work, timing alone doesn't matter as has been determined through trial and error.&lt;br /&gt;
&lt;br /&gt;
==== attachMovie method ====&lt;br /&gt;
Perhaps a simpler way is to use ''attachMovie'', although you'll have to find a pre-existing movieclip symbol that suites your needs, and if you want to change its default dimensions then you'll have to delay the fill-code for a few (let's say 150 or so since the scene began) frames after the game loads until it actually works. '''NOTE:''' Reconfirm this is actually necessary instead of just being able to set the _height/_width/_xscale/_yscale, although you may still need to delay setting those for the change to take effect. This way you shouldn't have to keep rerunning the fill-code as with the above ''createEmptyMovieClip'' method. This whole delay business is probably more of an issue in UI elements that are on the HUD instead of selected later from the navbar. You can probably check for when you've waited enough frames by running some simple fill-code on an empty movieclip and checking whether the '''_height''' property changes. &lt;br /&gt;
E.g., the PieCooldown symbol exists in the quickbar.swf file and isn't the worst choice for an empty MovieClip. You can use programs like swix, swfmill, and probably others to find simple objects without much embedded graphics.&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
private static var EMPTYMC_LINKID:String = &amp;quot;PieCooldown&amp;quot;;	&lt;br /&gt;
var mc:MovieClip = someClip_mc.attachMovie(EMPTYMC_LINKID, &amp;quot;SomeName_mc&amp;quot;, someClip_mc.getNextHighestDepth(), {_x:10, _y:10});&lt;br /&gt;
&lt;br /&gt;
// Changing the default dimensions of &amp;quot;PieCooldown&amp;quot;&lt;br /&gt;
// Although you can probably just change the _height, _width or scales after the&lt;br /&gt;
// needed delay instead, unlike with the createEmptyMovieClip method apparently.&lt;br /&gt;
// Also not really necessary if you just want to use it as an invisible container,&lt;br /&gt;
// since other items can be positioned outside of it, relative to its local &lt;br /&gt;
// coordinates.&lt;br /&gt;
with(mc)&lt;br /&gt;
{&lt;br /&gt;
   beginFill(0, 0); // alpha is zero.&lt;br /&gt;
   moveTo(0, 0);&lt;br /&gt;
   lineTo(21, 0);&lt;br /&gt;
   lineTo(21, 21);&lt;br /&gt;
   lineTo(0, 21);&lt;br /&gt;
   endFill();	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The game's script sources also come with a ''MovieUtils'' class, which has a wrapper around ''attachMovie''. This can be useful to create an instance of a library symbol in the SWF file and use it instead for another purpose. &lt;br /&gt;
&lt;br /&gt;
Other useful workaround would be abusing prototype mechanics of ActionScript to give an already existing class other behavior if desired, and can be switched using a custom argument for the initObject during the attachMovie call. This way you don't have to edit the actual class file, if making it recompile is problematic or time consuming. Although this is a kludge method of doing it.&lt;br /&gt;
&lt;br /&gt;
Also of note is that ''Object.registerClass'' or the so-called [http://www.google.com/search?hl=en&amp;amp;source=hp&amp;amp;q=attachMovie+__packages+trick __Packages trick] won't really get you anywhere either. You'll be able to create the MovieClip subclass, but it won't display properly (or just differently) without the above-mentioned tricks.&lt;br /&gt;
&lt;br /&gt;
Creating a subclass of an existing class that's registered with ''Object.registerClass'' may also be a convenient way to customize class behavior without having to recompile the base class if you then change the registerClass call to use the subclass.&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=UI_Tutorial_(draft)&amp;diff=14676</id>
		<title>UI Tutorial (draft)</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=UI_Tutorial_(draft)&amp;diff=14676"/>
				<updated>2010-11-13T02:15:15Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: /* Other information sources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Author's note''': STILL A WORK IN PROGRESS - FIRST DUMPING INFORMATION OUT, THEN I'LL FORMAT AND SECTION IT OFF BETTER. This isn't a very good tutorial, but as I said, I'm just trying to get the information out there and I'm slow to update this. Also, it may be simpler now that the UDK has support for GFX files, but I don't know the cross-licensing or technical situation on that right now.&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
The UI files are basically just version 8 Adobe Flash files, but extended with some extra properties and image handling (they even use nonstandard tags in the SWF for that). GFX files supposedly have more optimized fonts and who really knows what else, but you shouldn't have to worry about font embedding in Dragon Age.&lt;br /&gt;
&lt;br /&gt;
This means they use the older ActionScript 2.0, which you can find some learning resources on here [http://download.macromedia.com/pub/documentation/en/flash/fl8/fl8_learning_as2.pdf fl8_learning_as2.pdf] and here [http://livedocs.adobe.com/flash/9.0/main/flash_as2_learning.pdf flash_as2_learning.pdf], among other places scattered on the web. You can download the API reference, but a decent online location is [http://flash-reference.icod.de/ here] (faster than Adobe's site I find).&lt;br /&gt;
&lt;br /&gt;
=== Other information sources ===&lt;br /&gt;
There's a woefully incomplete GUI category on the wiki here [[:Category:GUI]]. It was an early effort at detailing some of the class specifics in the UI files. There are a lot of stubs, but some classes are more detailed.&lt;br /&gt;
&lt;br /&gt;
There's also a long-standing draft article on the profile page here [[User:FollowTheGourd]] about the conversation UI. It could also be ammended to explain things like 800x600 is treated as if it were 1024x768, and that the cutscene bars actually have a negative height if the screen width is much longer than the screen height, as seen with Eyefinity display setups.&lt;br /&gt;
&lt;br /&gt;
Another thing to realize is the game's aspect ratio correction and how one resolution in window mode will get stretched to fill your screen space in fullscreen mode. So then there's a difference between the Stage (Flash term) width and height and the video settings which you can access using the ExternalCommands ActionScript class. The point is that the Stage dimensions are more reliable than the video settings you can retrieve through the ExternalCommands class, although it doesn't stop the quickbar UI file from reading the attribute ''&amp;quot;ClientOptions.VideoOptions.ResolutionWidth&amp;quot;'' from it.&lt;br /&gt;
&lt;br /&gt;
== Toolchain ==&lt;br /&gt;
&lt;br /&gt;
[http://www.flashdevelop.org/ FlashDevelop IDE.]&lt;br /&gt;
etc&lt;br /&gt;
&lt;br /&gt;
== Organizing Sources ==&lt;br /&gt;
&lt;br /&gt;
Obtain an ActionScript 2.0 decompiler such as Sothink or Trillix. Each has their shortcomings and will require further post-processing. Sothink's ActionScript output will probably require more work to make compile with MTASC, but Trillix's output seems to have some stranger bugs I'll mention later, which makes me more hesitant to recommend it. Sothink's tool still seems to have an issue formatting double-precision values as single-precision, as detailed in the section below. [http://www.nowrap.de/flare.html Flare] is also a nice free tool to compare output against, but it unfortunately isn't in a format that you can simply recompile.&lt;br /&gt;
&lt;br /&gt;
[http://www.nowrap.de/flasm.html Flasm] is also a useful tool if you wish to examine the p-code directly (as a debug or learning aid perhaps), or even modify it that way.&lt;br /&gt;
&lt;br /&gt;
=== GFX to SWF ===&lt;br /&gt;
&lt;br /&gt;
If you want your changes to be compatible with a certain or the latest game patch, then you'll also have to first merge the appropriate [[GFX]] files. For example, to be compatible with game v1.03, you'll first need to extract the GFX files from guiexport.erf, and then from the patch000.erf, patch001.erf, and patch002.erf files found under C:\Program Files\Dragon Age\packages\core\patch. If you want to be compatible with v1.02a, then it should suffice to stop merging after patch001.erf.&lt;br /&gt;
&lt;br /&gt;
Then you want to change the first three bytes for the GFX to CWS and change the file suffix to SWF.&lt;br /&gt;
Example Python script:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
from __future__ import with_statement&lt;br /&gt;
# The first line is required if you get the following error when running the python script under 2.5.4/2.5.5&lt;br /&gt;
# SyntaxError: invalid syntax - with open(gfxPath, &amp;quot;rb+&amp;quot;) as gfxFile:&lt;br /&gt;
import glob&lt;br /&gt;
import os&lt;br /&gt;
import struct&lt;br /&gt;
&lt;br /&gt;
for gfxPath in glob.glob('*.gfx'):&lt;br /&gt;
	with open(gfxPath, &amp;quot;rb+&amp;quot;) as gfxFile:&lt;br /&gt;
		print(gfxPath)&lt;br /&gt;
		gfxFile.write(struct.pack('3s', &amp;quot;CWS&amp;quot;))&lt;br /&gt;
	os.rename(gfxPath, os.path.splitext(gfxPath)[0] + &amp;quot;.swf&amp;quot;) &lt;br /&gt;
		&lt;br /&gt;
line = input(&amp;quot;Press enter to exit.&amp;quot;)&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Obtain ActionScript Sources ===&lt;br /&gt;
&lt;br /&gt;
If you're using Sothink's tool, then here's an example of how you would quickly retrieve the ActionScript, if you've converted the GFX into SWFs as mentioned above. Do a multi-file export with all of the SWF files (merged to whichever patch version you wish). [http://i1002.photobucket.com/albums/af150/FollowTheGourd/sothink_swf.jpg Screen shot]&lt;br /&gt;
&lt;br /&gt;
=== Merge ActionScript Classes ===&lt;br /&gt;
&lt;br /&gt;
It's a good idea to create a single ActionScript library of all the game sources; that way you don't have to repeatedly make the same modifications for every SWF file that uses the same modified classes. As you'll see later when using the SWF injection method, that this doesn't make available all of the classes to every SWF file, but it's a way to avoid redundant editing.&lt;br /&gt;
&lt;br /&gt;
For instance, here's a embarrassingly quick and dirty way of doing it with a Python script:&lt;br /&gt;
''Note:'' this will throw an exception on later versions of Python because shutil.move undocumentedly doesn't want to clobber existing files. You could add a check if the file already exists and not move it - or rewrite the script and make something better.&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
from __future__ import with_statement&lt;br /&gt;
# The first line is required if you get the following error when running the python script under 2.5.4/2.5.5&lt;br /&gt;
# SyntaxError: invalid syntax - with open(gfxPath, &amp;quot;rb+&amp;quot;) as gfxFile:&lt;br /&gt;
# [Yes, this code probably sucks]&lt;br /&gt;
&lt;br /&gt;
import shutil&lt;br /&gt;
import os&lt;br /&gt;
import re&lt;br /&gt;
import zlib&lt;br /&gt;
&lt;br /&gt;
# Usage: have the batch exported ActionScript from the decompiler (say Sothink) in a dir called export. Then run this &lt;br /&gt;
# script at the same level as the export dir. It will create a C:\commonlib folder with the ActionScript merged into it.&lt;br /&gt;
# Left over in export is what you can import into a FlashDevelop project. You'll also want to make&lt;br /&gt;
# intrinsics out of export and commonlib, but commlib goes in the global classpath, while&lt;br /&gt;
# the appropriate export subfolder goes in the appropriate project classpath.&lt;br /&gt;
&lt;br /&gt;
mergedir = r'C:\commonlib'&lt;br /&gt;
scriptdict = {}&lt;br /&gt;
for dirpath, dirnames, filenames in os.walk('export'):&lt;br /&gt;
	print(dirpath)&lt;br /&gt;
	for junk in filter (lambda x: not x.endswith(&amp;quot;.as&amp;quot;), filenames):&lt;br /&gt;
		os.remove(os.path.join(dirpath, junk))&lt;br /&gt;
	for script in filter( lambda x : x.endswith(&amp;quot;.as&amp;quot;), filenames):&lt;br /&gt;
		scriptfile = open(os.path.join(dirpath, script))&lt;br /&gt;
		relativedir = re.sub(r'export\\[^\\]+\\?', '', dirpath)&lt;br /&gt;
		relativepath = os.path.join(relativedir, script)&lt;br /&gt;
		crc32 = zlib.crc32(scriptfile.read())&lt;br /&gt;
		scriptfile.close()&lt;br /&gt;
		sourcepath = os.path.join(dirpath, script)&lt;br /&gt;
		if relativepath in scriptdict:&lt;br /&gt;
			lastval = scriptdict[relativepath]&lt;br /&gt;
			if lastval['crc32'] == crc32:&lt;br /&gt;
				destdir = os.path.join(mergedir, relativedir)&lt;br /&gt;
				if os.path.exists(lastval['sourcepath']):&lt;br /&gt;
					os.remove(lastval['sourcepath'])&lt;br /&gt;
				if not os.path.exists(destdir):&lt;br /&gt;
					os.makedirs(destdir)&lt;br /&gt;
				#print(&amp;quot;move &amp;quot; + sourcepath + &amp;quot; to &amp;quot; + destdir)&lt;br /&gt;
				shutil.move(sourcepath, destdir)&lt;br /&gt;
			else:&lt;br /&gt;
				# There any many *Scene.as files that are the same&lt;br /&gt;
				# BUT there's an &amp;quot;emptyish&amp;quot; Scene.as used an as interface as well.&lt;br /&gt;
				# So you probably want Scene.as as common, but the other scenes as unique&lt;br /&gt;
				# even if they have the same name. Still throw if script is Scene.as but not if it ends with it.&lt;br /&gt;
				if not re.search(r'.Scene\.as$', script):&lt;br /&gt;
					raise Exception(&amp;quot;Same name, different CRC32: &amp;quot; + sourcepath)&lt;br /&gt;
		else:&lt;br /&gt;
			scriptdict[relativepath] = { 'crc32': crc32, 'sourcepath': sourcepath }&lt;br /&gt;
&lt;br /&gt;
# Find unique entries in SharedLibary, GUI, etc. Copy them over to commonlib but print out what we found.&lt;br /&gt;
# [Bit of a copy-pasta job here...]&lt;br /&gt;
for dirpath, dirnames, filenames in os.walk('export'):&lt;br /&gt;
	for script in filter (lambda x: x.endswith(&amp;quot;.as&amp;quot;), filenames):&lt;br /&gt;
		relativedir = re.sub(r'export\\[^\\]+\\?', '', dirpath)&lt;br /&gt;
		if relativedir == '':&lt;br /&gt;
			continue&lt;br /&gt;
		relativepath = os.path.join(relativedir, script)&lt;br /&gt;
		sourcepath = os.path.join(dirpath, script)&lt;br /&gt;
		destdir = os.path.join(mergedir, relativedir)&lt;br /&gt;
		if not os.path.exists(destdir):&lt;br /&gt;
			os.makedirs(destdir)&lt;br /&gt;
		print(&amp;quot;Unique commonlib: &amp;quot; + sourcepath)&lt;br /&gt;
		shutil.move(sourcepath, destdir)&lt;br /&gt;
&lt;br /&gt;
# Clean up empty dirs&lt;br /&gt;
for dirpath, dirnames, filenames in os.walk('export', topdown=False):&lt;br /&gt;
	for d in dirnames:&lt;br /&gt;
		try:&lt;br /&gt;
			os.rmdir(os.path.join(dirpath, d))&lt;br /&gt;
		except OSError:&lt;br /&gt;
			pass&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Making Modifications ==&lt;br /&gt;
=== Bugs and getting sources to compile ===&lt;br /&gt;
[ Note: this is mostly just copy and pasted from my post in another forum at the moment. It still needs some reworking to better explain things ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can first get the open source FlashDevelop IDE which comes with MTASC and the standard Flash library. If you have the SWFs and the ActionScript *.as files, then what you can do is create an empty ActionScript 2 project, in the project settings turn off &amp;quot;use main entry point&amp;quot; and under the project &amp;quot;injection&amp;quot; tab, point it to the SWF you want to update with your new ActionScript.&lt;br /&gt;
&lt;br /&gt;
You'll also want to update the project classpaths to point to your game's ActionScript library. Just in my experience, there seem to be some properties on some of the standard classes that would normally prevent the script from compiling - but in that case what you can do is modify the so-called intrinsic files to let the compiler know about them. E.g., you can add needed function and var declarations to the intrinsic class interfaces under C:\Program Files\FlashDevelop\Tools\mtasc. The nice thing about ActionScript and intrinsics is that you don't even need to know the values of these &amp;quot;missing&amp;quot; properties or functions if they're basically defined in the runtime environment. E.g., Mouse.LEFT isn't standard Flash, but if you edit Mouse.as and add '''static var LEFT;''' to the intrinsic class definition, then you're good to go, as the value gets looked up during execution like a dictionary value (in fact, Mouse[&amp;quot;left&amp;quot;] should yield the same result).&lt;br /&gt;
&lt;br /&gt;
Also if you press Ctrl+J you'll get the type explorer where you can right click on a folder (that you've added to your classpath) and select &amp;quot;convert to intrinsic&amp;quot;. So this way you only need to compile the actual *.as file you're making changes to and keep the others around as intrinsics. Using the IDE's SWF injection I mentioned above will make it so you don't have to worry about recompiling everything.&lt;br /&gt;
&lt;br /&gt;
You'll probably get a bunch of warnings like &amp;quot;... needs the class &amp;lt;Whatever&amp;gt; which was not compiled&amp;quot; but that's just MTASC not liking how some class names are used outside of what you're compiling like in Flash registerObject calls.&lt;br /&gt;
&lt;br /&gt;
Now the bigger issue is that MTASC is pickier about things than Adobe's compiler. You'll often have to write this.varname or ClassName.varname instead of just varname, and MTASC doesn't like named *nested* functions. So you'll sometimes have to convert function FooBar() { ... } into something like &amp;quot;this.FooBar = function() { };&amp;quot; or &amp;quot;_root.FooBar = function() { };&amp;quot;. But also make sure that the variable for the function is a class member and not function-local or it'll just be a register or randomly named variable when compiled, or just not be available in the scope you need it to be.&lt;br /&gt;
&lt;br /&gt;
MTASC is also pickier about the scope of local variables. It may sound weird, but in ActionScript 2.0 a function-local variable is defined for the scope of the function - it doesn't matter if declared in an if-statement or in braces. But the MTASC compiler will enforce that you define the variable in a &amp;quot;proper&amp;quot; scope, so you may need to move where it's declared if you want things to compile. E.g., &amp;quot;if (foo) { var tmp = 1; } else { tmp = 2; }&amp;quot; won't fly with MTASC.&lt;br /&gt;
&lt;br /&gt;
Also it seems like MTASC doesn't like the global function &amp;quot;Array&amp;quot;, but doesn't mind if you use the constructor instead. E.g., I've had issues with var ar = Array(...), but var ar = new Array(...) works or you could use the square-bracket notation instead.&lt;br /&gt;
&lt;br /&gt;
Some other stuff... if you want multiple projects, just create the projects all in the same dir (but create folders if you want to separate stuff and adjust the project classpath accordingly).&lt;br /&gt;
Also, don't necessarily set &amp;quot;Always compile&amp;quot; for the *.as file or you might run into duplicate definition errors - things should get drawn in as needed, but I think you need to set it for classes in the original SWF you wish to update. That might be a little hit and miss at first, but you can always check to make sure your changes got in.&lt;br /&gt;
&lt;br /&gt;
Also, looking at the output in FLASM, MTASC might not generate the most blazing bytecode ever - but neither does Adobe's compiler. Just some things I noticed is that Adobe's will use function argument registers more than MTASC seems to... e.g., &amp;quot;push '_root'; getVariable&amp;quot; vs just a r:_root register.&lt;br /&gt;
&lt;br /&gt;
Another apparent annoyance with MTASC is that it doesn't seem to recognize some global variables (which you can confirm with flasm's output (push 'somevar'; getVariable). Workarounds include ''_global.someVariable'', or sometimes ''_root.someVariable'' as appropriate.&lt;br /&gt;
&lt;br /&gt;
One last thing... you may want to organize your *.as files so you combine the ones that are commonly used across different SWF files so you're not always having to edit multiple copies of SomeClass.as for each SWF that uses it.&lt;br /&gt;
&lt;br /&gt;
Also, I noticed a bug in sothink that I emailed them about: doubles are formatted as single-precision floating point. But some other tools, e.g., flare, get the value correctly. You might want to search your *.as files for &amp;quot;E-&amp;quot; and &amp;quot;E+&amp;quot; to look for these misformatted values if you're using it.&lt;br /&gt;
&lt;br /&gt;
EDIT: Here's a bug with Trillix I noticed, but they said it'll be fixed soon: if you have &amp;quot;var foo = this&amp;quot; and if a register is used for 'foo', then Trillix doesn't properly initialize the register... but instead just uses 'this' everywhere else. This causes problems if you needed that variable to choose between using 'this' and possibly another object. E.g., &amp;quot;var obj = this; if (something) { obj = someOtherObject; } someFunc.doIt(obj);&amp;quot; only works as long as &amp;quot;obj&amp;quot; is stored as a variable and not a register, which is up to the original compiler. In reply, they mentioned that you could work around that issue by turning off the &amp;quot;ActionScript 'Recover arguments' names&amp;quot; setting, which makes it a bit more difficult to keep track of function arguments, so it's less than ideal.&lt;br /&gt;
&lt;br /&gt;
=== Issues displaying custom MovieClip subclasses ===&lt;br /&gt;
'''Note:''' this tries to explain some of the issues, and isn't suggesting best practices. This is a bit rambling and should be presented with more concrete examples. Ideally it wouldn't be needed at all and we could use the Scaleform SDK to convert our SWFs into GFX, or we could splice in our own movieclip symbol tags into the GFX file.&lt;br /&gt;
&lt;br /&gt;
The simple issue is this: if it wasn't originally created in the Flash designer (also having a symbol in the Flash library), then you'll have a harder time of showing custom MovieClip objects through ActionScript alone. This would appear to be a bug, but speculatively, it could be for performance reasons.&lt;br /&gt;
&lt;br /&gt;
==== Using swfmill ====&lt;br /&gt;
This hasn't been thoroughly tested, but swfmill may be a simple way to add you own symbols. Use swfmill to convert the SWF into an XML file, edit it, and then use swfmill to convert it back. It appears to work, and even properly retains the non-standard SWF tags. For custom class behavior, you'll still need to make an ''Object.registerClass'' call to associate the library symbol with the class. If you do use this method, one thing to make sure of is that the embedded textures display properly, since they're being referred to using a non-standard SWF tag.&lt;br /&gt;
&lt;br /&gt;
==== createEmptyMovieClip method ====&lt;br /&gt;
So until splicing in tags becomes more streamlined, or some other method is found, then it may be easier to just create an empty movieclip and then populate the member fields using a mixin from another class or manually, although that's probably still less than ideal for classes that use the onLoad event. Another thing as mentioned below is the possibility of abusing prototype mechanics (which can be somewhat messy) or subclass an existing class to specialize the beha&lt;br /&gt;
&lt;br /&gt;
It would appear that the ''MovieClip'' method ''createEmptyMovieClip'' is of limited use unless you then load another movieclip (such as an icon image) into it or or do a ''beginFill ... endFill'' ('''fill-code''') for a few frames to define its dimensions, filling it for as many frames until, say, its '''_height''' property becomes non-zero. It's ugly, but works. Also, if you do a fill on an object in the library, then you actually affect its '''_xscale''' and '''_yscale''' by making the object stretch to fit into your fill. Ultimately, it'd probably be less of a hassle to alter the SWF file to insert your object. Because of having to rerun the code, you'll probably want to delay having to reload images or other intensive operations. You'll have to rerun the fill-code at least twice for this to work, timing alone doesn't matter as has been determined through trial and error.&lt;br /&gt;
&lt;br /&gt;
==== attachMovie method ====&lt;br /&gt;
Perhaps a simpler way is to use ''attachMovie'', although you'll have to find a pre-existing movieclip symbol that suites your needs, and if you want to change its default dimensions then you'll have to delay the fill-code for a few (let's say 150 or so since the scene began) frames after the game loads until it actually works. '''NOTE:''' Reconfirm this is actually necessary instead of just being able to set the _height/_width/_xscale/_yscale, although you may still need to delay setting those for the change to take effect. This way you shouldn't have to keep rerunning the fill-code as with the above ''createEmptyMovieClip'' method. This whole delay business is probably more of an issue in UI elements that are on the HUD instead of selected later from the navbar. You can probably check for when you've waited enough frames by running some simple fill-code on an empty movieclip and checking whether the '''_height''' property changes. &lt;br /&gt;
E.g., the PieCooldown symbol exists in the quickbar.swf file and isn't the worst choice for an empty MovieClip. You can use programs like swix, swfmill, and probably others to find simple objects without much embedded graphics.&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
private static var EMPTYMC_LINKID:String = &amp;quot;PieCooldown&amp;quot;;	&lt;br /&gt;
var mc:MovieClip = someClip_mc.attachMovie(EMPTYMC_LINKID, &amp;quot;SomeName_mc&amp;quot;, someClip_mc.getNextHighestDepth(), {_x:10, _y:10});&lt;br /&gt;
&lt;br /&gt;
// Changing the default dimensions of &amp;quot;PieCooldown&amp;quot;&lt;br /&gt;
// Although you can probably just change the _height, _width or scales after the&lt;br /&gt;
// needed delay instead, unlike with the createEmptyMovieClip method apparently.&lt;br /&gt;
// Also not really necessary if you just want to use it as an invisible container,&lt;br /&gt;
// since other items can be positioned outside of it, relative to its local &lt;br /&gt;
// coordinates.&lt;br /&gt;
with(mc)&lt;br /&gt;
{&lt;br /&gt;
   beginFill(0, 0); // alpha is zero.&lt;br /&gt;
   moveTo(0, 0);&lt;br /&gt;
   lineTo(21, 0);&lt;br /&gt;
   lineTo(21, 21);&lt;br /&gt;
   lineTo(0, 21);&lt;br /&gt;
   endFill();	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The game's script sources also come with a ''MovieUtils'' class, which has a wrapper around ''attachMovie''. This can be useful to create an instance of a library symbol in the SWF file and use it instead for another purpose. &lt;br /&gt;
&lt;br /&gt;
Other useful workaround would be abusing prototype mechanics of ActionScript to give an already existing class other behavior if desired, and can be switched using a custom argument for the initObject during the attachMovie call. This way you don't have to edit the actual class file, if making it recompile is problematic or time consuming. Although this is a kludge method of doing it.&lt;br /&gt;
&lt;br /&gt;
Also of note is that ''Object.registerClass'' or the so-called [http://www.google.com/search?hl=en&amp;amp;source=hp&amp;amp;q=attachMovie+__packages+trick __Packages trick] won't really get you anywhere either. You'll be able to create the MovieClip subclass, but it won't display properly (or just differently) without the above-mentioned tricks.&lt;br /&gt;
&lt;br /&gt;
Creating a subclass of an existing class that's registered with ''Object.registerClass'' may also be a convenient way to customize class behavior without having to recompile the base class if you then change the registerClass call to use the subclass.&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=UI_Tutorial_(draft)&amp;diff=14675</id>
		<title>UI Tutorial (draft)</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=UI_Tutorial_(draft)&amp;diff=14675"/>
				<updated>2010-11-13T02:15:04Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: Fixed a typo and clarified a point.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Author's note''': STILL A WORK IN PROGRESS - FIRST DUMPING INFORMATION OUT, THEN I'LL FORMAT AND SECTION IT OFF BETTER. This isn't a very good tutorial, but as I said, I'm just trying to get the information out there and I'm slow to update this. Also, it may be simpler now that the UDK has support for GFX files, but I don't know the cross-licensing or technical situation on that right now.&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
The UI files are basically just version 8 Adobe Flash files, but extended with some extra properties and image handling (they even use nonstandard tags in the SWF for that). GFX files supposedly have more optimized fonts and who really knows what else, but you shouldn't have to worry about font embedding in Dragon Age.&lt;br /&gt;
&lt;br /&gt;
This means they use the older ActionScript 2.0, which you can find some learning resources on here [http://download.macromedia.com/pub/documentation/en/flash/fl8/fl8_learning_as2.pdf fl8_learning_as2.pdf] and here [http://livedocs.adobe.com/flash/9.0/main/flash_as2_learning.pdf flash_as2_learning.pdf], among other places scattered on the web. You can download the API reference, but a decent online location is [http://flash-reference.icod.de/ here] (faster than Adobe's site I find).&lt;br /&gt;
&lt;br /&gt;
=== Other information sources ===&lt;br /&gt;
There's a woefully incomplete GUI category on the wiki here [[:Category:GUI]]. It was an early effort at detailing some of the class specifics in the UI files. There are a lot of stubs, but some classes are more detailed.&lt;br /&gt;
&lt;br /&gt;
There's also a long-standing draft article on the profile page here [[User:FollowTheGourd]] about the conversation UI. It could also be ammended to explain things like 800x600 is treated as if it were 1024x768, and that the cutscene bars actually have a negative height if the screen width is much longer than the screen height, as seen with Eyefinity display setups.&lt;br /&gt;
&lt;br /&gt;
Another thing to realize is the game's aspect ratio correction and how one resolution in window mode will get stretched to fill your screen space in fullscreen mode. So then there's a difference between the Stage (Flash term) width and height and the video settings which you can access using the ExternalCommands ActionScript class. The point is that the Stage dimensions are more reliable than the video settings you can retrieve through the ExternalCommands class, although it doesn't stop the quickbar UI file from reading the attribute '''&amp;quot;ClientOptions.VideoOptions.ResolutionWidth&amp;quot;''' from it.&lt;br /&gt;
&lt;br /&gt;
== Toolchain ==&lt;br /&gt;
&lt;br /&gt;
[http://www.flashdevelop.org/ FlashDevelop IDE.]&lt;br /&gt;
etc&lt;br /&gt;
&lt;br /&gt;
== Organizing Sources ==&lt;br /&gt;
&lt;br /&gt;
Obtain an ActionScript 2.0 decompiler such as Sothink or Trillix. Each has their shortcomings and will require further post-processing. Sothink's ActionScript output will probably require more work to make compile with MTASC, but Trillix's output seems to have some stranger bugs I'll mention later, which makes me more hesitant to recommend it. Sothink's tool still seems to have an issue formatting double-precision values as single-precision, as detailed in the section below. [http://www.nowrap.de/flare.html Flare] is also a nice free tool to compare output against, but it unfortunately isn't in a format that you can simply recompile.&lt;br /&gt;
&lt;br /&gt;
[http://www.nowrap.de/flasm.html Flasm] is also a useful tool if you wish to examine the p-code directly (as a debug or learning aid perhaps), or even modify it that way.&lt;br /&gt;
&lt;br /&gt;
=== GFX to SWF ===&lt;br /&gt;
&lt;br /&gt;
If you want your changes to be compatible with a certain or the latest game patch, then you'll also have to first merge the appropriate [[GFX]] files. For example, to be compatible with game v1.03, you'll first need to extract the GFX files from guiexport.erf, and then from the patch000.erf, patch001.erf, and patch002.erf files found under C:\Program Files\Dragon Age\packages\core\patch. If you want to be compatible with v1.02a, then it should suffice to stop merging after patch001.erf.&lt;br /&gt;
&lt;br /&gt;
Then you want to change the first three bytes for the GFX to CWS and change the file suffix to SWF.&lt;br /&gt;
Example Python script:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
from __future__ import with_statement&lt;br /&gt;
# The first line is required if you get the following error when running the python script under 2.5.4/2.5.5&lt;br /&gt;
# SyntaxError: invalid syntax - with open(gfxPath, &amp;quot;rb+&amp;quot;) as gfxFile:&lt;br /&gt;
import glob&lt;br /&gt;
import os&lt;br /&gt;
import struct&lt;br /&gt;
&lt;br /&gt;
for gfxPath in glob.glob('*.gfx'):&lt;br /&gt;
	with open(gfxPath, &amp;quot;rb+&amp;quot;) as gfxFile:&lt;br /&gt;
		print(gfxPath)&lt;br /&gt;
		gfxFile.write(struct.pack('3s', &amp;quot;CWS&amp;quot;))&lt;br /&gt;
	os.rename(gfxPath, os.path.splitext(gfxPath)[0] + &amp;quot;.swf&amp;quot;) &lt;br /&gt;
		&lt;br /&gt;
line = input(&amp;quot;Press enter to exit.&amp;quot;)&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Obtain ActionScript Sources ===&lt;br /&gt;
&lt;br /&gt;
If you're using Sothink's tool, then here's an example of how you would quickly retrieve the ActionScript, if you've converted the GFX into SWFs as mentioned above. Do a multi-file export with all of the SWF files (merged to whichever patch version you wish). [http://i1002.photobucket.com/albums/af150/FollowTheGourd/sothink_swf.jpg Screen shot]&lt;br /&gt;
&lt;br /&gt;
=== Merge ActionScript Classes ===&lt;br /&gt;
&lt;br /&gt;
It's a good idea to create a single ActionScript library of all the game sources; that way you don't have to repeatedly make the same modifications for every SWF file that uses the same modified classes. As you'll see later when using the SWF injection method, that this doesn't make available all of the classes to every SWF file, but it's a way to avoid redundant editing.&lt;br /&gt;
&lt;br /&gt;
For instance, here's a embarrassingly quick and dirty way of doing it with a Python script:&lt;br /&gt;
''Note:'' this will throw an exception on later versions of Python because shutil.move undocumentedly doesn't want to clobber existing files. You could add a check if the file already exists and not move it - or rewrite the script and make something better.&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
from __future__ import with_statement&lt;br /&gt;
# The first line is required if you get the following error when running the python script under 2.5.4/2.5.5&lt;br /&gt;
# SyntaxError: invalid syntax - with open(gfxPath, &amp;quot;rb+&amp;quot;) as gfxFile:&lt;br /&gt;
# [Yes, this code probably sucks]&lt;br /&gt;
&lt;br /&gt;
import shutil&lt;br /&gt;
import os&lt;br /&gt;
import re&lt;br /&gt;
import zlib&lt;br /&gt;
&lt;br /&gt;
# Usage: have the batch exported ActionScript from the decompiler (say Sothink) in a dir called export. Then run this &lt;br /&gt;
# script at the same level as the export dir. It will create a C:\commonlib folder with the ActionScript merged into it.&lt;br /&gt;
# Left over in export is what you can import into a FlashDevelop project. You'll also want to make&lt;br /&gt;
# intrinsics out of export and commonlib, but commlib goes in the global classpath, while&lt;br /&gt;
# the appropriate export subfolder goes in the appropriate project classpath.&lt;br /&gt;
&lt;br /&gt;
mergedir = r'C:\commonlib'&lt;br /&gt;
scriptdict = {}&lt;br /&gt;
for dirpath, dirnames, filenames in os.walk('export'):&lt;br /&gt;
	print(dirpath)&lt;br /&gt;
	for junk in filter (lambda x: not x.endswith(&amp;quot;.as&amp;quot;), filenames):&lt;br /&gt;
		os.remove(os.path.join(dirpath, junk))&lt;br /&gt;
	for script in filter( lambda x : x.endswith(&amp;quot;.as&amp;quot;), filenames):&lt;br /&gt;
		scriptfile = open(os.path.join(dirpath, script))&lt;br /&gt;
		relativedir = re.sub(r'export\\[^\\]+\\?', '', dirpath)&lt;br /&gt;
		relativepath = os.path.join(relativedir, script)&lt;br /&gt;
		crc32 = zlib.crc32(scriptfile.read())&lt;br /&gt;
		scriptfile.close()&lt;br /&gt;
		sourcepath = os.path.join(dirpath, script)&lt;br /&gt;
		if relativepath in scriptdict:&lt;br /&gt;
			lastval = scriptdict[relativepath]&lt;br /&gt;
			if lastval['crc32'] == crc32:&lt;br /&gt;
				destdir = os.path.join(mergedir, relativedir)&lt;br /&gt;
				if os.path.exists(lastval['sourcepath']):&lt;br /&gt;
					os.remove(lastval['sourcepath'])&lt;br /&gt;
				if not os.path.exists(destdir):&lt;br /&gt;
					os.makedirs(destdir)&lt;br /&gt;
				#print(&amp;quot;move &amp;quot; + sourcepath + &amp;quot; to &amp;quot; + destdir)&lt;br /&gt;
				shutil.move(sourcepath, destdir)&lt;br /&gt;
			else:&lt;br /&gt;
				# There any many *Scene.as files that are the same&lt;br /&gt;
				# BUT there's an &amp;quot;emptyish&amp;quot; Scene.as used an as interface as well.&lt;br /&gt;
				# So you probably want Scene.as as common, but the other scenes as unique&lt;br /&gt;
				# even if they have the same name. Still throw if script is Scene.as but not if it ends with it.&lt;br /&gt;
				if not re.search(r'.Scene\.as$', script):&lt;br /&gt;
					raise Exception(&amp;quot;Same name, different CRC32: &amp;quot; + sourcepath)&lt;br /&gt;
		else:&lt;br /&gt;
			scriptdict[relativepath] = { 'crc32': crc32, 'sourcepath': sourcepath }&lt;br /&gt;
&lt;br /&gt;
# Find unique entries in SharedLibary, GUI, etc. Copy them over to commonlib but print out what we found.&lt;br /&gt;
# [Bit of a copy-pasta job here...]&lt;br /&gt;
for dirpath, dirnames, filenames in os.walk('export'):&lt;br /&gt;
	for script in filter (lambda x: x.endswith(&amp;quot;.as&amp;quot;), filenames):&lt;br /&gt;
		relativedir = re.sub(r'export\\[^\\]+\\?', '', dirpath)&lt;br /&gt;
		if relativedir == '':&lt;br /&gt;
			continue&lt;br /&gt;
		relativepath = os.path.join(relativedir, script)&lt;br /&gt;
		sourcepath = os.path.join(dirpath, script)&lt;br /&gt;
		destdir = os.path.join(mergedir, relativedir)&lt;br /&gt;
		if not os.path.exists(destdir):&lt;br /&gt;
			os.makedirs(destdir)&lt;br /&gt;
		print(&amp;quot;Unique commonlib: &amp;quot; + sourcepath)&lt;br /&gt;
		shutil.move(sourcepath, destdir)&lt;br /&gt;
&lt;br /&gt;
# Clean up empty dirs&lt;br /&gt;
for dirpath, dirnames, filenames in os.walk('export', topdown=False):&lt;br /&gt;
	for d in dirnames:&lt;br /&gt;
		try:&lt;br /&gt;
			os.rmdir(os.path.join(dirpath, d))&lt;br /&gt;
		except OSError:&lt;br /&gt;
			pass&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Making Modifications ==&lt;br /&gt;
=== Bugs and getting sources to compile ===&lt;br /&gt;
[ Note: this is mostly just copy and pasted from my post in another forum at the moment. It still needs some reworking to better explain things ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can first get the open source FlashDevelop IDE which comes with MTASC and the standard Flash library. If you have the SWFs and the ActionScript *.as files, then what you can do is create an empty ActionScript 2 project, in the project settings turn off &amp;quot;use main entry point&amp;quot; and under the project &amp;quot;injection&amp;quot; tab, point it to the SWF you want to update with your new ActionScript.&lt;br /&gt;
&lt;br /&gt;
You'll also want to update the project classpaths to point to your game's ActionScript library. Just in my experience, there seem to be some properties on some of the standard classes that would normally prevent the script from compiling - but in that case what you can do is modify the so-called intrinsic files to let the compiler know about them. E.g., you can add needed function and var declarations to the intrinsic class interfaces under C:\Program Files\FlashDevelop\Tools\mtasc. The nice thing about ActionScript and intrinsics is that you don't even need to know the values of these &amp;quot;missing&amp;quot; properties or functions if they're basically defined in the runtime environment. E.g., Mouse.LEFT isn't standard Flash, but if you edit Mouse.as and add '''static var LEFT;''' to the intrinsic class definition, then you're good to go, as the value gets looked up during execution like a dictionary value (in fact, Mouse[&amp;quot;left&amp;quot;] should yield the same result).&lt;br /&gt;
&lt;br /&gt;
Also if you press Ctrl+J you'll get the type explorer where you can right click on a folder (that you've added to your classpath) and select &amp;quot;convert to intrinsic&amp;quot;. So this way you only need to compile the actual *.as file you're making changes to and keep the others around as intrinsics. Using the IDE's SWF injection I mentioned above will make it so you don't have to worry about recompiling everything.&lt;br /&gt;
&lt;br /&gt;
You'll probably get a bunch of warnings like &amp;quot;... needs the class &amp;lt;Whatever&amp;gt; which was not compiled&amp;quot; but that's just MTASC not liking how some class names are used outside of what you're compiling like in Flash registerObject calls.&lt;br /&gt;
&lt;br /&gt;
Now the bigger issue is that MTASC is pickier about things than Adobe's compiler. You'll often have to write this.varname or ClassName.varname instead of just varname, and MTASC doesn't like named *nested* functions. So you'll sometimes have to convert function FooBar() { ... } into something like &amp;quot;this.FooBar = function() { };&amp;quot; or &amp;quot;_root.FooBar = function() { };&amp;quot;. But also make sure that the variable for the function is a class member and not function-local or it'll just be a register or randomly named variable when compiled, or just not be available in the scope you need it to be.&lt;br /&gt;
&lt;br /&gt;
MTASC is also pickier about the scope of local variables. It may sound weird, but in ActionScript 2.0 a function-local variable is defined for the scope of the function - it doesn't matter if declared in an if-statement or in braces. But the MTASC compiler will enforce that you define the variable in a &amp;quot;proper&amp;quot; scope, so you may need to move where it's declared if you want things to compile. E.g., &amp;quot;if (foo) { var tmp = 1; } else { tmp = 2; }&amp;quot; won't fly with MTASC.&lt;br /&gt;
&lt;br /&gt;
Also it seems like MTASC doesn't like the global function &amp;quot;Array&amp;quot;, but doesn't mind if you use the constructor instead. E.g., I've had issues with var ar = Array(...), but var ar = new Array(...) works or you could use the square-bracket notation instead.&lt;br /&gt;
&lt;br /&gt;
Some other stuff... if you want multiple projects, just create the projects all in the same dir (but create folders if you want to separate stuff and adjust the project classpath accordingly).&lt;br /&gt;
Also, don't necessarily set &amp;quot;Always compile&amp;quot; for the *.as file or you might run into duplicate definition errors - things should get drawn in as needed, but I think you need to set it for classes in the original SWF you wish to update. That might be a little hit and miss at first, but you can always check to make sure your changes got in.&lt;br /&gt;
&lt;br /&gt;
Also, looking at the output in FLASM, MTASC might not generate the most blazing bytecode ever - but neither does Adobe's compiler. Just some things I noticed is that Adobe's will use function argument registers more than MTASC seems to... e.g., &amp;quot;push '_root'; getVariable&amp;quot; vs just a r:_root register.&lt;br /&gt;
&lt;br /&gt;
Another apparent annoyance with MTASC is that it doesn't seem to recognize some global variables (which you can confirm with flasm's output (push 'somevar'; getVariable). Workarounds include ''_global.someVariable'', or sometimes ''_root.someVariable'' as appropriate.&lt;br /&gt;
&lt;br /&gt;
One last thing... you may want to organize your *.as files so you combine the ones that are commonly used across different SWF files so you're not always having to edit multiple copies of SomeClass.as for each SWF that uses it.&lt;br /&gt;
&lt;br /&gt;
Also, I noticed a bug in sothink that I emailed them about: doubles are formatted as single-precision floating point. But some other tools, e.g., flare, get the value correctly. You might want to search your *.as files for &amp;quot;E-&amp;quot; and &amp;quot;E+&amp;quot; to look for these misformatted values if you're using it.&lt;br /&gt;
&lt;br /&gt;
EDIT: Here's a bug with Trillix I noticed, but they said it'll be fixed soon: if you have &amp;quot;var foo = this&amp;quot; and if a register is used for 'foo', then Trillix doesn't properly initialize the register... but instead just uses 'this' everywhere else. This causes problems if you needed that variable to choose between using 'this' and possibly another object. E.g., &amp;quot;var obj = this; if (something) { obj = someOtherObject; } someFunc.doIt(obj);&amp;quot; only works as long as &amp;quot;obj&amp;quot; is stored as a variable and not a register, which is up to the original compiler. In reply, they mentioned that you could work around that issue by turning off the &amp;quot;ActionScript 'Recover arguments' names&amp;quot; setting, which makes it a bit more difficult to keep track of function arguments, so it's less than ideal.&lt;br /&gt;
&lt;br /&gt;
=== Issues displaying custom MovieClip subclasses ===&lt;br /&gt;
'''Note:''' this tries to explain some of the issues, and isn't suggesting best practices. This is a bit rambling and should be presented with more concrete examples. Ideally it wouldn't be needed at all and we could use the Scaleform SDK to convert our SWFs into GFX, or we could splice in our own movieclip symbol tags into the GFX file.&lt;br /&gt;
&lt;br /&gt;
The simple issue is this: if it wasn't originally created in the Flash designer (also having a symbol in the Flash library), then you'll have a harder time of showing custom MovieClip objects through ActionScript alone. This would appear to be a bug, but speculatively, it could be for performance reasons.&lt;br /&gt;
&lt;br /&gt;
==== Using swfmill ====&lt;br /&gt;
This hasn't been thoroughly tested, but swfmill may be a simple way to add you own symbols. Use swfmill to convert the SWF into an XML file, edit it, and then use swfmill to convert it back. It appears to work, and even properly retains the non-standard SWF tags. For custom class behavior, you'll still need to make an ''Object.registerClass'' call to associate the library symbol with the class. If you do use this method, one thing to make sure of is that the embedded textures display properly, since they're being referred to using a non-standard SWF tag.&lt;br /&gt;
&lt;br /&gt;
==== createEmptyMovieClip method ====&lt;br /&gt;
So until splicing in tags becomes more streamlined, or some other method is found, then it may be easier to just create an empty movieclip and then populate the member fields using a mixin from another class or manually, although that's probably still less than ideal for classes that use the onLoad event. Another thing as mentioned below is the possibility of abusing prototype mechanics (which can be somewhat messy) or subclass an existing class to specialize the beha&lt;br /&gt;
&lt;br /&gt;
It would appear that the ''MovieClip'' method ''createEmptyMovieClip'' is of limited use unless you then load another movieclip (such as an icon image) into it or or do a ''beginFill ... endFill'' ('''fill-code''') for a few frames to define its dimensions, filling it for as many frames until, say, its '''_height''' property becomes non-zero. It's ugly, but works. Also, if you do a fill on an object in the library, then you actually affect its '''_xscale''' and '''_yscale''' by making the object stretch to fit into your fill. Ultimately, it'd probably be less of a hassle to alter the SWF file to insert your object. Because of having to rerun the code, you'll probably want to delay having to reload images or other intensive operations. You'll have to rerun the fill-code at least twice for this to work, timing alone doesn't matter as has been determined through trial and error.&lt;br /&gt;
&lt;br /&gt;
==== attachMovie method ====&lt;br /&gt;
Perhaps a simpler way is to use ''attachMovie'', although you'll have to find a pre-existing movieclip symbol that suites your needs, and if you want to change its default dimensions then you'll have to delay the fill-code for a few (let's say 150 or so since the scene began) frames after the game loads until it actually works. '''NOTE:''' Reconfirm this is actually necessary instead of just being able to set the _height/_width/_xscale/_yscale, although you may still need to delay setting those for the change to take effect. This way you shouldn't have to keep rerunning the fill-code as with the above ''createEmptyMovieClip'' method. This whole delay business is probably more of an issue in UI elements that are on the HUD instead of selected later from the navbar. You can probably check for when you've waited enough frames by running some simple fill-code on an empty movieclip and checking whether the '''_height''' property changes. &lt;br /&gt;
E.g., the PieCooldown symbol exists in the quickbar.swf file and isn't the worst choice for an empty MovieClip. You can use programs like swix, swfmill, and probably others to find simple objects without much embedded graphics.&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
private static var EMPTYMC_LINKID:String = &amp;quot;PieCooldown&amp;quot;;	&lt;br /&gt;
var mc:MovieClip = someClip_mc.attachMovie(EMPTYMC_LINKID, &amp;quot;SomeName_mc&amp;quot;, someClip_mc.getNextHighestDepth(), {_x:10, _y:10});&lt;br /&gt;
&lt;br /&gt;
// Changing the default dimensions of &amp;quot;PieCooldown&amp;quot;&lt;br /&gt;
// Although you can probably just change the _height, _width or scales after the&lt;br /&gt;
// needed delay instead, unlike with the createEmptyMovieClip method apparently.&lt;br /&gt;
// Also not really necessary if you just want to use it as an invisible container,&lt;br /&gt;
// since other items can be positioned outside of it, relative to its local &lt;br /&gt;
// coordinates.&lt;br /&gt;
with(mc)&lt;br /&gt;
{&lt;br /&gt;
   beginFill(0, 0); // alpha is zero.&lt;br /&gt;
   moveTo(0, 0);&lt;br /&gt;
   lineTo(21, 0);&lt;br /&gt;
   lineTo(21, 21);&lt;br /&gt;
   lineTo(0, 21);&lt;br /&gt;
   endFill();	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The game's script sources also come with a ''MovieUtils'' class, which has a wrapper around ''attachMovie''. This can be useful to create an instance of a library symbol in the SWF file and use it instead for another purpose. &lt;br /&gt;
&lt;br /&gt;
Other useful workaround would be abusing prototype mechanics of ActionScript to give an already existing class other behavior if desired, and can be switched using a custom argument for the initObject during the attachMovie call. This way you don't have to edit the actual class file, if making it recompile is problematic or time consuming. Although this is a kludge method of doing it.&lt;br /&gt;
&lt;br /&gt;
Also of note is that ''Object.registerClass'' or the so-called [http://www.google.com/search?hl=en&amp;amp;source=hp&amp;amp;q=attachMovie+__packages+trick __Packages trick] won't really get you anywhere either. You'll be able to create the MovieClip subclass, but it won't display properly (or just differently) without the above-mentioned tricks.&lt;br /&gt;
&lt;br /&gt;
Creating a subclass of an existing class that's registered with ''Object.registerClass'' may also be a convenient way to customize class behavior without having to recompile the base class if you then change the registerClass call to use the subclass.&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=UI_Tutorial_(draft)&amp;diff=14674</id>
		<title>UI Tutorial (draft)</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=UI_Tutorial_(draft)&amp;diff=14674"/>
				<updated>2010-11-13T02:12:33Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: /* remind me why I love python so much... */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Author's note''': STILL A WORK IN PROGRESS - FIRST DUMPING INFORMATION OUT, THEN I'LL FORMAT AND SECTION IT OFF BETTER. This isn't a very good tutorial, but as I said, I'm just trying to get the information out there and I'm slow to update this. Also, it may be simpler now that the UDK has support for GFX files, but I don't know the cross-licensing or technical situation on that right now.&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
The UI files are basically just version 8 Adobe Flash files, but extended with some extra properties and image handling (they even use nonstandard tags in the SWF for that). GFX files supposedly have more optimized fonts and who really knows what else, but you shouldn't have to worry about font embedding in Dragon Age.&lt;br /&gt;
&lt;br /&gt;
This means they use the older ActionScript 2.0, which you can find some learning resources on here [http://download.macromedia.com/pub/documentation/en/flash/fl8/fl8_learning_as2.pdf fl8_learning_as2.pdf] and here [http://livedocs.adobe.com/flash/9.0/main/flash_as2_learning.pdf flash_as2_learning.pdf], among other places scattered on the web. You can download the API reference, but a decent online location is [http://flash-reference.icod.de/ here] (faster than Adobe's site I find).&lt;br /&gt;
&lt;br /&gt;
=== Other information sources ===&lt;br /&gt;
There's a woefully incomplete GUI category on the wiki here [[:Category:GUI]]. It was an early effort at detailing some of the class specifics in the UI files. There are a lot of stubs, but some classes are more detailed.&lt;br /&gt;
&lt;br /&gt;
There's also a long-standing draft article on the profile page here [[User:FollowTheGourd]] about the conversation UI. It could also be ammended to explain things like 800x600 is treated as if it were 1024x768, and that the cutscene bars actually have a negative hight if the screen width is much longer than the screen height, as seen with Eyefinity display setups.&lt;br /&gt;
&lt;br /&gt;
Another thing to realize is the game's aspect ratio correction and how one resolution in window mode will get stretched to fill your screen space in fullscreen mode. So then there's a difference between the Stage (Flash term) width and height and the video settings which you can access using the ExternalCommands ActionScript class.&lt;br /&gt;
&lt;br /&gt;
== Toolchain ==&lt;br /&gt;
&lt;br /&gt;
[http://www.flashdevelop.org/ FlashDevelop IDE.]&lt;br /&gt;
etc&lt;br /&gt;
&lt;br /&gt;
== Organizing Sources ==&lt;br /&gt;
&lt;br /&gt;
Obtain an ActionScript 2.0 decompiler such as Sothink or Trillix. Each has their shortcomings and will require further post-processing. Sothink's ActionScript output will probably require more work to make compile with MTASC, but Trillix's output seems to have some stranger bugs I'll mention later, which makes me more hesitant to recommend it. Sothink's tool still seems to have an issue formatting double-precision values as single-precision, as detailed in the section below. [http://www.nowrap.de/flare.html Flare] is also a nice free tool to compare output against, but it unfortunately isn't in a format that you can simply recompile.&lt;br /&gt;
&lt;br /&gt;
[http://www.nowrap.de/flasm.html Flasm] is also a useful tool if you wish to examine the p-code directly (as a debug or learning aid perhaps), or even modify it that way.&lt;br /&gt;
&lt;br /&gt;
=== GFX to SWF ===&lt;br /&gt;
&lt;br /&gt;
If you want your changes to be compatible with a certain or the latest game patch, then you'll also have to first merge the appropriate [[GFX]] files. For example, to be compatible with game v1.03, you'll first need to extract the GFX files from guiexport.erf, and then from the patch000.erf, patch001.erf, and patch002.erf files found under C:\Program Files\Dragon Age\packages\core\patch. If you want to be compatible with v1.02a, then it should suffice to stop merging after patch001.erf.&lt;br /&gt;
&lt;br /&gt;
Then you want to change the first three bytes for the GFX to CWS and change the file suffix to SWF.&lt;br /&gt;
Example Python script:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
from __future__ import with_statement&lt;br /&gt;
# The first line is required if you get the following error when running the python script under 2.5.4/2.5.5&lt;br /&gt;
# SyntaxError: invalid syntax - with open(gfxPath, &amp;quot;rb+&amp;quot;) as gfxFile:&lt;br /&gt;
import glob&lt;br /&gt;
import os&lt;br /&gt;
import struct&lt;br /&gt;
&lt;br /&gt;
for gfxPath in glob.glob('*.gfx'):&lt;br /&gt;
	with open(gfxPath, &amp;quot;rb+&amp;quot;) as gfxFile:&lt;br /&gt;
		print(gfxPath)&lt;br /&gt;
		gfxFile.write(struct.pack('3s', &amp;quot;CWS&amp;quot;))&lt;br /&gt;
	os.rename(gfxPath, os.path.splitext(gfxPath)[0] + &amp;quot;.swf&amp;quot;) &lt;br /&gt;
		&lt;br /&gt;
line = input(&amp;quot;Press enter to exit.&amp;quot;)&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Obtain ActionScript Sources ===&lt;br /&gt;
&lt;br /&gt;
If you're using Sothink's tool, then here's an example of how you would quickly retrieve the ActionScript, if you've converted the GFX into SWFs as mentioned above. Do a multi-file export with all of the SWF files (merged to whichever patch version you wish). [http://i1002.photobucket.com/albums/af150/FollowTheGourd/sothink_swf.jpg Screen shot]&lt;br /&gt;
&lt;br /&gt;
=== Merge ActionScript Classes ===&lt;br /&gt;
&lt;br /&gt;
It's a good idea to create a single ActionScript library of all the game sources; that way you don't have to repeatedly make the same modifications for every SWF file that uses the same modified classes. As you'll see later when using the SWF injection method, that this doesn't make available all of the classes to every SWF file, but it's a way to avoid redundant editing.&lt;br /&gt;
&lt;br /&gt;
For instance, here's a embarrassingly quick and dirty way of doing it with a Python script:&lt;br /&gt;
''Note:'' this will throw an exception on later versions of Python because shutil.move undocumentedly doesn't want to clobber existing files. You could add a check if the file already exists and not move it - or rewrite the script and make something better.&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
from __future__ import with_statement&lt;br /&gt;
# The first line is required if you get the following error when running the python script under 2.5.4/2.5.5&lt;br /&gt;
# SyntaxError: invalid syntax - with open(gfxPath, &amp;quot;rb+&amp;quot;) as gfxFile:&lt;br /&gt;
# [Yes, this code probably sucks]&lt;br /&gt;
&lt;br /&gt;
import shutil&lt;br /&gt;
import os&lt;br /&gt;
import re&lt;br /&gt;
import zlib&lt;br /&gt;
&lt;br /&gt;
# Usage: have the batch exported ActionScript from the decompiler (say Sothink) in a dir called export. Then run this &lt;br /&gt;
# script at the same level as the export dir. It will create a C:\commonlib folder with the ActionScript merged into it.&lt;br /&gt;
# Left over in export is what you can import into a FlashDevelop project. You'll also want to make&lt;br /&gt;
# intrinsics out of export and commonlib, but commlib goes in the global classpath, while&lt;br /&gt;
# the appropriate export subfolder goes in the appropriate project classpath.&lt;br /&gt;
&lt;br /&gt;
mergedir = r'C:\commonlib'&lt;br /&gt;
scriptdict = {}&lt;br /&gt;
for dirpath, dirnames, filenames in os.walk('export'):&lt;br /&gt;
	print(dirpath)&lt;br /&gt;
	for junk in filter (lambda x: not x.endswith(&amp;quot;.as&amp;quot;), filenames):&lt;br /&gt;
		os.remove(os.path.join(dirpath, junk))&lt;br /&gt;
	for script in filter( lambda x : x.endswith(&amp;quot;.as&amp;quot;), filenames):&lt;br /&gt;
		scriptfile = open(os.path.join(dirpath, script))&lt;br /&gt;
		relativedir = re.sub(r'export\\[^\\]+\\?', '', dirpath)&lt;br /&gt;
		relativepath = os.path.join(relativedir, script)&lt;br /&gt;
		crc32 = zlib.crc32(scriptfile.read())&lt;br /&gt;
		scriptfile.close()&lt;br /&gt;
		sourcepath = os.path.join(dirpath, script)&lt;br /&gt;
		if relativepath in scriptdict:&lt;br /&gt;
			lastval = scriptdict[relativepath]&lt;br /&gt;
			if lastval['crc32'] == crc32:&lt;br /&gt;
				destdir = os.path.join(mergedir, relativedir)&lt;br /&gt;
				if os.path.exists(lastval['sourcepath']):&lt;br /&gt;
					os.remove(lastval['sourcepath'])&lt;br /&gt;
				if not os.path.exists(destdir):&lt;br /&gt;
					os.makedirs(destdir)&lt;br /&gt;
				#print(&amp;quot;move &amp;quot; + sourcepath + &amp;quot; to &amp;quot; + destdir)&lt;br /&gt;
				shutil.move(sourcepath, destdir)&lt;br /&gt;
			else:&lt;br /&gt;
				# There any many *Scene.as files that are the same&lt;br /&gt;
				# BUT there's an &amp;quot;emptyish&amp;quot; Scene.as used an as interface as well.&lt;br /&gt;
				# So you probably want Scene.as as common, but the other scenes as unique&lt;br /&gt;
				# even if they have the same name. Still throw if script is Scene.as but not if it ends with it.&lt;br /&gt;
				if not re.search(r'.Scene\.as$', script):&lt;br /&gt;
					raise Exception(&amp;quot;Same name, different CRC32: &amp;quot; + sourcepath)&lt;br /&gt;
		else:&lt;br /&gt;
			scriptdict[relativepath] = { 'crc32': crc32, 'sourcepath': sourcepath }&lt;br /&gt;
&lt;br /&gt;
# Find unique entries in SharedLibary, GUI, etc. Copy them over to commonlib but print out what we found.&lt;br /&gt;
# [Bit of a copy-pasta job here...]&lt;br /&gt;
for dirpath, dirnames, filenames in os.walk('export'):&lt;br /&gt;
	for script in filter (lambda x: x.endswith(&amp;quot;.as&amp;quot;), filenames):&lt;br /&gt;
		relativedir = re.sub(r'export\\[^\\]+\\?', '', dirpath)&lt;br /&gt;
		if relativedir == '':&lt;br /&gt;
			continue&lt;br /&gt;
		relativepath = os.path.join(relativedir, script)&lt;br /&gt;
		sourcepath = os.path.join(dirpath, script)&lt;br /&gt;
		destdir = os.path.join(mergedir, relativedir)&lt;br /&gt;
		if not os.path.exists(destdir):&lt;br /&gt;
			os.makedirs(destdir)&lt;br /&gt;
		print(&amp;quot;Unique commonlib: &amp;quot; + sourcepath)&lt;br /&gt;
		shutil.move(sourcepath, destdir)&lt;br /&gt;
&lt;br /&gt;
# Clean up empty dirs&lt;br /&gt;
for dirpath, dirnames, filenames in os.walk('export', topdown=False):&lt;br /&gt;
	for d in dirnames:&lt;br /&gt;
		try:&lt;br /&gt;
			os.rmdir(os.path.join(dirpath, d))&lt;br /&gt;
		except OSError:&lt;br /&gt;
			pass&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Making Modifications ==&lt;br /&gt;
=== Bugs and getting sources to compile ===&lt;br /&gt;
[ Note: this is mostly just copy and pasted from my post in another forum at the moment. It still needs some reworking to better explain things ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can first get the open source FlashDevelop IDE which comes with MTASC and the standard Flash library. If you have the SWFs and the ActionScript *.as files, then what you can do is create an empty ActionScript 2 project, in the project settings turn off &amp;quot;use main entry point&amp;quot; and under the project &amp;quot;injection&amp;quot; tab, point it to the SWF you want to update with your new ActionScript.&lt;br /&gt;
&lt;br /&gt;
You'll also want to update the project classpaths to point to your game's ActionScript library. Just in my experience, there seem to be some properties on some of the standard classes that would normally prevent the script from compiling - but in that case what you can do is modify the so-called intrinsic files to let the compiler know about them. E.g., you can add needed function and var declarations to the intrinsic class interfaces under C:\Program Files\FlashDevelop\Tools\mtasc. The nice thing about ActionScript and intrinsics is that you don't even need to know the values of these &amp;quot;missing&amp;quot; properties or functions if they're basically defined in the runtime environment. E.g., Mouse.LEFT isn't standard Flash, but if you edit Mouse.as and add '''static var LEFT;''' to the intrinsic class definition, then you're good to go, as the value gets looked up during execution like a dictionary value (in fact, Mouse[&amp;quot;left&amp;quot;] should yield the same result).&lt;br /&gt;
&lt;br /&gt;
Also if you press Ctrl+J you'll get the type explorer where you can right click on a folder (that you've added to your classpath) and select &amp;quot;convert to intrinsic&amp;quot;. So this way you only need to compile the actual *.as file you're making changes to and keep the others around as intrinsics. Using the IDE's SWF injection I mentioned above will make it so you don't have to worry about recompiling everything.&lt;br /&gt;
&lt;br /&gt;
You'll probably get a bunch of warnings like &amp;quot;... needs the class &amp;lt;Whatever&amp;gt; which was not compiled&amp;quot; but that's just MTASC not liking how some class names are used outside of what you're compiling like in Flash registerObject calls.&lt;br /&gt;
&lt;br /&gt;
Now the bigger issue is that MTASC is pickier about things than Adobe's compiler. You'll often have to write this.varname or ClassName.varname instead of just varname, and MTASC doesn't like named *nested* functions. So you'll sometimes have to convert function FooBar() { ... } into something like &amp;quot;this.FooBar = function() { };&amp;quot; or &amp;quot;_root.FooBar = function() { };&amp;quot;. But also make sure that the variable for the function is a class member and not function-local or it'll just be a register or randomly named variable when compiled, or just not be available in the scope you need it to be.&lt;br /&gt;
&lt;br /&gt;
MTASC is also pickier about the scope of local variables. It may sound weird, but in ActionScript 2.0 a function-local variable is defined for the scope of the function - it doesn't matter if declared in an if-statement or in braces. But the MTASC compiler will enforce that you define the variable in a &amp;quot;proper&amp;quot; scope, so you may need to move where it's declared if you want things to compile. E.g., &amp;quot;if (foo) { var tmp = 1; } else { tmp = 2; }&amp;quot; won't fly with MTASC.&lt;br /&gt;
&lt;br /&gt;
Also it seems like MTASC doesn't like the global function &amp;quot;Array&amp;quot;, but doesn't mind if you use the constructor instead. E.g., I've had issues with var ar = Array(...), but var ar = new Array(...) works or you could use the square-bracket notation instead.&lt;br /&gt;
&lt;br /&gt;
Some other stuff... if you want multiple projects, just create the projects all in the same dir (but create folders if you want to separate stuff and adjust the project classpath accordingly).&lt;br /&gt;
Also, don't necessarily set &amp;quot;Always compile&amp;quot; for the *.as file or you might run into duplicate definition errors - things should get drawn in as needed, but I think you need to set it for classes in the original SWF you wish to update. That might be a little hit and miss at first, but you can always check to make sure your changes got in.&lt;br /&gt;
&lt;br /&gt;
Also, looking at the output in FLASM, MTASC might not generate the most blazing bytecode ever - but neither does Adobe's compiler. Just some things I noticed is that Adobe's will use function argument registers more than MTASC seems to... e.g., &amp;quot;push '_root'; getVariable&amp;quot; vs just a r:_root register.&lt;br /&gt;
&lt;br /&gt;
Another apparent annoyance with MTASC is that it doesn't seem to recognize some global variables (which you can confirm with flasm's output (push 'somevar'; getVariable). Workarounds include ''_global.someVariable'', or sometimes ''_root.someVariable'' as appropriate.&lt;br /&gt;
&lt;br /&gt;
One last thing... you may want to organize your *.as files so you combine the ones that are commonly used across different SWF files so you're not always having to edit multiple copies of SomeClass.as for each SWF that uses it.&lt;br /&gt;
&lt;br /&gt;
Also, I noticed a bug in sothink that I emailed them about: doubles are formatted as single-precision floating point. But some other tools, e.g., flare, get the value correctly. You might want to search your *.as files for &amp;quot;E-&amp;quot; and &amp;quot;E+&amp;quot; to look for these misformatted values if you're using it.&lt;br /&gt;
&lt;br /&gt;
EDIT: Here's a bug with Trillix I noticed, but they said it'll be fixed soon: if you have &amp;quot;var foo = this&amp;quot; and if a register is used for 'foo', then Trillix doesn't properly initialize the register... but instead just uses 'this' everywhere else. This causes problems if you needed that variable to choose between using 'this' and possibly another object. E.g., &amp;quot;var obj = this; if (something) { obj = someOtherObject; } someFunc.doIt(obj);&amp;quot; only works as long as &amp;quot;obj&amp;quot; is stored as a variable and not a register, which is up to the original compiler. In reply, they mentioned that you could work around that issue by turning off the &amp;quot;ActionScript 'Recover arguments' names&amp;quot; setting, which makes it a bit more difficult to keep track of function arguments, so it's less than ideal.&lt;br /&gt;
&lt;br /&gt;
=== Issues displaying custom MovieClip subclasses ===&lt;br /&gt;
'''Note:''' this tries to explain some of the issues, and isn't suggesting best practices. This is a bit rambling and should be presented with more concrete examples. Ideally it wouldn't be needed at all and we could use the Scaleform SDK to convert our SWFs into GFX, or we could splice in our own movieclip symbol tags into the GFX file.&lt;br /&gt;
&lt;br /&gt;
The simple issue is this: if it wasn't originally created in the Flash designer (also having a symbol in the Flash library), then you'll have a harder time of showing custom MovieClip objects through ActionScript alone. This would appear to be a bug, but speculatively, it could be for performance reasons.&lt;br /&gt;
&lt;br /&gt;
==== Using swfmill ====&lt;br /&gt;
This hasn't been thoroughly tested, but swfmill may be a simple way to add you own symbols. Use swfmill to convert the SWF into an XML file, edit it, and then use swfmill to convert it back. It appears to work, and even properly retains the non-standard SWF tags. For custom class behavior, you'll still need to make an ''Object.registerClass'' call to associate the library symbol with the class. If you do use this method, one thing to make sure of is that the embedded textures display properly, since they're being referred to using a non-standard SWF tag.&lt;br /&gt;
&lt;br /&gt;
==== createEmptyMovieClip method ====&lt;br /&gt;
So until splicing in tags becomes more streamlined, or some other method is found, then it may be easier to just create an empty movieclip and then populate the member fields using a mixin from another class or manually, although that's probably still less than ideal for classes that use the onLoad event. Another thing as mentioned below is the possibility of abusing prototype mechanics (which can be somewhat messy) or subclass an existing class to specialize the beha&lt;br /&gt;
&lt;br /&gt;
It would appear that the ''MovieClip'' method ''createEmptyMovieClip'' is of limited use unless you then load another movieclip (such as an icon image) into it or or do a ''beginFill ... endFill'' ('''fill-code''') for a few frames to define its dimensions, filling it for as many frames until, say, its '''_height''' property becomes non-zero. It's ugly, but works. Also, if you do a fill on an object in the library, then you actually affect its '''_xscale''' and '''_yscale''' by making the object stretch to fit into your fill. Ultimately, it'd probably be less of a hassle to alter the SWF file to insert your object. Because of having to rerun the code, you'll probably want to delay having to reload images or other intensive operations. You'll have to rerun the fill-code at least twice for this to work, timing alone doesn't matter as has been determined through trial and error.&lt;br /&gt;
&lt;br /&gt;
==== attachMovie method ====&lt;br /&gt;
Perhaps a simpler way is to use ''attachMovie'', although you'll have to find a pre-existing movieclip symbol that suites your needs, and if you want to change its default dimensions then you'll have to delay the fill-code for a few (let's say 150 or so since the scene began) frames after the game loads until it actually works. '''NOTE:''' Reconfirm this is actually necessary instead of just being able to set the _height/_width/_xscale/_yscale, although you may still need to delay setting those for the change to take effect. This way you shouldn't have to keep rerunning the fill-code as with the above ''createEmptyMovieClip'' method. This whole delay business is probably more of an issue in UI elements that are on the HUD instead of selected later from the navbar. You can probably check for when you've waited enough frames by running some simple fill-code on an empty movieclip and checking whether the '''_height''' property changes. &lt;br /&gt;
E.g., the PieCooldown symbol exists in the quickbar.swf file and isn't the worst choice for an empty MovieClip. You can use programs like swix, swfmill, and probably others to find simple objects without much embedded graphics.&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
private static var EMPTYMC_LINKID:String = &amp;quot;PieCooldown&amp;quot;;	&lt;br /&gt;
var mc:MovieClip = someClip_mc.attachMovie(EMPTYMC_LINKID, &amp;quot;SomeName_mc&amp;quot;, someClip_mc.getNextHighestDepth(), {_x:10, _y:10});&lt;br /&gt;
&lt;br /&gt;
// Changing the default dimensions of &amp;quot;PieCooldown&amp;quot;&lt;br /&gt;
// Although you can probably just change the _height, _width or scales after the&lt;br /&gt;
// needed delay instead, unlike with the createEmptyMovieClip method apparently.&lt;br /&gt;
// Also not really necessary if you just want to use it as an invisible container,&lt;br /&gt;
// since other items can be positioned outside of it, relative to its local &lt;br /&gt;
// coordinates.&lt;br /&gt;
with(mc)&lt;br /&gt;
{&lt;br /&gt;
   beginFill(0, 0); // alpha is zero.&lt;br /&gt;
   moveTo(0, 0);&lt;br /&gt;
   lineTo(21, 0);&lt;br /&gt;
   lineTo(21, 21);&lt;br /&gt;
   lineTo(0, 21);&lt;br /&gt;
   endFill();	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The game's script sources also come with a ''MovieUtils'' class, which has a wrapper around ''attachMovie''. This can be useful to create an instance of a library symbol in the SWF file and use it instead for another purpose. &lt;br /&gt;
&lt;br /&gt;
Other useful workaround would be abusing prototype mechanics of ActionScript to give an already existing class other behavior if desired, and can be switched using a custom argument for the initObject during the attachMovie call. This way you don't have to edit the actual class file, if making it recompile is problematic or time consuming. Although this is a kludge method of doing it.&lt;br /&gt;
&lt;br /&gt;
Also of note is that ''Object.registerClass'' or the so-called [http://www.google.com/search?hl=en&amp;amp;source=hp&amp;amp;q=attachMovie+__packages+trick __Packages trick] won't really get you anywhere either. You'll be able to create the MovieClip subclass, but it won't display properly (or just differently) without the above-mentioned tricks.&lt;br /&gt;
&lt;br /&gt;
Creating a subclass of an existing class that's registered with ''Object.registerClass'' may also be a convenient way to customize class behavior without having to recompile the base class if you then change the registerClass call to use the subclass.&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=UI_Tutorial_(draft)&amp;diff=14673</id>
		<title>UI Tutorial (draft)</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=UI_Tutorial_(draft)&amp;diff=14673"/>
				<updated>2010-11-13T02:10:58Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: Intrinsics clarification&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Author's note''': STILL A WORK IN PROGRESS - FIRST DUMPING INFORMATION OUT, THEN I'LL FORMAT AND SECTION IT OFF BETTER. This isn't a very good tutorial, but as I said, I'm just trying to get the information out there and I'm slow to update this. Also, it may be simpler now that the UDK has support for GFX files, but I don't know the cross-licensing or technical situation on that right now.&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
The UI files are basically just version 8 Adobe Flash files, but extended with some extra properties and image handling (they even use nonstandard tags in the SWF for that). GFX files supposedly have more optimized fonts and who really knows what else, but you shouldn't have to worry about font embedding in Dragon Age.&lt;br /&gt;
&lt;br /&gt;
This means they use the older ActionScript 2.0, which you can find some learning resources on here [http://download.macromedia.com/pub/documentation/en/flash/fl8/fl8_learning_as2.pdf fl8_learning_as2.pdf] and here [http://livedocs.adobe.com/flash/9.0/main/flash_as2_learning.pdf flash_as2_learning.pdf], among other places scattered on the web. You can download the API reference, but a decent online location is [http://flash-reference.icod.de/ here] (faster than Adobe's site I find).&lt;br /&gt;
&lt;br /&gt;
=== Other information sources ===&lt;br /&gt;
There's a woefully incomplete GUI category on the wiki here [[:Category:GUI]]. It was an early effort at detailing some of the class specifics in the UI files. There are a lot of stubs, but some classes are more detailed.&lt;br /&gt;
&lt;br /&gt;
There's also a long-standing draft article on the profile page here [[User:FollowTheGourd]] about the conversation UI. It could also be ammended to explain things like 800x600 is treated as if it were 1024x768, and that the cutscene bars actually have a negative hight if the screen width is much longer than the screen height, as seen with Eyefinity display setups.&lt;br /&gt;
&lt;br /&gt;
Another thing to realize is the game's aspect ratio correction and how one resolution in window mode will get stretched to fill your screen space in fullscreen mode. So then there's a difference between the Stage (Flash term) width and height and the video settings which you can access using the ExternalCommands ActionScript class.&lt;br /&gt;
&lt;br /&gt;
== Toolchain ==&lt;br /&gt;
&lt;br /&gt;
[http://www.flashdevelop.org/ FlashDevelop IDE.]&lt;br /&gt;
etc&lt;br /&gt;
&lt;br /&gt;
== Organizing Sources ==&lt;br /&gt;
&lt;br /&gt;
Obtain an ActionScript 2.0 decompiler such as Sothink or Trillix. Each has their shortcomings and will require further post-processing. Sothink's ActionScript output will probably require more work to make compile with MTASC, but Trillix's output seems to have some stranger bugs I'll mention later, which makes me more hesitant to recommend it. Sothink's tool still seems to have an issue formatting double-precision values as single-precision, as detailed in the section below. [http://www.nowrap.de/flare.html Flare] is also a nice free tool to compare output against, but it unfortunately isn't in a format that you can simply recompile.&lt;br /&gt;
&lt;br /&gt;
[http://www.nowrap.de/flasm.html Flasm] is also a useful tool if you wish to examine the p-code directly (as a debug or learning aid perhaps), or even modify it that way.&lt;br /&gt;
&lt;br /&gt;
=== GFX to SWF ===&lt;br /&gt;
&lt;br /&gt;
If you want your changes to be compatible with a certain or the latest game patch, then you'll also have to first merge the appropriate [[GFX]] files. For example, to be compatible with game v1.03, you'll first need to extract the GFX files from guiexport.erf, and then from the patch000.erf, patch001.erf, and patch002.erf files found under C:\Program Files\Dragon Age\packages\core\patch. If you want to be compatible with v1.02a, then it should suffice to stop merging after patch001.erf.&lt;br /&gt;
&lt;br /&gt;
Then you want to change the first three bytes for the GFX to CWS and change the file suffix to SWF.&lt;br /&gt;
Example Python script:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
from __future__ import with_statement&lt;br /&gt;
# The first line is required if you get the following error when running the python script under 2.5.4/2.5.5&lt;br /&gt;
# SyntaxError: invalid syntax - with open(gfxPath, &amp;quot;rb+&amp;quot;) as gfxFile:&lt;br /&gt;
import glob&lt;br /&gt;
import os&lt;br /&gt;
import struct&lt;br /&gt;
&lt;br /&gt;
for gfxPath in glob.glob('*.gfx'):&lt;br /&gt;
	with open(gfxPath, &amp;quot;rb+&amp;quot;) as gfxFile:&lt;br /&gt;
		print(gfxPath)&lt;br /&gt;
		gfxFile.write(struct.pack('3s', &amp;quot;CWS&amp;quot;))&lt;br /&gt;
	os.rename(gfxPath, os.path.splitext(gfxPath)[0] + &amp;quot;.swf&amp;quot;) &lt;br /&gt;
		&lt;br /&gt;
line = input(&amp;quot;Press enter to exit.&amp;quot;)&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Obtain ActionScript Sources ===&lt;br /&gt;
&lt;br /&gt;
If you're using Sothink's tool, then here's an example of how you would quickly retrieve the ActionScript, if you've converted the GFX into SWFs as mentioned above. Do a multi-file export with all of the SWF files (merged to whichever patch version you wish). [http://i1002.photobucket.com/albums/af150/FollowTheGourd/sothink_swf.jpg Screen shot]&lt;br /&gt;
&lt;br /&gt;
=== Merge ActionScript Classes ===&lt;br /&gt;
&lt;br /&gt;
It's a good idea to create a single ActionScript library of all the game sources; that way you don't have to repeatedly make the same modifications for every SWF file that uses the same modified classes. As you'll see later when using the SWF injection method, that this doesn't make available all of the classes to every SWF file, but it's a way to avoid redundant editing.&lt;br /&gt;
&lt;br /&gt;
For instance, here's a embarrassingly quick and dirty way of doing it with a Python script:&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
from __future__ import with_statement&lt;br /&gt;
# The first line is required if you get the following error when running the python script under 2.5.4/2.5.5&lt;br /&gt;
# SyntaxError: invalid syntax - with open(gfxPath, &amp;quot;rb+&amp;quot;) as gfxFile:&lt;br /&gt;
# [Yes, this code probably sucks]&lt;br /&gt;
&lt;br /&gt;
import shutil&lt;br /&gt;
import os&lt;br /&gt;
import re&lt;br /&gt;
import zlib&lt;br /&gt;
&lt;br /&gt;
# Usage: have the batch exported ActionScript from the decompiler (say Sothink) in a dir called export. Then run this &lt;br /&gt;
# script at the same level as the export dir. It will create a C:\commonlib folder with the ActionScript merged into it.&lt;br /&gt;
# Left over in export is what you can import into a FlashDevelop project. You'll also want to make&lt;br /&gt;
# intrinsics out of export and commonlib, but commlib goes in the global classpath, while&lt;br /&gt;
# the appropriate export subfolder goes in the appropriate project classpath.&lt;br /&gt;
&lt;br /&gt;
mergedir = r'C:\commonlib'&lt;br /&gt;
scriptdict = {}&lt;br /&gt;
for dirpath, dirnames, filenames in os.walk('export'):&lt;br /&gt;
	print(dirpath)&lt;br /&gt;
	for junk in filter (lambda x: not x.endswith(&amp;quot;.as&amp;quot;), filenames):&lt;br /&gt;
		os.remove(os.path.join(dirpath, junk))&lt;br /&gt;
	for script in filter( lambda x : x.endswith(&amp;quot;.as&amp;quot;), filenames):&lt;br /&gt;
		scriptfile = open(os.path.join(dirpath, script))&lt;br /&gt;
		relativedir = re.sub(r'export\\[^\\]+\\?', '', dirpath)&lt;br /&gt;
		relativepath = os.path.join(relativedir, script)&lt;br /&gt;
		crc32 = zlib.crc32(scriptfile.read())&lt;br /&gt;
		scriptfile.close()&lt;br /&gt;
		sourcepath = os.path.join(dirpath, script)&lt;br /&gt;
		if relativepath in scriptdict:&lt;br /&gt;
			lastval = scriptdict[relativepath]&lt;br /&gt;
			if lastval['crc32'] == crc32:&lt;br /&gt;
				destdir = os.path.join(mergedir, relativedir)&lt;br /&gt;
				if os.path.exists(lastval['sourcepath']):&lt;br /&gt;
					os.remove(lastval['sourcepath'])&lt;br /&gt;
				if not os.path.exists(destdir):&lt;br /&gt;
					os.makedirs(destdir)&lt;br /&gt;
				#print(&amp;quot;move &amp;quot; + sourcepath + &amp;quot; to &amp;quot; + destdir)&lt;br /&gt;
				shutil.move(sourcepath, destdir)&lt;br /&gt;
			else:&lt;br /&gt;
				# There any many *Scene.as files that are the same&lt;br /&gt;
				# BUT there's an &amp;quot;emptyish&amp;quot; Scene.as used an as interface as well.&lt;br /&gt;
				# So you probably want Scene.as as common, but the other scenes as unique&lt;br /&gt;
				# even if they have the same name. Still throw if script is Scene.as but not if it ends with it.&lt;br /&gt;
				if not re.search(r'.Scene\.as$', script):&lt;br /&gt;
					raise Exception(&amp;quot;Same name, different CRC32: &amp;quot; + sourcepath)&lt;br /&gt;
		else:&lt;br /&gt;
			scriptdict[relativepath] = { 'crc32': crc32, 'sourcepath': sourcepath }&lt;br /&gt;
&lt;br /&gt;
# Find unique entries in SharedLibary, GUI, etc. Copy them over to commonlib but print out what we found.&lt;br /&gt;
# [Bit of a copy-pasta job here...]&lt;br /&gt;
for dirpath, dirnames, filenames in os.walk('export'):&lt;br /&gt;
	for script in filter (lambda x: x.endswith(&amp;quot;.as&amp;quot;), filenames):&lt;br /&gt;
		relativedir = re.sub(r'export\\[^\\]+\\?', '', dirpath)&lt;br /&gt;
		if relativedir == '':&lt;br /&gt;
			continue&lt;br /&gt;
		relativepath = os.path.join(relativedir, script)&lt;br /&gt;
		sourcepath = os.path.join(dirpath, script)&lt;br /&gt;
		destdir = os.path.join(mergedir, relativedir)&lt;br /&gt;
		if not os.path.exists(destdir):&lt;br /&gt;
			os.makedirs(destdir)&lt;br /&gt;
		print(&amp;quot;Unique commonlib: &amp;quot; + sourcepath)&lt;br /&gt;
		shutil.move(sourcepath, destdir)&lt;br /&gt;
&lt;br /&gt;
# Clean up empty dirs&lt;br /&gt;
for dirpath, dirnames, filenames in os.walk('export', topdown=False):&lt;br /&gt;
	for d in dirnames:&lt;br /&gt;
		try:&lt;br /&gt;
			os.rmdir(os.path.join(dirpath, d))&lt;br /&gt;
		except OSError:&lt;br /&gt;
			pass&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Making Modifications ==&lt;br /&gt;
=== Bugs and getting sources to compile ===&lt;br /&gt;
[ Note: this is mostly just copy and pasted from my post in another forum at the moment. It still needs some reworking to better explain things ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You can first get the open source FlashDevelop IDE which comes with MTASC and the standard Flash library. If you have the SWFs and the ActionScript *.as files, then what you can do is create an empty ActionScript 2 project, in the project settings turn off &amp;quot;use main entry point&amp;quot; and under the project &amp;quot;injection&amp;quot; tab, point it to the SWF you want to update with your new ActionScript.&lt;br /&gt;
&lt;br /&gt;
You'll also want to update the project classpaths to point to your game's ActionScript library. Just in my experience, there seem to be some properties on some of the standard classes that would normally prevent the script from compiling - but in that case what you can do is modify the so-called intrinsic files to let the compiler know about them. E.g., you can add needed function and var declarations to the intrinsic class interfaces under C:\Program Files\FlashDevelop\Tools\mtasc. The nice thing about ActionScript and intrinsics is that you don't even need to know the values of these &amp;quot;missing&amp;quot; properties or functions if they're basically defined in the runtime environment. E.g., Mouse.LEFT isn't standard Flash, but if you edit Mouse.as and add '''static var LEFT;''' to the intrinsic class definition, then you're good to go, as the value gets looked up during execution like a dictionary value (in fact, Mouse[&amp;quot;left&amp;quot;] should yield the same result).&lt;br /&gt;
&lt;br /&gt;
Also if you press Ctrl+J you'll get the type explorer where you can right click on a folder (that you've added to your classpath) and select &amp;quot;convert to intrinsic&amp;quot;. So this way you only need to compile the actual *.as file you're making changes to and keep the others around as intrinsics. Using the IDE's SWF injection I mentioned above will make it so you don't have to worry about recompiling everything.&lt;br /&gt;
&lt;br /&gt;
You'll probably get a bunch of warnings like &amp;quot;... needs the class &amp;lt;Whatever&amp;gt; which was not compiled&amp;quot; but that's just MTASC not liking how some class names are used outside of what you're compiling like in Flash registerObject calls.&lt;br /&gt;
&lt;br /&gt;
Now the bigger issue is that MTASC is pickier about things than Adobe's compiler. You'll often have to write this.varname or ClassName.varname instead of just varname, and MTASC doesn't like named *nested* functions. So you'll sometimes have to convert function FooBar() { ... } into something like &amp;quot;this.FooBar = function() { };&amp;quot; or &amp;quot;_root.FooBar = function() { };&amp;quot;. But also make sure that the variable for the function is a class member and not function-local or it'll just be a register or randomly named variable when compiled, or just not be available in the scope you need it to be.&lt;br /&gt;
&lt;br /&gt;
MTASC is also pickier about the scope of local variables. It may sound weird, but in ActionScript 2.0 a function-local variable is defined for the scope of the function - it doesn't matter if declared in an if-statement or in braces. But the MTASC compiler will enforce that you define the variable in a &amp;quot;proper&amp;quot; scope, so you may need to move where it's declared if you want things to compile. E.g., &amp;quot;if (foo) { var tmp = 1; } else { tmp = 2; }&amp;quot; won't fly with MTASC.&lt;br /&gt;
&lt;br /&gt;
Also it seems like MTASC doesn't like the global function &amp;quot;Array&amp;quot;, but doesn't mind if you use the constructor instead. E.g., I've had issues with var ar = Array(...), but var ar = new Array(...) works or you could use the square-bracket notation instead.&lt;br /&gt;
&lt;br /&gt;
Some other stuff... if you want multiple projects, just create the projects all in the same dir (but create folders if you want to separate stuff and adjust the project classpath accordingly).&lt;br /&gt;
Also, don't necessarily set &amp;quot;Always compile&amp;quot; for the *.as file or you might run into duplicate definition errors - things should get drawn in as needed, but I think you need to set it for classes in the original SWF you wish to update. That might be a little hit and miss at first, but you can always check to make sure your changes got in.&lt;br /&gt;
&lt;br /&gt;
Also, looking at the output in FLASM, MTASC might not generate the most blazing bytecode ever - but neither does Adobe's compiler. Just some things I noticed is that Adobe's will use function argument registers more than MTASC seems to... e.g., &amp;quot;push '_root'; getVariable&amp;quot; vs just a r:_root register.&lt;br /&gt;
&lt;br /&gt;
Another apparent annoyance with MTASC is that it doesn't seem to recognize some global variables (which you can confirm with flasm's output (push 'somevar'; getVariable). Workarounds include ''_global.someVariable'', or sometimes ''_root.someVariable'' as appropriate.&lt;br /&gt;
&lt;br /&gt;
One last thing... you may want to organize your *.as files so you combine the ones that are commonly used across different SWF files so you're not always having to edit multiple copies of SomeClass.as for each SWF that uses it.&lt;br /&gt;
&lt;br /&gt;
Also, I noticed a bug in sothink that I emailed them about: doubles are formatted as single-precision floating point. But some other tools, e.g., flare, get the value correctly. You might want to search your *.as files for &amp;quot;E-&amp;quot; and &amp;quot;E+&amp;quot; to look for these misformatted values if you're using it.&lt;br /&gt;
&lt;br /&gt;
EDIT: Here's a bug with Trillix I noticed, but they said it'll be fixed soon: if you have &amp;quot;var foo = this&amp;quot; and if a register is used for 'foo', then Trillix doesn't properly initialize the register... but instead just uses 'this' everywhere else. This causes problems if you needed that variable to choose between using 'this' and possibly another object. E.g., &amp;quot;var obj = this; if (something) { obj = someOtherObject; } someFunc.doIt(obj);&amp;quot; only works as long as &amp;quot;obj&amp;quot; is stored as a variable and not a register, which is up to the original compiler. In reply, they mentioned that you could work around that issue by turning off the &amp;quot;ActionScript 'Recover arguments' names&amp;quot; setting, which makes it a bit more difficult to keep track of function arguments, so it's less than ideal.&lt;br /&gt;
&lt;br /&gt;
=== Issues displaying custom MovieClip subclasses ===&lt;br /&gt;
'''Note:''' this tries to explain some of the issues, and isn't suggesting best practices. This is a bit rambling and should be presented with more concrete examples. Ideally it wouldn't be needed at all and we could use the Scaleform SDK to convert our SWFs into GFX, or we could splice in our own movieclip symbol tags into the GFX file.&lt;br /&gt;
&lt;br /&gt;
The simple issue is this: if it wasn't originally created in the Flash designer (also having a symbol in the Flash library), then you'll have a harder time of showing custom MovieClip objects through ActionScript alone. This would appear to be a bug, but speculatively, it could be for performance reasons.&lt;br /&gt;
&lt;br /&gt;
==== Using swfmill ====&lt;br /&gt;
This hasn't been thoroughly tested, but swfmill may be a simple way to add you own symbols. Use swfmill to convert the SWF into an XML file, edit it, and then use swfmill to convert it back. It appears to work, and even properly retains the non-standard SWF tags. For custom class behavior, you'll still need to make an ''Object.registerClass'' call to associate the library symbol with the class. If you do use this method, one thing to make sure of is that the embedded textures display properly, since they're being referred to using a non-standard SWF tag.&lt;br /&gt;
&lt;br /&gt;
==== createEmptyMovieClip method ====&lt;br /&gt;
So until splicing in tags becomes more streamlined, or some other method is found, then it may be easier to just create an empty movieclip and then populate the member fields using a mixin from another class or manually, although that's probably still less than ideal for classes that use the onLoad event. Another thing as mentioned below is the possibility of abusing prototype mechanics (which can be somewhat messy) or subclass an existing class to specialize the beha&lt;br /&gt;
&lt;br /&gt;
It would appear that the ''MovieClip'' method ''createEmptyMovieClip'' is of limited use unless you then load another movieclip (such as an icon image) into it or or do a ''beginFill ... endFill'' ('''fill-code''') for a few frames to define its dimensions, filling it for as many frames until, say, its '''_height''' property becomes non-zero. It's ugly, but works. Also, if you do a fill on an object in the library, then you actually affect its '''_xscale''' and '''_yscale''' by making the object stretch to fit into your fill. Ultimately, it'd probably be less of a hassle to alter the SWF file to insert your object. Because of having to rerun the code, you'll probably want to delay having to reload images or other intensive operations. You'll have to rerun the fill-code at least twice for this to work, timing alone doesn't matter as has been determined through trial and error.&lt;br /&gt;
&lt;br /&gt;
==== attachMovie method ====&lt;br /&gt;
Perhaps a simpler way is to use ''attachMovie'', although you'll have to find a pre-existing movieclip symbol that suites your needs, and if you want to change its default dimensions then you'll have to delay the fill-code for a few (let's say 150 or so since the scene began) frames after the game loads until it actually works. '''NOTE:''' Reconfirm this is actually necessary instead of just being able to set the _height/_width/_xscale/_yscale, although you may still need to delay setting those for the change to take effect. This way you shouldn't have to keep rerunning the fill-code as with the above ''createEmptyMovieClip'' method. This whole delay business is probably more of an issue in UI elements that are on the HUD instead of selected later from the navbar. You can probably check for when you've waited enough frames by running some simple fill-code on an empty movieclip and checking whether the '''_height''' property changes. &lt;br /&gt;
E.g., the PieCooldown symbol exists in the quickbar.swf file and isn't the worst choice for an empty MovieClip. You can use programs like swix, swfmill, and probably others to find simple objects without much embedded graphics.&lt;br /&gt;
&amp;lt;dascript&amp;gt;&lt;br /&gt;
private static var EMPTYMC_LINKID:String = &amp;quot;PieCooldown&amp;quot;;	&lt;br /&gt;
var mc:MovieClip = someClip_mc.attachMovie(EMPTYMC_LINKID, &amp;quot;SomeName_mc&amp;quot;, someClip_mc.getNextHighestDepth(), {_x:10, _y:10});&lt;br /&gt;
&lt;br /&gt;
// Changing the default dimensions of &amp;quot;PieCooldown&amp;quot;&lt;br /&gt;
// Although you can probably just change the _height, _width or scales after the&lt;br /&gt;
// needed delay instead, unlike with the createEmptyMovieClip method apparently.&lt;br /&gt;
// Also not really necessary if you just want to use it as an invisible container,&lt;br /&gt;
// since other items can be positioned outside of it, relative to its local &lt;br /&gt;
// coordinates.&lt;br /&gt;
with(mc)&lt;br /&gt;
{&lt;br /&gt;
   beginFill(0, 0); // alpha is zero.&lt;br /&gt;
   moveTo(0, 0);&lt;br /&gt;
   lineTo(21, 0);&lt;br /&gt;
   lineTo(21, 21);&lt;br /&gt;
   lineTo(0, 21);&lt;br /&gt;
   endFill();	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/dascript&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The game's script sources also come with a ''MovieUtils'' class, which has a wrapper around ''attachMovie''. This can be useful to create an instance of a library symbol in the SWF file and use it instead for another purpose. &lt;br /&gt;
&lt;br /&gt;
Other useful workaround would be abusing prototype mechanics of ActionScript to give an already existing class other behavior if desired, and can be switched using a custom argument for the initObject during the attachMovie call. This way you don't have to edit the actual class file, if making it recompile is problematic or time consuming. Although this is a kludge method of doing it.&lt;br /&gt;
&lt;br /&gt;
Also of note is that ''Object.registerClass'' or the so-called [http://www.google.com/search?hl=en&amp;amp;source=hp&amp;amp;q=attachMovie+__packages+trick __Packages trick] won't really get you anywhere either. You'll be able to create the MovieClip subclass, but it won't display properly (or just differently) without the above-mentioned tricks.&lt;br /&gt;
&lt;br /&gt;
Creating a subclass of an existing class that's registered with ''Object.registerClass'' may also be a convenient way to customize class behavior without having to recompile the base class if you then change the registerClass call to use the subclass.&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Conversation&amp;diff=14628</id>
		<title>Conversation</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Conversation&amp;diff=14628"/>
				<updated>2010-11-12T05:48:46Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: /* + check in creature resource */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| style=&amp;quot;float:right;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| {{Resource palette}}&lt;br /&gt;
|-&lt;br /&gt;
| {{Infobox conversation}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Conversations contain lines of dialogue, usually focused on one NPC and the player's interaction with him or her. Each line of dialogue can have the following associated with it:&lt;br /&gt;
*The text of the line, which can be displayed in-game&lt;br /&gt;
*The [[Voice-Over]] (for non-player characters)&lt;br /&gt;
*The speaker's facial performance (lip synching and expression)&lt;br /&gt;
*[[Stage]] information for positioning the actors and cameras in an area (optional, some conversations can occur anywhere and use default staging)&lt;br /&gt;
*[[Cutscene]] cinematics that can potentially override any of the above with more detailed and complex events.&lt;br /&gt;
&lt;br /&gt;
A conversation is usually associated with a [[creature]], which is referred to in the conversation with the &amp;quot;OWNER&amp;quot; tag. They can also be associated with placeables, or simply used as a container for lines of dialogue used in a cutscene.&lt;br /&gt;
&lt;br /&gt;
The main body of the display for this type of object is one or more tree-shaped structures containing all of the lines or actions that can be reached in the course of following this conversation. For example:&lt;br /&gt;
&lt;br /&gt;
[[Image:Conversation tutorial 2.png]]&lt;br /&gt;
&lt;br /&gt;
Red lines are those spoken by NPCs, blue lines are those spoken by the player (usually chosen from a group of alternatives). Grey lines are lines that are 'linked' to other lines, allowing the flow of the conversation to jump to other branches or repeat itself if needed.&lt;br /&gt;
&lt;br /&gt;
Below the main display is a tabbed pane containing options that can be set on a line-by-line basis.&lt;br /&gt;
&lt;br /&gt;
== Global Settings ==&lt;br /&gt;
&lt;br /&gt;
The global settings tab is only present when the root node of the entire conversation is selected. This is where one can set defaults for who is listening and who is talking (in conversations with more than two individuals you'll need to override these defaults on a line-by-line basis as needed).&lt;br /&gt;
&lt;br /&gt;
You can also set a number of flags involved in cinematic effects:&lt;br /&gt;
*Lock all gestures&lt;br /&gt;
*Lock all poses&lt;br /&gt;
*Lock all RoboBrad&lt;br /&gt;
*Lock all cameras&lt;br /&gt;
*Ambient Soundset Type&lt;br /&gt;
&lt;br /&gt;
Also available in the root node are a simplified plot and scripting tab (see below for details) that allows you to modify plot flags and trigger scripts when the conversation ends; this is helpful for preventing errors and saving time when crafting a conversation that is always supposed to have the same effect on the world when it's over but that has many different conversation end nodes scattered throughout it.&lt;br /&gt;
&lt;br /&gt;
The cinematics tab of the root node allows default cinematics information to be set, which is inherited by the rest of the nodes in the conversation unless overridden.&lt;br /&gt;
&lt;br /&gt;
Finally, the root node has a conversation synopsis text field where a summary of the content and purpose of the conversation can be placed for ease of reference.&lt;br /&gt;
&lt;br /&gt;
== Dialogue ==&lt;br /&gt;
&lt;br /&gt;
[[Image:Conversation dialog.png]]&lt;br /&gt;
&lt;br /&gt;
This tab contains the string of text that is displayed to the player when this node in the tree is reached.&lt;br /&gt;
&lt;br /&gt;
At the lower left corner are some statistics for this line and for the conversation it's a part of.&lt;br /&gt;
&lt;br /&gt;
*Player Response Length Maximum: 60 characters &lt;br /&gt;
*NPC Response Length Maximum: 200 characters&lt;br /&gt;
&lt;br /&gt;
There is also a limit of six lines of player responses displayed for any particular line of NPC dialogue. If there are more than six responses available to be shown, only the first six will be visible.&lt;br /&gt;
&lt;br /&gt;
Also in the lower left corner is the string ID for this line of dialog, which is used when recording voice over audio. Don't forget to [[String_editor#Generated string IDs | check the dialogue and creature resources back in]] before exporting your talk tables, or else the conversation history in the player's journal won't be correct.&lt;br /&gt;
&lt;br /&gt;
=== Formatting tags ===&lt;br /&gt;
&lt;br /&gt;
==== Emphasis tags ====&lt;br /&gt;
&lt;br /&gt;
To indicate that a word in spoken text is emphasized, use &amp;amp;lt;emp&amp;amp;gt; tags. In subtitles, text inside the tags will be bolded.&lt;br /&gt;
&lt;br /&gt;
For example: &amp;quot;I don't &amp;amp;lt;emp&amp;amp;gt;think&amp;amp;lt;/emp&amp;amp;gt; so.&amp;quot; appears in-game as: &amp;quot;I don't '''think''' so.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Description tags ====&lt;br /&gt;
&lt;br /&gt;
Description &amp;amp;lt;desc&amp;amp;gt; tags are used in three ways: 1) To set apart a non-spoken sound (NPC lines), 2) To describe action that is not voiced (player lines), 2) To indicate that a persuade line is a lie or charm (player lines), 3) For text that describes an object (object lines). &lt;br /&gt;
&lt;br /&gt;
In subtitles, text inside &amp;amp;lt;desc&amp;amp;gt; tags will be italicized and put into parentheses.&lt;br /&gt;
&lt;br /&gt;
1) Unspoken sounds (such as a sigh, sob, or grunt of pain) - NPC lines only. &lt;br /&gt;
&lt;br /&gt;
Write out the sound, not a description of the sound. &lt;br /&gt;
* Incorrect: &amp;quot;No! Please don't kill me! &amp;amp;lt;desc&amp;amp;gt;gurgling sound as she is stabbed&amp;amp;lt;/desc&amp;amp;gt;&lt;br /&gt;
* Correct: &amp;quot;No! Please don't kill me! &amp;amp;lt;desc&amp;amp;gt;Aaargh!&amp;amp;lt;/desc&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;If only... &amp;amp;lt;desc&amp;amp;gt;sigh&amp;amp;lt;/desc&amp;amp;gt; Alas, it cannot be.&amp;quot; appears in-game as: &amp;quot;If only... ''(sigh)''' Alas, it cannot be.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2) Persuade lines that need to be marked as &amp;quot;lie&amp;quot; or &amp;quot;charm&amp;quot; - player lines only: When a line that has been flagged in the toolset as a &amp;quot;Persuade&amp;quot; line needs to me marked as a specific &amp;quot;lie&amp;quot; or &amp;quot;charm&amp;quot;, write Lie or Charm at the line's beginning. Then, use &amp;amp;lt;desc&amp;amp;gt; tags around that word so that it will be set off from the rest of the line.&lt;br /&gt;
For example: &amp;amp;lt;desc&amp;amp;gt;Lie&amp;amp;lt;/desc&amp;amp;gt; &amp;quot;Of course I didn't report you to the authorities.&amp;quot; appears in-game as: &amp;quot;''(Lie)'' Of course I didn't report you to the authorities.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
3) Text that describes an object - Object lines only: When a line is created to describe an inanimate object, such as a bookcase or chest, descriptive lines for that object should be marked with &amp;amp;lt;desc&amp;amp;gt; tags. The writer creates a &amp;quot;character&amp;quot; in the toolset (&amp;quot;bhm700_bookcase&amp;quot;), and writes a line to describe that object. For example, &amp;amp;lt;desc&amp;amp;gt;This bookcase is full of dusty, moldering books.&amp;amp;lt;/desc&amp;amp;gt; or &amp;amp;lt;desc&amp;amp;gt;The phylactery is warm to the touch and filled with a small amount of viscous, red liquid. You see no way to open it.&amp;amp;lt;/desc&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Correct: &amp;amp;lt;desc&amp;amp;gt;This bookcase is full of dusty, moldering books.&amp;amp;lt;/desc&amp;amp;gt;&lt;br /&gt;
All such text should be written in third-person, present tense, with the player always referred to as &amp;quot;you&amp;quot;. &lt;br /&gt;
* Incorrect: &amp;amp;lt;desc&amp;amp;gt; The phylactery is warm to the touch and filled with a small amount of viscous, red liquid. I can't see any way to open it.&amp;amp;lt;/desc&amp;amp;gt; &lt;br /&gt;
* Correct: &amp;amp;lt;desc&amp;amp;gt;The phylactery is warm to the touch and filled with a small amount of viscous, red liquid. You see no way to open it.&amp;amp;lt;/desc&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
The tech designer will need to create a placeable in the appropriate area. The character for that placeable should be set as &amp;quot;null&amp;quot;. (This indicates that no VO recording is needed for that line.) It should also be set to appear on the screen even if subtitles are turned off by default.&lt;br /&gt;
&lt;br /&gt;
==== Action Tags ====&lt;br /&gt;
&lt;br /&gt;
Action tags &amp;amp;lt;act&amp;amp;gt; describe player action. In subtitles, text inside &amp;amp;lt;act&amp;amp;gt; tags will be italicized and put into parentheses.&lt;br /&gt;
&lt;br /&gt;
For example: &amp;quot;If that's the way you want it. &amp;amp;lt;act&amp;amp;gt;Kill the soldier.&amp;amp;lt;/act&amp;amp;gt;&amp;quot; appears in-game as: &amp;quot;If that's the way you want it. ''(Kill the soldier.)''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Incorrect: {Owner}: &amp;quot;Here. Take this. &amp;amp;lt;act&amp;amp;gt; Opens chest, removes sword.&amp;amp;lt;/act&amp;amp;gt; It was your father's.&amp;quot; &lt;br /&gt;
&lt;br /&gt;
=== Macros ===&lt;br /&gt;
&lt;br /&gt;
The &amp;amp;lt;FirstName/&amp;amp;gt; macro will be replaced with the first name entered by the player for his character. Since the player character's name can be anywhere up to 20 characters long, player lines using the &amp;amp;lt;FirstName/&amp;amp;gt; macro can only have 40 characters (not including the macro itself).&lt;br /&gt;
&lt;br /&gt;
Macros are used fairly rarely in Dragon Age since voiceovers accompany most lines and cannot be modified to match lines with variable text.&lt;br /&gt;
&lt;br /&gt;
=== Other settings ===&lt;br /&gt;
&lt;br /&gt;
Also on this tab are some additional flags and tags that can be set for this line.&lt;br /&gt;
*Skill/Icon - allows an icon to be placed next to this line indicating that a skill must be used when the line is selected by the player&lt;br /&gt;
*Speaker Tag and Listener Tag - defines which character is the speaker and which is the listener (can be set to default)&lt;br /&gt;
*Language - defines which language the line is spoken in.&lt;br /&gt;
*Fast Path - Any line with &amp;quot;Fast Path&amp;quot; set will be the first option presented to a player when they reach this conversation node. This can be useful if you want to provide an easy way to blow through the conversation tree without having to read it; if you mark the shortest path through the tree with this flag the player will only have to tap the &amp;quot;1&amp;quot; key to pass through it. You can also do this without the fast path flag by arranging your conversation nodes in the correct order, but restructuring an entire conversation tree for this purpose is a more complex task.&lt;br /&gt;
&lt;br /&gt;
== Plots and Scripting ==&lt;br /&gt;
&lt;br /&gt;
See [[conversation plots and scripting]] for details on how to use plots and scripts to make certain lines of dialog &amp;quot;conditional&amp;quot; (appearing or not appearing based on conditions in the game) and how to have certain lines cause scripted actions and change plot flags.&lt;br /&gt;
&lt;br /&gt;
This tab also includes an option to easily set a line so that it appears to a player only once (either once per conversation or once per game).&lt;br /&gt;
&lt;br /&gt;
== Cinematics and Animation ==&lt;br /&gt;
&lt;br /&gt;
See [[conversation cinematics and animation]] for details of how to control the performance of your virtual actors. Conversations without cinematic direction set for them will use a default over-the-shoulder camera style that's serviceable for most conversations, but which might become dull when used for all of them. Adding some animation and varying the camera angles can go a long way to spicing up a conversation, and for special events you can add much more than that - even integrating full-blown cutscenes into the middle of a conversation.&lt;br /&gt;
&lt;br /&gt;
== Localization and Editing ==&lt;br /&gt;
&lt;br /&gt;
These two panels are used for keeping track of the status of the localization and editing process for this line. This is useful for large-scale collaborative projects, such as Dragon Age itself, but may not be of as much use for individual adventure designers.&lt;br /&gt;
&lt;br /&gt;
== Slide Show ==&lt;br /&gt;
&lt;br /&gt;
The Slide Show tab is used to produce a simple form of &amp;quot;cutscene&amp;quot; that consists of one or more pre-rendered still images. For example, the official DAO campaign ends with a slideshow that describes the aftermath.&lt;br /&gt;
&lt;br /&gt;
Images used in a slide show can be in [[TGA]], [[TPC]] or [[DDS]] format.&lt;br /&gt;
&lt;br /&gt;
Each image must be on its own NPC conversation line. The Dialogue text isn't used in game, but it must contain something (e.g. &amp;quot;Slideshow&amp;quot;), otherwise the slide won't appear. &lt;br /&gt;
&lt;br /&gt;
As usual, the NPC lines are connected by player lines (which don't need any Dialogue text).          &lt;br /&gt;
&lt;br /&gt;
See [[BeginSlideshow]] for the script function that triggers a slideshow.&lt;br /&gt;
&lt;br /&gt;
== Toolbars ==&lt;br /&gt;
&lt;br /&gt;
[[Image:Conversation toolbar labeled.png]]&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Find links&amp;quot; generates a list of other places in the tree that have this line as their child. See the &amp;quot;looping conversations and re-using lines&amp;quot; section below.&lt;br /&gt;
*The highlighting toolbar is handy for rapidly finding and paging through conversation nodes with particular properties. There's forward and backward buttons for jumping from highlighted node to highlighted node, and a set of togglable highlight selection buttons that turn on and off highlighting based on node characteristics. &lt;br /&gt;
* &amp;quot;Once-per&amp;quot; lines include both once-per-conversation and once-per-game&lt;br /&gt;
* Highlighting lines with plot involvement will prompt you to select which particular plot to highlight.&lt;br /&gt;
&lt;br /&gt;
== Looping conversation and re-using lines in multiple places ==&lt;br /&gt;
&lt;br /&gt;
Although the basic structure is tree-shaped, the flow of the conversation can be structured to return back to previous nodes in the conversation. To cause a node in the tree to repeat:&lt;br /&gt;
&lt;br /&gt;
*select the node you want to return to,&lt;br /&gt;
*&amp;quot;Copy&amp;quot; it (control-C, or select copy from the right-click menu),&lt;br /&gt;
*select the node you want the repeated response to be a child of,&lt;br /&gt;
*select &amp;quot;Paste as link&amp;quot; from the right-click menu (keyboard shortcut: control-shift-V)&lt;br /&gt;
&lt;br /&gt;
The link node will appear in gray and cannot be edited. If you edit the original copy of the node all linked copies will reflect the change. You can only link nodes that have the same type (player/non-player), the paste-as-link option won't be available if the node currently saved to the clipboard can't be linked to a child of the currently selected node.&lt;br /&gt;
&lt;br /&gt;
To find the original copy of a linked node, right-click on the grey node and select &amp;quot;Jump to Target&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Using the &amp;quot;once per conversation&amp;quot; or &amp;quot;once per game&amp;quot; visibility setting for the children of a repeating node is useful for preventing the player from cycling multiple times through the exact same dialogue.&lt;br /&gt;
&lt;br /&gt;
== Voice-Over ==&lt;br /&gt;
&lt;br /&gt;
You can use both placeholder and real recorded voiceover in your conversation, depending on what your current status on the conversation is. After you have some sort of voiceover associated to your conversation, you may run &amp;quot;Tools-&amp;gt;Generate [[FaceFX]]&amp;quot; to add a facial expression to the NPCs performance.&lt;br /&gt;
&lt;br /&gt;
All information about [[Voice-Over]] (conventions, integration, etc.) is stored at a another page to keep a central organized structure.&lt;br /&gt;
&lt;br /&gt;
== Glossary of design terms ==&lt;br /&gt;
&lt;br /&gt;
* Branch: A dialogue option that adds flavor to a conversation, but doesn't change the direction of the plot or story. Branches always come back together at a choke point.&lt;br /&gt;
* Clarification Hub: This allows a player to return to an NPC and clarify plot elements, get directions, or find out information about the current area. Generally, an single NPC line asks the player what he wants; a list of questions is then available to the player. Once the player has received an answer, the same list reappears (minus the question just asked). The player can loop infinitely through this NPC dialogue. &lt;br /&gt;
* Path: The dialogue options players can select that change the direction of a plot or story. For example, when a player is given the option of accepting a quest, there are two different resulting paths (based on a &amp;quot;Yes&amp;quot; or &amp;quot;No&amp;quot; answer). Unlike branches, paths never come back together. Each path has a different ending condition. &lt;br /&gt;
* Question Hub: A list of questions presented to a player that allows him to ask multiple questions to clarify information he's just learned. After a response is given, the player can ask the remaining questions. It's possible to loop indefinitely through a question hub, but only by asking non-critical questions. Unlike a clarification hub, at least one question drives the conversation tree forward and eliminates all remaining questions. For example, an NPC gives plot critical information; once she relates the details, the player can ask four specific questions. Three of the questions are non-critical: they give flavor and/or enhance role-playing. These questions allow for infinite looping. However, the fourth question drives the conversation forward and eliminates all other questions. This important question should always be located beneath the &amp;quot;lesser&amp;quot; questions.&lt;br /&gt;
&lt;br /&gt;
== Associated Links ==&lt;br /&gt;
&lt;br /&gt;
*[[Conversation cinematics and animation]]&lt;br /&gt;
*[[Conversation plots and scripting]]&lt;br /&gt;
*[[Conversation tutorial]]&lt;br /&gt;
*[[Voice-Over]]&lt;br /&gt;
*[[Preparing a dialog for recording]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Conversations]]&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Conversation_tutorial&amp;diff=14627</id>
		<title>Conversation tutorial</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Conversation_tutorial&amp;diff=14627"/>
				<updated>2010-11-12T05:41:13Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: Added troubleshooting section and linked to conversation history not showing up. Extra write-up for a tutorial reader.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox conversation}}&lt;br /&gt;
&lt;br /&gt;
Dialog is perhaps the most important part of making an adventure into a story. In Dragon Age, dialog is a collection of lines that are arranged in an interactive tree-shaped structure. This tree structure can be simple or complex, and each line can have conditions and actions attached to it that interact with the state of the world at large.&lt;br /&gt;
&lt;br /&gt;
For this tutorial we will start simple and then progressively add new features and options to a [[conversation]] as we go. Later on there will be a separate tutorial for adding cinematic direction to conversations.&lt;br /&gt;
&lt;br /&gt;
== Creating and setting a conversation for a creature ==&lt;br /&gt;
&lt;br /&gt;
{{sidebox|&lt;br /&gt;
* The root node of a conversation tree holds global (conversation-wide) settings.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
In the [[creature tutorial]] we created a [[creature]] named &amp;quot;Quest Giver&amp;quot;, who is standing outside a hut that's filled with monsters. The goal is to have the quest giver ask you to go in and kill all the monsters for him.&lt;br /&gt;
&lt;br /&gt;
First, we need to create the conversation resource. Using the new resource command, select &amp;quot;conversation&amp;quot; and give it a resource name that will help keep track of its purpose. We're calling this conversation &amp;quot;conv_quest_giver&amp;quot;. The new conversation starts out empty, with only a &amp;quot;root&amp;quot; node. The root node of a conversation doesn't contain any dialog itself; it is merely a container that holds various global settings that apply to the conversation as a whole.&lt;br /&gt;
&lt;br /&gt;
With the root node highlighted, the global settings become accessible in the tabbed pane at the bottom of the conversation editing window:&lt;br /&gt;
&lt;br /&gt;
[[Image:Conversation root global settings.png]]&lt;br /&gt;
&lt;br /&gt;
{{sidebox|&lt;br /&gt;
* &amp;quot;OWNER&amp;quot; is the creature the conversation &amp;quot;belongs&amp;quot; to.&lt;br /&gt;
* &amp;quot;PLAYER&amp;quot; is the player's character&lt;br /&gt;
* A conversation is assigned to a creature in the ''creature's'' properties (the &amp;quot;Conversation&amp;quot; property)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
These settings have defaults that will be perfectly good for a conversation between a PC and a single NPC, as we will be doing here. The &amp;quot;OWNER&amp;quot; of the conversation will be the creature the conversation is attached to - in this case, Quest Giver. The &amp;quot;PLAYER&amp;quot; is, of course, the player's character.&lt;br /&gt;
&lt;br /&gt;
*Default NPC Speaker: This is the creature who, by default, responds to the player's dialog selections.&lt;br /&gt;
*Default NPC Listener: This is the creature who the NPC is directing those responses to. This is used to determine who the NPC should turn his head toward when speaking.&lt;br /&gt;
*Default PC Listener: This is the creature who the PC is talking to when he makes dialog selections, determining who the PC's avatar turns his head toward.&lt;br /&gt;
&lt;br /&gt;
These settings can be overridden on a line-by-line basis, something you'll usually only need to do when you're writing a conversation with more than two participants. We won't do that in this introductory tutorial. It's also possible to have an inanimate object (a placeable) as a participant in a conversation, which we also won't get into here.&lt;br /&gt;
&lt;br /&gt;
Also on this page are a number of checkboxes for locking cinematics. This is usually used to prevent the toolset from generating new automatic animations after you've fine-tuned things manually, we won't need to worry about that for now.&lt;br /&gt;
&lt;br /&gt;
Once the conversation resource is created, we'll need to tell the quest_giver creature that he's supposed to use it when the player tries to talk to him. Open the quest giver in the creature editor and change his &amp;quot;Conversation&amp;quot; property from the default (none) to &amp;quot;conv_quest_giver&amp;quot; by pressing the ellipsis ([[Image:ellipsis.png]]) button and selecting the conv_quest_giver dialog.&lt;br /&gt;
&lt;br /&gt;
== Adding some dialog ==&lt;br /&gt;
&lt;br /&gt;
{{sidebox|&lt;br /&gt;
* Red lines of dialog are spoken by NPCs one at a time&lt;br /&gt;
* Blue lines of dialog are selected from by the player and are presented as groups of options&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
To add a line to the root, you can right-click on it and select &amp;quot;Add Line&amp;quot;. It's also available as a button in the toolbar (button #23, below) and with the shortcut &amp;quot;control-A&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Image:Conversation toolbar.png]]&lt;br /&gt;
&lt;br /&gt;
The added node will be in red text, indicating it's non-interactive (spoken by the NPC) and tagged with &amp;lt;nowiki&amp;gt;[[[[OWNER]]]]&amp;lt;/nowiki&amp;gt; to indicate who's speaking it. When the player initiates conversation with the conversation's owner, this is the first line that will be said.&lt;br /&gt;
&lt;br /&gt;
To determine what it is that the conversation owner says, select the node and go down to the dialog tab to enter the text. For the time being we won't need to worry about the other options below the dialog's main text entry field.&lt;br /&gt;
&lt;br /&gt;
[[Image:Conversation dialog.png]]&lt;br /&gt;
&lt;br /&gt;
Once the creature has spoken its line, the player needs to be prompted to give some sort of response. The player could greet the Quest Giver, ask him a question, or choose to ignore him. To add these options, select the line you just added and &amp;quot;Insert line&amp;quot; three times. This will add three blue lines as children of the red one. In each of these lines' dialogue tabs, add the text of the response the player can give.&lt;br /&gt;
&lt;br /&gt;
[[Image:Conversation tutorial 1.png]]&lt;br /&gt;
&lt;br /&gt;
Here's how it looks in game once we've initiated this conversation:&lt;br /&gt;
&lt;br /&gt;
[[Image:Conversation tutorial quest giver speaks.png|600px]]&lt;br /&gt;
&lt;br /&gt;
The conversation can continue being built in this vein with one NPC response for each of the player's options and one or more player options branching out in turn. When the player runs off the end of the conversation it ends, sending him back to explore mode.&lt;br /&gt;
&lt;br /&gt;
{{sidebox|&lt;br /&gt;
* &amp;quot;Copy&amp;quot; and then &amp;quot;Paste as Link&amp;quot; allows conversation trees to loop or merge branches&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Thanks to this branching pattern it is possible for a conversation's volume to grow at an exponential rate, rapidly becoming very tedious to write. Worse, there could be many points within a conversation tree where the same lines might be spoken, leading to redundancy. This can be solved by &amp;quot;linking&amp;quot; lines to each other, allowing the conversation to jump from one branch to another or to loop back on itself to replay parts over again.&lt;br /&gt;
&lt;br /&gt;
In this example, we'll have the Quest Giver respond to the player's first option with &amp;quot;Excellent! I have a quest I need performed for me!&amp;quot;. At this point the player could respond with the same &amp;quot;Oh? What quests do you have in mind?&amp;quot; line that was an option initially, leading to the same response. Rather than duplicate the entire tree, select the existing &amp;quot;Oh? What quests do you have in mind?&amp;quot; line and copy it to the clipboard (control-C, or right click copy, or edit -&amp;gt; copy). Then select the new owner line and paste as link (control-shift-V, right click paste as link, or edit -&amp;gt; paste as link)&lt;br /&gt;
&lt;br /&gt;
[[Image:Conversation tutorial 2.png]]&lt;br /&gt;
&lt;br /&gt;
The linked line is shown in gray. To find out where a grey line links to, right-click on it and select &amp;quot;Jump to Target&amp;quot; (or just double click it). To find all the places the target line is linked to from, right-click on it and select &amp;quot;Find Links&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Now both of these paths through the conversation will lead to the same line, wherein the Quest Giver tells the player that the hut behind him is full of monsters. We can add an option to the dialog after this where the player can accept the mission to slay them all, and now when he enters the hut to fight them there will be more of a story behind about how he came to that point.&lt;br /&gt;
&lt;br /&gt;
== Keeping track of quests via plots ==&lt;br /&gt;
&lt;br /&gt;
{{sidebox|&lt;br /&gt;
* Plots contain lists of flags for keeping track of quest status and other world events&lt;br /&gt;
* Each flag can also contain journal text for the player to read&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Now that we have a mechanism in place where we can assign a quest to the player we'll want some way to keep track of his progress. In Neverwinter Nights this was done using scripting directly, but in Dragon Age a new type of resource has been introduced that helps to simplify the process. These are &amp;quot;[[Plot]]s&amp;quot;. Go to the resource palette and create a new plot with the resource name &amp;quot;clear_the_hut&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
A plot consists of a series of named flags that can be set to true or false. The intent is for these flags to represent significant accomplishments or developments in the plot, with the values being set in response to the player's actions. Each flag can also have an associated journal text, a block of text that is displayed in the  player's journal under the plot's title. Journal text is normally used to keep the player informed of his progress and remind him of important information he's discovered along the way.&lt;br /&gt;
&lt;br /&gt;
We'll need to give the plot a &amp;quot;Name&amp;quot; property, which will be seen by the player as the plot's title in the journal. This plot's name will be &amp;quot;Clear the Hut&amp;quot;. There are three significant landmarks in the course of this plot; the moment the player accepts the plot, the moment the player has succeeded in slaying all of the monsters in the hut, and the moment when the player reports back to the quest giver to receive his reward. We will therefore create three flags:&lt;br /&gt;
&lt;br /&gt;
*QUEST_ACCEPTED&lt;br /&gt;
*MONSTERS_SLAIN&lt;br /&gt;
*REWARD_RECEIVED&lt;br /&gt;
&lt;br /&gt;
Create flags by right-clicking on the plot editor and selecting &amp;quot;Insert -&amp;gt; Main Flag&amp;quot;, or by clicking on &amp;quot;Insert Main Flag&amp;quot; in the toolbar, or by selecting &amp;quot;Edit -&amp;gt; Insert -&amp;gt; Main Flag&amp;quot; from the menu bar.&lt;br /&gt;
&lt;br /&gt;
[[Image:Plot tutorial 1.png]]&lt;br /&gt;
&lt;br /&gt;
Each time a plot flag is set, that flag's journal text replaces the previous text that was in the journal for that plot.&lt;br /&gt;
&lt;br /&gt;
{{sidebox|&lt;br /&gt;
* The &amp;quot;Action&amp;quot; section of the &amp;quot;Plots and Scripting&amp;quot; tab of a conversation node allows plot flags to be set (made &amp;quot;true&amp;quot;) or unset (made &amp;quot;false&amp;quot;) when that line is finished&lt;br /&gt;
* The &amp;quot;Condition&amp;quot; section of the tab allows the line to be hidden or shown to the player based on the state of plot flags&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The easiest way to set a plot flag is in a conversation. When the player accepts the quest to slay the monsters in the hut, we'll want to set the &amp;quot;QUEST_ACCEPTED&amp;quot; flag of the clear_the_hut plot. Select the line where the player accepts the quest and then click on the &amp;quot;Plots and Scripting&amp;quot; tab. Under the &amp;quot;Action&amp;quot; section we'll want to select the clear_the_hut plot. It won't initially appear in the dropdown list since we haven't selected it before (the dropdown list contains recently-used resources), so click on the ellipsis button and select it from the list of all plot resources. Then, once the correct plot is accepted, select the &amp;quot;QUEST_ACCEPTED&amp;quot; flag. The default action is &amp;quot;set&amp;quot;, which will set the flag to true.&lt;br /&gt;
&lt;br /&gt;
Now when we reach this line in the conversation, the &amp;quot;QUEST_ACCEPTED&amp;quot; flag in the clear_the_hut plot will be set to true. This will also update the player's journal to show the journal text associated with that plot flag. You'll note that an &amp;quot;A&amp;quot; also appears in the icon for this conversation node, an indicator that this line of dialog has an action associated with it.&lt;br /&gt;
&lt;br /&gt;
{{sidebox|&lt;br /&gt;
* The first NPC (red) line that can be shown to a player will be; all subsequent NPC lines branching from the same node will be hidden&lt;br /&gt;
* Make sure the last child line of a node has no condition attached so that there will always be a default line to show the player&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Once the quest has been accepted, it makes no sense for the Quest Giver to offer it a second time. Indeed, if the player were to partially complete the quest and then accept it all over again, his progress through the quest would be disrupted and quite likely unexpected errors would slip into the game. Therefore, we are going to go back to the first line in this conversation and add a condition to it. Select the first line, go to the &amp;quot;Plots and Scripting&amp;quot; tab, and this time put the &amp;quot;clear_the_hut&amp;quot; plot in the ''condition'' section. Set the flag to &amp;quot;QUEST_ACCEPTED&amp;quot;, and set the condition to &amp;quot;is false&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[Image:Conversation tutorial 4.png]]&lt;br /&gt;
&lt;br /&gt;
This means that this line of dialog will only appear if the quest has not yet been accepted. You'll note that a &amp;quot;C&amp;quot; appears in the node icon to indicate that this line of dialog has a condition attached. Since all of the other lines of dialog depend on this line appearing, including the offer of the quest and the line where the player accepts it, this means that the quest can only be accepted once; once it's been accepted the quest giver will not offer it again.&lt;br /&gt;
&lt;br /&gt;
However, this will now leave the quest giver with nothing at all to say. We'll want to give him a different line to say instead. Select the root node of the conversation tree, add a line, and you'll get a second &amp;quot;first&amp;quot; line for the quest giver to say. The game will always pick the first line that can be spoken, so the player will never see the line &amp;quot;Have you slain the monsters yet?&amp;quot; until after he has accepted the quest and the line &amp;quot;Ahoy! I am the Quest Giver!&amp;quot; becomes hidden.&lt;br /&gt;
&lt;br /&gt;
[[Image:Conversation tutorial 5.png]]&lt;br /&gt;
&lt;br /&gt;
{{sidebox|&lt;br /&gt;
* Player responses can also be made conditional, being hidden from the player if the condition fails.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Conditions can also be placed on player lines. In this case, we want the player to only be able to tell the quest giver that he's completed the quest once the monsters are actually dead. We'll be showing how the MONSTERS_SLAIN flag will be set up later, using scripting, but the details of how it is set are not important right now; we can set the conversation up to account for it and implement it later.&lt;br /&gt;
&lt;br /&gt;
Set the condition for the line &amp;quot;Yes, I have&amp;quot; to require the MONSTERS_SLAIN flag to be true. The subsequent response from the quest giver can then set the REWARD_RECEIVED flag to true.&lt;br /&gt;
&lt;br /&gt;
To prevent the player from accepting his reward multiple times, add a condition to the line &amp;quot;Have you slain the monsters yet?&amp;quot; to require REWARD_RECEIVED to be false. Finally, add a third line off of root for the quest giver to say once the quest has been confirmed completed and there's nothing more for him to do.&lt;br /&gt;
&lt;br /&gt;
[[Image:Conversation tutorial 6.png]]&lt;br /&gt;
&lt;br /&gt;
And there you have it, a simple interactive conversation that will affect and be affected by the world around it.&lt;br /&gt;
&lt;br /&gt;
== Simple stages ==&lt;br /&gt;
&lt;br /&gt;
{{sidebox|&lt;br /&gt;
* Stages define where characters stand and how the camera is positioned during a conversation&lt;br /&gt;
* A conversation without a stage will use a basic default camera positioning&lt;br /&gt;
* You need to define a stage for a conversation before you can give the actors animations&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
If you run through the conversation as it currently exists you'll find that all of the mechanics are there, but that the performance of our virtual actor leaves a lot to be desired - he simply stands there silent and motionless, staring at the player. The camera angle is also somewhat bland. This can be remedied by adding a [[stage]] to perform the conversation in.&lt;br /&gt;
&lt;br /&gt;
A stage is a set of locations where the participants in a conversation will be positioned, and locations where various cameras will be placed. Create a new stage resource and name it something informative, such as hut_exterior_quest_giver. You'll be presented with an empty, featureless stage. The stage editor window defaults to having four different views of the stage; if you want to change this you can find the setting for this under the &amp;quot;Tools-&amp;gt;Options&amp;quot; menu.&lt;br /&gt;
&lt;br /&gt;
{{sidebox|&lt;br /&gt;
* &amp;quot;place&amp;quot; objects are spots where the conversation's participants will stand&lt;br /&gt;
* The identity of the creatures occupying places is set in the conversation editor&lt;br /&gt;
* Each place should have a default camera selected. This camera is used by default when the creature occupying that place is talking.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Stages can be complex but in this case we'll keep it simple. Right-click somewhere near the center of the stage and insert a &amp;quot;place&amp;quot; object, and then again to insert a second &amp;quot;place&amp;quot; object. You'll create two blank-looking yellow figurines. These figurines will represent the two creatures who will be involved in the conversation, the player and the quest giver. You'll want to turn one of them to face the other and put them relatively close together.&lt;br /&gt;
&lt;br /&gt;
You'll then want to insert a camera for the conversation to use. Right-click, select insert, and select camera. Position the camera so that it has a view over the shoulder of one of the two figures and is looking at the other figure, a standard over-the-shoulder shot. You can adjust the camera more easily by setting one of the four views to be the camera's view; right-click on the frame, go down to the &amp;quot;camera&amp;quot; option, and select which of the cameras the frame should provide the view of. You can also select the &amp;quot;Safe Frame&amp;quot; option, which puts a border on the view showing only what will be visible in-game.&lt;br /&gt;
&lt;br /&gt;
[[Image:Stage tutorial 1.png]]&lt;br /&gt;
&lt;br /&gt;
For each place you'll want to define a default camera; this is the camera that will be used to view the creature standing in this place when that creature is talking in the game. Select the place and in the object inspector select &amp;quot;camera1&amp;quot; for the default camera.&lt;br /&gt;
&lt;br /&gt;
If you wish, you can put in additional cameras. In the conversation editor you will have options to select which cameras are active, and even to cut from one camera to another in the middle of a line. We won't do that yet, however; we currently want this to be as simple a stage as possible. A future tutorial will cover stages in more depth.&lt;br /&gt;
&lt;br /&gt;
{{sidebox|&lt;br /&gt;
* Once a stage resource is created, it must then be placed in the area editor&lt;br /&gt;
* Place the stage so that the conversation's participants won't have to be moved far&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Once the stage has been created, we'll need to place it in the area where the conversation is to take place. Open the hut exterior area in the area editor and go to the location where you've placed the Quest Giver. Find the stage in the resource palette, place it in the area, and you'll see the blank figures and the camera appear. There will also be a red flag similar to a [[waypoint]]; this marks the center of the stage and is useful for distinguishing them when there are many stages overlapping each other in an area. Position the stage so that the place where the quest giver will be standing is approximately where he is right now; it doesn't have to be exact, but if he changes location dramatically when the conversation starts it might be a bit jarring.&lt;br /&gt;
&lt;br /&gt;
[[Image:Stage tutorial 2.png]]&lt;br /&gt;
&lt;br /&gt;
{{sidebox|&lt;br /&gt;
* Assign the stage to the conversation in the conversation editor&lt;br /&gt;
* Then assign which conversation participants use which places defined by the stage&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Now that the stage has been placed, we can set the conversation to use it. Go back to the conversation editor, select the root node, and then select the &amp;quot;Cinematics&amp;quot; tab. There will be an option there to set a stage. Since we've never selected this stage before it won't be in the dropdown list, use the ellipsis button to select the stage from the available stage resources.&lt;br /&gt;
&lt;br /&gt;
Once the stage has been selected the two places that are part of the stage will be listed below. You'll want to assign them to the two participants in this conversation, OWNER and PLAYER.&lt;br /&gt;
&lt;br /&gt;
[[Image:Conversation tutorial 7.png]]&lt;br /&gt;
&lt;br /&gt;
== Gestures ==&lt;br /&gt;
&lt;br /&gt;
{{sidebox|&lt;br /&gt;
* Once a stage is set you can automatically generate gestures&lt;br /&gt;
* To generate gestures for all nodes in a conversation, select the root node and generate gestures for children&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Select the root node of the conversation and then click on the &amp;quot;Generate Gestures for Children&amp;quot; button (#35 on the toolbar, or in the right-click menu for the node, or in the edit menu)&lt;br /&gt;
&lt;br /&gt;
[[Image:Conversation toolbar.png]]&lt;br /&gt;
&lt;br /&gt;
This will run through all of the nodes beneath root and automatically generate some random gestures appropriate for a man standing and talking to someone. These gestures can be customized and fine-tuned, but this will be the subject of a separate tutorial.&lt;br /&gt;
&lt;br /&gt;
Now at last our actors are a little less wooden; they move around a bit, and the camera is in an interesting place. But their faces are still completely blank. This too can be easily remedied.&lt;br /&gt;
&lt;br /&gt;
== Voice-over and FaceFX ==&lt;br /&gt;
&lt;br /&gt;
{{sidebox|&lt;br /&gt;
* You need to have voice-over recorded to generate a facial performance with FaceFX.&lt;br /&gt;
* You can generate a basic placeholder voice-over automatically.&lt;br /&gt;
* See [[Voice-Over]] for information on how to record your own voice over.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Every line of dialog in Dragon Age can have [[voice-over]] recorded for it, which as one might imagine can be a daunting task. As a temporary measure during game development you can instead generate a temporary placeholder voice-over using a basic speech synthesis program. Under &amp;quot;Tools&amp;quot; select &amp;quot;Generate VO&amp;quot; and synthesized voice-over will be added to every line.&lt;br /&gt;
&lt;br /&gt;
[[Image:Conversation generate VO.png]]&lt;br /&gt;
&lt;br /&gt;
The synthesized voice over is very primitive, but it allows you to test the conversation and fine-tune other details without having to record voice as you go - you can leave voice recording until later, once you've finalized all the dialog. It also allows us to generate a facial performance using [[FaceFX]].&lt;br /&gt;
&lt;br /&gt;
[[Image:Conversation generate FaceFX.png]]&lt;br /&gt;
&lt;br /&gt;
The most obvious component of facial performance is lip-synching. FaceFX generates lip-synching from the actual audio of the line, not just from the text of the dialog, so voice over needs to be generated before FaceFX can be run. FaceFX also adds emotional cues to the character's expression using an extension called RoboBrad. You can select the emotion to be added from the &amp;quot;Emotion&amp;quot; field in the cinematics tab for each line of dialog.&lt;br /&gt;
&lt;br /&gt;
[[Image:Conversation cinematics.png]]&lt;br /&gt;
&lt;br /&gt;
Once you've generated a facial performance, you can fine-tune it by selecting &amp;quot;Edit FaceFX&amp;quot; from the tools menu. This will open FaceFX with the selected line of dialogue loaded. We won't be doing this in this tutorial, but if you want to try it out and see what options FaceFX provides see the [[FaceFX]] page for more detail.&lt;br /&gt;
&lt;br /&gt;
[[Image:Conversation edit FaceFX.png]]&lt;br /&gt;
&lt;br /&gt;
To record your own [[voice-over]], you'll need some method for recording your voice (Windows comes with a basic sound-recording program but other more sophisticated programs are available free for download as well) as a wav file. The wav file must be recorded in or converted to PCM 24 khz 16 bit mono format, otherwise the process will fail and an unhelpful error message will be displayed.&lt;br /&gt;
&lt;br /&gt;
Real vo needs to be stored in ~installpath~\Dragon Age\addins\[moduleuid]\module\override\toolsetexport\[lineid]_m.wav - you can dump wav files anywhere under the toolsetexport directory and they will be picked up but for organizational purposes you should probably organize it into subfolders grouped by conversation.&lt;br /&gt;
&lt;br /&gt;
The wav file's filename must be of the form &amp;quot;[lineid]_m.wav&amp;quot; with [lineid] replaced by the ID number for the conversation line's string table entry. For example, if a conversation's line ID number is 344169, you'd save the voice over for this line as &amp;quot;344169_m.wav&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
When you select &amp;quot;generate vo&amp;quot; from the toolset, the toolset will first check the above directory for properly named files. Any wav files that are not present will have robo vo created, and any that do exist will be used as-is.&lt;br /&gt;
&lt;br /&gt;
A quick way to verify that voice over generation worked after processing: go to ~installpath~\Dragon Age\addins\[moduleuid]\core\override\toolsetexport\[conversationname].fsb and play it with windows media player. You will hear all of the vo lines for that conversation packaged together with whatever combination of real and robo vo all slapped together in one file.&lt;br /&gt;
&lt;br /&gt;
Note that when you are doing a [[Builder_to_player]] create, you do not need to include the .wav files within the package. The sound used by the game is all stored in the .fsb files, and thus including the .wav files will only unnecessarily increase the size of mod.&lt;br /&gt;
&lt;br /&gt;
== Common Problems ==&lt;br /&gt;
=== Conversation history not showing up in the player's journal ===&lt;br /&gt;
The journal has a conversation history tab that you'll want your dialogue lines to show up in as well. If that doesn't seem to be working right or at all, make sure you [[Check_in | check your dialogue and creatures back in]] before exporting your [[Talk_table | talk table]]. See the section on [[String_editor#Generated string IDs | generated string IDs]] for more information.&lt;br /&gt;
&lt;br /&gt;
[[Category:Conversations]]&lt;br /&gt;
[[Category:Tutorials]]&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Conversation&amp;diff=14626</id>
		<title>Conversation</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Conversation&amp;diff=14626"/>
				<updated>2010-11-12T05:33:08Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: Link to generated string IDs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| style=&amp;quot;float:right;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| {{Resource palette}}&lt;br /&gt;
|-&lt;br /&gt;
| {{Infobox conversation}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Conversations contain lines of dialogue, usually focused on one NPC and the player's interaction with him or her. Each line of dialogue can have the following associated with it:&lt;br /&gt;
*The text of the line, which can be displayed in-game&lt;br /&gt;
*The [[Voice-Over]] (for non-player characters)&lt;br /&gt;
*The speaker's facial performance (lip synching and expression)&lt;br /&gt;
*[[Stage]] information for positioning the actors and cameras in an area (optional, some conversations can occur anywhere and use default staging)&lt;br /&gt;
*[[Cutscene]] cinematics that can potentially override any of the above with more detailed and complex events.&lt;br /&gt;
&lt;br /&gt;
A conversation is usually associated with a [[creature]], which is referred to in the conversation with the &amp;quot;OWNER&amp;quot; tag. They can also be associated with placeables, or simply used as a container for lines of dialogue used in a cutscene.&lt;br /&gt;
&lt;br /&gt;
The main body of the display for this type of object is one or more tree-shaped structures containing all of the lines or actions that can be reached in the course of following this conversation. For example:&lt;br /&gt;
&lt;br /&gt;
[[Image:Conversation tutorial 2.png]]&lt;br /&gt;
&lt;br /&gt;
Red lines are those spoken by NPCs, blue lines are those spoken by the player (usually chosen from a group of alternatives). Grey lines are lines that are 'linked' to other lines, allowing the flow of the conversation to jump to other branches or repeat itself if needed.&lt;br /&gt;
&lt;br /&gt;
Below the main display is a tabbed pane containing options that can be set on a line-by-line basis.&lt;br /&gt;
&lt;br /&gt;
== Global Settings ==&lt;br /&gt;
&lt;br /&gt;
The global settings tab is only present when the root node of the entire conversation is selected. This is where one can set defaults for who is listening and who is talking (in conversations with more than two individuals you'll need to override these defaults on a line-by-line basis as needed).&lt;br /&gt;
&lt;br /&gt;
You can also set a number of flags involved in cinematic effects:&lt;br /&gt;
*Lock all gestures&lt;br /&gt;
*Lock all poses&lt;br /&gt;
*Lock all RoboBrad&lt;br /&gt;
*Lock all cameras&lt;br /&gt;
*Ambient Soundset Type&lt;br /&gt;
&lt;br /&gt;
Also available in the root node are a simplified plot and scripting tab (see below for details) that allows you to modify plot flags and trigger scripts when the conversation ends; this is helpful for preventing errors and saving time when crafting a conversation that is always supposed to have the same effect on the world when it's over but that has many different conversation end nodes scattered throughout it.&lt;br /&gt;
&lt;br /&gt;
The cinematics tab of the root node allows default cinematics information to be set, which is inherited by the rest of the nodes in the conversation unless overridden.&lt;br /&gt;
&lt;br /&gt;
Finally, the root node has a conversation synopsis text field where a summary of the content and purpose of the conversation can be placed for ease of reference.&lt;br /&gt;
&lt;br /&gt;
== Dialogue ==&lt;br /&gt;
&lt;br /&gt;
[[Image:Conversation dialog.png]]&lt;br /&gt;
&lt;br /&gt;
This tab contains the string of text that is displayed to the player when this node in the tree is reached.&lt;br /&gt;
&lt;br /&gt;
At the lower left corner are some statistics for this line and for the conversation it's a part of.&lt;br /&gt;
&lt;br /&gt;
*Player Response Length Maximum: 60 characters &lt;br /&gt;
*NPC Response Length Maximum: 200 characters&lt;br /&gt;
&lt;br /&gt;
There is also a limit of six lines of player responses displayed for any particular line of NPC dialogue. If there are more than six responses available to be shown, only the first six will be visible.&lt;br /&gt;
&lt;br /&gt;
Also in the lower left corner is the string ID for this line of dialog, which is used when recording voice over audio. Don't forget to [[String_editor#Generated string IDs | check the dialogue resource back in]] before exporting your talk tables, or else the conversation history in the player's journal won't be correct.&lt;br /&gt;
&lt;br /&gt;
=== Formatting tags ===&lt;br /&gt;
&lt;br /&gt;
==== Emphasis tags ====&lt;br /&gt;
&lt;br /&gt;
To indicate that a word in spoken text is emphasized, use &amp;amp;lt;emp&amp;amp;gt; tags. In subtitles, text inside the tags will be bolded.&lt;br /&gt;
&lt;br /&gt;
For example: &amp;quot;I don't &amp;amp;lt;emp&amp;amp;gt;think&amp;amp;lt;/emp&amp;amp;gt; so.&amp;quot; appears in-game as: &amp;quot;I don't '''think''' so.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
==== Description tags ====&lt;br /&gt;
&lt;br /&gt;
Description &amp;amp;lt;desc&amp;amp;gt; tags are used in three ways: 1) To set apart a non-spoken sound (NPC lines), 2) To describe action that is not voiced (player lines), 2) To indicate that a persuade line is a lie or charm (player lines), 3) For text that describes an object (object lines). &lt;br /&gt;
&lt;br /&gt;
In subtitles, text inside &amp;amp;lt;desc&amp;amp;gt; tags will be italicized and put into parentheses.&lt;br /&gt;
&lt;br /&gt;
1) Unspoken sounds (such as a sigh, sob, or grunt of pain) - NPC lines only. &lt;br /&gt;
&lt;br /&gt;
Write out the sound, not a description of the sound. &lt;br /&gt;
* Incorrect: &amp;quot;No! Please don't kill me! &amp;amp;lt;desc&amp;amp;gt;gurgling sound as she is stabbed&amp;amp;lt;/desc&amp;amp;gt;&lt;br /&gt;
* Correct: &amp;quot;No! Please don't kill me! &amp;amp;lt;desc&amp;amp;gt;Aaargh!&amp;amp;lt;/desc&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;If only... &amp;amp;lt;desc&amp;amp;gt;sigh&amp;amp;lt;/desc&amp;amp;gt; Alas, it cannot be.&amp;quot; appears in-game as: &amp;quot;If only... ''(sigh)''' Alas, it cannot be.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
2) Persuade lines that need to be marked as &amp;quot;lie&amp;quot; or &amp;quot;charm&amp;quot; - player lines only: When a line that has been flagged in the toolset as a &amp;quot;Persuade&amp;quot; line needs to me marked as a specific &amp;quot;lie&amp;quot; or &amp;quot;charm&amp;quot;, write Lie or Charm at the line's beginning. Then, use &amp;amp;lt;desc&amp;amp;gt; tags around that word so that it will be set off from the rest of the line.&lt;br /&gt;
For example: &amp;amp;lt;desc&amp;amp;gt;Lie&amp;amp;lt;/desc&amp;amp;gt; &amp;quot;Of course I didn't report you to the authorities.&amp;quot; appears in-game as: &amp;quot;''(Lie)'' Of course I didn't report you to the authorities.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
3) Text that describes an object - Object lines only: When a line is created to describe an inanimate object, such as a bookcase or chest, descriptive lines for that object should be marked with &amp;amp;lt;desc&amp;amp;gt; tags. The writer creates a &amp;quot;character&amp;quot; in the toolset (&amp;quot;bhm700_bookcase&amp;quot;), and writes a line to describe that object. For example, &amp;amp;lt;desc&amp;amp;gt;This bookcase is full of dusty, moldering books.&amp;amp;lt;/desc&amp;amp;gt; or &amp;amp;lt;desc&amp;amp;gt;The phylactery is warm to the touch and filled with a small amount of viscous, red liquid. You see no way to open it.&amp;amp;lt;/desc&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Correct: &amp;amp;lt;desc&amp;amp;gt;This bookcase is full of dusty, moldering books.&amp;amp;lt;/desc&amp;amp;gt;&lt;br /&gt;
All such text should be written in third-person, present tense, with the player always referred to as &amp;quot;you&amp;quot;. &lt;br /&gt;
* Incorrect: &amp;amp;lt;desc&amp;amp;gt; The phylactery is warm to the touch and filled with a small amount of viscous, red liquid. I can't see any way to open it.&amp;amp;lt;/desc&amp;amp;gt; &lt;br /&gt;
* Correct: &amp;amp;lt;desc&amp;amp;gt;The phylactery is warm to the touch and filled with a small amount of viscous, red liquid. You see no way to open it.&amp;amp;lt;/desc&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
The tech designer will need to create a placeable in the appropriate area. The character for that placeable should be set as &amp;quot;null&amp;quot;. (This indicates that no VO recording is needed for that line.) It should also be set to appear on the screen even if subtitles are turned off by default.&lt;br /&gt;
&lt;br /&gt;
==== Action Tags ====&lt;br /&gt;
&lt;br /&gt;
Action tags &amp;amp;lt;act&amp;amp;gt; describe player action. In subtitles, text inside &amp;amp;lt;act&amp;amp;gt; tags will be italicized and put into parentheses.&lt;br /&gt;
&lt;br /&gt;
For example: &amp;quot;If that's the way you want it. &amp;amp;lt;act&amp;amp;gt;Kill the soldier.&amp;amp;lt;/act&amp;amp;gt;&amp;quot; appears in-game as: &amp;quot;If that's the way you want it. ''(Kill the soldier.)''&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Incorrect: {Owner}: &amp;quot;Here. Take this. &amp;amp;lt;act&amp;amp;gt; Opens chest, removes sword.&amp;amp;lt;/act&amp;amp;gt; It was your father's.&amp;quot; &lt;br /&gt;
&lt;br /&gt;
=== Macros ===&lt;br /&gt;
&lt;br /&gt;
The &amp;amp;lt;FirstName/&amp;amp;gt; macro will be replaced with the first name entered by the player for his character. Since the player character's name can be anywhere up to 20 characters long, player lines using the &amp;amp;lt;FirstName/&amp;amp;gt; macro can only have 40 characters (not including the macro itself).&lt;br /&gt;
&lt;br /&gt;
Macros are used fairly rarely in Dragon Age since voiceovers accompany most lines and cannot be modified to match lines with variable text.&lt;br /&gt;
&lt;br /&gt;
=== Other settings ===&lt;br /&gt;
&lt;br /&gt;
Also on this tab are some additional flags and tags that can be set for this line.&lt;br /&gt;
*Skill/Icon - allows an icon to be placed next to this line indicating that a skill must be used when the line is selected by the player&lt;br /&gt;
*Speaker Tag and Listener Tag - defines which character is the speaker and which is the listener (can be set to default)&lt;br /&gt;
*Language - defines which language the line is spoken in.&lt;br /&gt;
*Fast Path - Any line with &amp;quot;Fast Path&amp;quot; set will be the first option presented to a player when they reach this conversation node. This can be useful if you want to provide an easy way to blow through the conversation tree without having to read it; if you mark the shortest path through the tree with this flag the player will only have to tap the &amp;quot;1&amp;quot; key to pass through it. You can also do this without the fast path flag by arranging your conversation nodes in the correct order, but restructuring an entire conversation tree for this purpose is a more complex task.&lt;br /&gt;
&lt;br /&gt;
== Plots and Scripting ==&lt;br /&gt;
&lt;br /&gt;
See [[conversation plots and scripting]] for details on how to use plots and scripts to make certain lines of dialog &amp;quot;conditional&amp;quot; (appearing or not appearing based on conditions in the game) and how to have certain lines cause scripted actions and change plot flags.&lt;br /&gt;
&lt;br /&gt;
This tab also includes an option to easily set a line so that it appears to a player only once (either once per conversation or once per game).&lt;br /&gt;
&lt;br /&gt;
== Cinematics and Animation ==&lt;br /&gt;
&lt;br /&gt;
See [[conversation cinematics and animation]] for details of how to control the performance of your virtual actors. Conversations without cinematic direction set for them will use a default over-the-shoulder camera style that's serviceable for most conversations, but which might become dull when used for all of them. Adding some animation and varying the camera angles can go a long way to spicing up a conversation, and for special events you can add much more than that - even integrating full-blown cutscenes into the middle of a conversation.&lt;br /&gt;
&lt;br /&gt;
== Localization and Editing ==&lt;br /&gt;
&lt;br /&gt;
These two panels are used for keeping track of the status of the localization and editing process for this line. This is useful for large-scale collaborative projects, such as Dragon Age itself, but may not be of as much use for individual adventure designers.&lt;br /&gt;
&lt;br /&gt;
== Slide Show ==&lt;br /&gt;
&lt;br /&gt;
The Slide Show tab is used to produce a simple form of &amp;quot;cutscene&amp;quot; that consists of one or more pre-rendered still images. For example, the official DAO campaign ends with a slideshow that describes the aftermath.&lt;br /&gt;
&lt;br /&gt;
Images used in a slide show can be in [[TGA]], [[TPC]] or [[DDS]] format.&lt;br /&gt;
&lt;br /&gt;
Each image must be on its own NPC conversation line. The Dialogue text isn't used in game, but it must contain something (e.g. &amp;quot;Slideshow&amp;quot;), otherwise the slide won't appear. &lt;br /&gt;
&lt;br /&gt;
As usual, the NPC lines are connected by player lines (which don't need any Dialogue text).          &lt;br /&gt;
&lt;br /&gt;
See [[BeginSlideshow]] for the script function that triggers a slideshow.&lt;br /&gt;
&lt;br /&gt;
== Toolbars ==&lt;br /&gt;
&lt;br /&gt;
[[Image:Conversation toolbar labeled.png]]&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Find links&amp;quot; generates a list of other places in the tree that have this line as their child. See the &amp;quot;looping conversations and re-using lines&amp;quot; section below.&lt;br /&gt;
*The highlighting toolbar is handy for rapidly finding and paging through conversation nodes with particular properties. There's forward and backward buttons for jumping from highlighted node to highlighted node, and a set of togglable highlight selection buttons that turn on and off highlighting based on node characteristics. &lt;br /&gt;
* &amp;quot;Once-per&amp;quot; lines include both once-per-conversation and once-per-game&lt;br /&gt;
* Highlighting lines with plot involvement will prompt you to select which particular plot to highlight.&lt;br /&gt;
&lt;br /&gt;
== Looping conversation and re-using lines in multiple places ==&lt;br /&gt;
&lt;br /&gt;
Although the basic structure is tree-shaped, the flow of the conversation can be structured to return back to previous nodes in the conversation. To cause a node in the tree to repeat:&lt;br /&gt;
&lt;br /&gt;
*select the node you want to return to,&lt;br /&gt;
*&amp;quot;Copy&amp;quot; it (control-C, or select copy from the right-click menu),&lt;br /&gt;
*select the node you want the repeated response to be a child of,&lt;br /&gt;
*select &amp;quot;Paste as link&amp;quot; from the right-click menu (keyboard shortcut: control-shift-V)&lt;br /&gt;
&lt;br /&gt;
The link node will appear in gray and cannot be edited. If you edit the original copy of the node all linked copies will reflect the change. You can only link nodes that have the same type (player/non-player), the paste-as-link option won't be available if the node currently saved to the clipboard can't be linked to a child of the currently selected node.&lt;br /&gt;
&lt;br /&gt;
To find the original copy of a linked node, right-click on the grey node and select &amp;quot;Jump to Target&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Using the &amp;quot;once per conversation&amp;quot; or &amp;quot;once per game&amp;quot; visibility setting for the children of a repeating node is useful for preventing the player from cycling multiple times through the exact same dialogue.&lt;br /&gt;
&lt;br /&gt;
== Voice-Over ==&lt;br /&gt;
&lt;br /&gt;
You can use both placeholder and real recorded voiceover in your conversation, depending on what your current status on the conversation is. After you have some sort of voiceover associated to your conversation, you may run &amp;quot;Tools-&amp;gt;Generate [[FaceFX]]&amp;quot; to add a facial expression to the NPCs performance.&lt;br /&gt;
&lt;br /&gt;
All information about [[Voice-Over]] (conventions, integration, etc.) is stored at a another page to keep a central organized structure.&lt;br /&gt;
&lt;br /&gt;
== Glossary of design terms ==&lt;br /&gt;
&lt;br /&gt;
* Branch: A dialogue option that adds flavor to a conversation, but doesn't change the direction of the plot or story. Branches always come back together at a choke point.&lt;br /&gt;
* Clarification Hub: This allows a player to return to an NPC and clarify plot elements, get directions, or find out information about the current area. Generally, an single NPC line asks the player what he wants; a list of questions is then available to the player. Once the player has received an answer, the same list reappears (minus the question just asked). The player can loop infinitely through this NPC dialogue. &lt;br /&gt;
* Path: The dialogue options players can select that change the direction of a plot or story. For example, when a player is given the option of accepting a quest, there are two different resulting paths (based on a &amp;quot;Yes&amp;quot; or &amp;quot;No&amp;quot; answer). Unlike branches, paths never come back together. Each path has a different ending condition. &lt;br /&gt;
* Question Hub: A list of questions presented to a player that allows him to ask multiple questions to clarify information he's just learned. After a response is given, the player can ask the remaining questions. It's possible to loop indefinitely through a question hub, but only by asking non-critical questions. Unlike a clarification hub, at least one question drives the conversation tree forward and eliminates all remaining questions. For example, an NPC gives plot critical information; once she relates the details, the player can ask four specific questions. Three of the questions are non-critical: they give flavor and/or enhance role-playing. These questions allow for infinite looping. However, the fourth question drives the conversation forward and eliminates all other questions. This important question should always be located beneath the &amp;quot;lesser&amp;quot; questions.&lt;br /&gt;
&lt;br /&gt;
== Associated Links ==&lt;br /&gt;
&lt;br /&gt;
*[[Conversation cinematics and animation]]&lt;br /&gt;
*[[Conversation plots and scripting]]&lt;br /&gt;
*[[Conversation tutorial]]&lt;br /&gt;
*[[Voice-Over]]&lt;br /&gt;
*[[Preparing a dialog for recording]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Conversations]]&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=String_ID&amp;diff=14625</id>
		<title>String ID</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=String_ID&amp;diff=14625"/>
				<updated>2010-11-12T05:26:40Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: Link to generated string ids&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;For consistency and ease of localization, Dragon Age makes extensive use of a table of string constants called a '''talk table'''. Each string constant in the talk table has an associated [[integer]] '''string ID'''.&lt;br /&gt;
&lt;br /&gt;
Many of the tools in the toolset make automatic usage of the talk table. For example, the lines of dialogue in [[conversation]]s or the descriptions of [[item]]s are [[String_editor#Generated string IDs | automatically converted]] into talk table strings and stored there. In [[script]]ing, however, you will often come upon situations where string IDs need to be explicitly referenced, and you may need to add strings to the talk table manually. The [[string editor]] is the tool used for this purpose.&lt;br /&gt;
&lt;br /&gt;
You may also use [[string]] literals in scripting if you aren't concerned with localization to different languages.&lt;br /&gt;
&lt;br /&gt;
== Sharing between Builders ==&lt;br /&gt;
&lt;br /&gt;
When loading a [[builder to builder]] package, you will have the option of keeping the string ID numbers of the loaded resources the same or of assigning new string ID numbers to them. The toolset's behavior when handling of this option is currently being changed to deal with problems that have been caused by conflicts between imported and existing string IDs, but for now the safest approach is to generate new string IDs.&lt;br /&gt;
&lt;br /&gt;
Normally, it's not a good idea for two builders to work with the same string ID range, because conversations and other resources they make will use the same string ids for different text, resulting in conflict in the Builder-to-Builder process.&lt;br /&gt;
&lt;br /&gt;
However, VO and FaceFX files are not renumbered to the new string IDs by the Builder-to-Builder load (because they are art resources), so loading a conversation to a new string ID range causes these features to fail. The choices are&lt;br /&gt;
&lt;br /&gt;
* Generate VO and FaceFX after Builder-to-Builder.&lt;br /&gt;
* Renumber the VO and FaceFX files to match the new string IDs in the conversation.&lt;br /&gt;
* If the target builder is only working on cutscenes (or other aspects that don't generate new strings), consider the Use Theirs option for string IDs. In view of a known [[Bug:_Builder_to_Builder_Load_may_not_reproduce_resource_detail_correctly | bug]], the target module's string id range probably needs to be identical to the source module for this to work. Copying the module.cif file across first achieves this.&lt;br /&gt;
&lt;br /&gt;
[[Category:Data types]]&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=String_editor&amp;diff=14624</id>
		<title>String editor</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=String_editor&amp;diff=14624"/>
				<updated>2010-11-12T05:22:58Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: More warning about needing to check resources back in to update the TLK&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Basics ==&lt;br /&gt;
&lt;br /&gt;
The string editor can be found under the &amp;quot;Tools&amp;quot; menu.&lt;br /&gt;
&lt;br /&gt;
In Dragon Age, all strings of text that could be seen by the user are stored in a separate table and are refered to by resources by their [[string ID]] number. This makes tasks such as spell checking, translation to other languages, and so forth much easier - all of the text that might need this is all stored in one easy-to-process place, and the game can be localized by simply swapping in a substitute talk table.&lt;br /&gt;
&lt;br /&gt;
The string editor is a basic means of accessing this collection of strings.&lt;br /&gt;
&lt;br /&gt;
Of course, strings associated with resources can often be edited in the object inspector, but viewing strings en masse is sometimes convenient, especially when engaged in global activities like trying to remove Ferelden lore from core descriptions. &lt;br /&gt;
&lt;br /&gt;
IMPORTANT - all objects must be checked in if you want to see the latest text. See [[String_editor#Generated string IDs | Generated string IDs]] for more details.&lt;br /&gt;
&lt;br /&gt;
[[Image:String editor main screen.png]]&lt;br /&gt;
&lt;br /&gt;
At the top of the main screen is a set of options to help winnow down the displayed strings to just the set that you want to work with. First you will need to identify which string table you want to edit; this table is generated on a per-module basis, so select the table that's been generated for your module.&lt;br /&gt;
&lt;br /&gt;
If you want to access a single string that you know the ID for, such as a line in a conversation, you can enter it into the &amp;quot;String ID&amp;quot; field to bring it up immediately. (To find the string ID for a line in a conversation, look in the lower left corner of that line's Dialogue tab in the conversation editor).&lt;br /&gt;
&lt;br /&gt;
If you want to load the entire string table into the editor's string display, ensure that the filter button reads &amp;quot;Filter: Off&amp;quot; and check the &amp;quot;Do NOT use Filter&amp;quot; checkbox.&lt;br /&gt;
&lt;br /&gt;
If you aren't sure where the line is, or if you want to look at a whole class of lines, you can filter the displayed list of strings on a wide variety of criteria. Click on the &amp;quot;Filter: Off&amp;quot; button and you'll be presented with a screen where you can add filters:&lt;br /&gt;
&lt;br /&gt;
[[Image:String editor filters.png]]&lt;br /&gt;
&lt;br /&gt;
For a string to pass the filters all conditions have to evaluate true - they are &amp;quot;AND&amp;quot; conditions.&lt;br /&gt;
&lt;br /&gt;
There seems to be a bug - both &amp;quot;Contains&amp;quot; and &amp;quot;Is Exactly&amp;quot; sometimes only return a match if you enter the entire string you're searching for. The workaround seems to be to do a successful &amp;quot;Is Exactly&amp;quot; search, after which &amp;quot;Contains&amp;quot; works as expected.&lt;br /&gt;
&lt;br /&gt;
Once you've found the string you're interested in editing, double-click to open it:&lt;br /&gt;
&lt;br /&gt;
[[Image:String editor edit string.png]]&lt;br /&gt;
&lt;br /&gt;
When finished, use Tools &amp;gt; Export &amp;gt; Export String Table then Tools &amp;gt; Export &amp;gt; Export Talk Table so that the results are available in game.&lt;br /&gt;
&lt;br /&gt;
Owing to a [[Bug:_export_creates_unnecessary_core_override | bug]], remove the spurious talk table from \packages\core\overide when this is done.&lt;br /&gt;
&lt;br /&gt;
== Generated string IDs ==&lt;br /&gt;
&lt;br /&gt;
It is important to eventually check resources back in so that the toolset will automatically update or assign string IDs to certain text entries you've written - such as conversation entries, or the names and descriptions of placeables or creatures. Once available, they'll show in the string table as string type &amp;quot;Exported &amp;lt;type&amp;gt; text&amp;quot;. Even though it may seem unnecessary as the tlkstring contains the original text, some strings are referenced in the game by their string ID alone, such as the conversation history in the player's journal.&lt;br /&gt;
&lt;br /&gt;
== Creating a string with a specific ID ==&lt;br /&gt;
&lt;br /&gt;
When a string is created, its id is determined automatically by incrementing the String ID Last Used field in the [[Module#Properties | module properties]]. &lt;br /&gt;
&lt;br /&gt;
Occasionally, it is necessary to use a different range (for example, owing to a [[Backgrounds_tutorial#Creating_the_background_strings | bug]], smaller numbers are required for some GUI functions).&lt;br /&gt;
&lt;br /&gt;
This can be achieved by temporarily changing the String ID Begin and String ID Last Used module properties to one less than the required number.&lt;br /&gt;
&lt;br /&gt;
It's wise to back up the data base and make a careful note of the original module properties before attempting this!&lt;br /&gt;
&lt;br /&gt;
== Editing a checked-out string ==&lt;br /&gt;
&lt;br /&gt;
The string editor will not allow a string to be edited if it is checked out.&lt;br /&gt;
&lt;br /&gt;
For strings associated with campaign resources, this is easily resolved, by checking in the resource.&lt;br /&gt;
&lt;br /&gt;
Doing this for core resources is dangerous and should be avoided. Such changes affect all campaigns, which is not helpful to players or other builders. For some reason, the toolset does not allow string changes to be local to the module if they belong to a core resource. A safer technique is to duplicate the core resource into the module (with a new resource name) then edit it. There can be repercussions - some systems (e.g. treasure, recipes) refer to core resource names explicitly. Other aspects (e.g. recipe ingredients) are tag-based, so they will work with the new item as long as you don't change the tag.&lt;br /&gt;
&lt;br /&gt;
Certain core strings are associated with system components (e.g. GUI) which cannot be duplicated or checked in. The normal procedure in such cases is to create a new string, then change the corresponding 2DA to use the new string id (for an example, see [[Backgrounds_tutorial#Creating_the_background_strings | Background Tutorial]]). &lt;br /&gt;
&lt;br /&gt;
There are rare instances in which even this cannot be done, because the string id is hard-coded in the game (for example, the gender description used in Character Generation). See next section for a solution.&lt;br /&gt;
&lt;br /&gt;
== Editing a string with a specific ID ==&lt;br /&gt;
&lt;br /&gt;
To edit a string whose id is outside of the normal range for the module, change the String ID Begin module property temporarily to a value which is less than the string id in question (but not zero).&lt;br /&gt;
&lt;br /&gt;
The string will no longer be regarded as checked out, and can be edited.&lt;br /&gt;
&lt;br /&gt;
When customising a core string, change the Owner Module to the current module, and the Table to the current module's talk table. Otherwise, the custom string will override all campaigns.  &lt;br /&gt;
&lt;br /&gt;
It's wise to back up the data base and make a careful note of the original module properties before attempting this!&lt;br /&gt;
&lt;br /&gt;
Sadly, as previously noted, while the toolset allows this technique on core gameplay strings, including the GUI, it will not permit the current module to have a local version of a core resource description.  &lt;br /&gt;
&lt;br /&gt;
[[Category:Designer resources]]&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=2DA_ranges_in_use&amp;diff=14444</id>
		<title>2DA ranges in use</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=2DA_ranges_in_use&amp;diff=14444"/>
				<updated>2010-11-06T15:51:01Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: /* M2DA_base */  custom loading screen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page is meant to enumerate row ID ranges that are used by the main game and by various popular addins, to avoid accidental overlap. See also [[Prefixes in use]] and [[Compatibility]].&lt;br /&gt;
&lt;br /&gt;
Note that there's no need for 2DA row IDs to be sequential, so you can use very large row ID numbers to reduce the chances of collision.&lt;br /&gt;
&lt;br /&gt;
Version 1.0 of the toolset had a bug in ExcelProcessor that caused problems with high row ID numbers, but this has been fixed in subsequent releases. See [[Bug: ExcelProcessor doesn't handle row IDs above 8.3 million correctly|the bug report]].&lt;br /&gt;
&lt;br /&gt;
As of now there is a bug that prevents ID's above 255 to be used for some M2DA's. Most certainly it is ''&amp;quot;only&amp;quot;'' [[ItemVariations.xls]] related. See [[Bug: High M2DA ID ranges might work in the toolset, but not in game|Bug report]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ABI_base ==&lt;br /&gt;
&lt;br /&gt;
According to the [[ABI_base]] page under the ''tooltipstrref'' column, anything over 500000 is considered a debuff. This would limit the range a fair amount.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 200262'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000 - 38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 50000 - 50001&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/861/ Advanced Tactics]&lt;br /&gt;
|-&lt;br /&gt;
| 51000 - 51002&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/1888/ Advanced Quickbar]&lt;br /&gt;
|-&lt;br /&gt;
| 2560000 - 2560500&lt;br /&gt;
| Timelord's [http://social.bioware.com/project/1845/ Blood and Lyrium]&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680250&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000 - 40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 300000-300047&lt;br /&gt;
| rebel5555's [http://social.bioware.com/project/2646/ 2 Handed Weapon Abilities for Arcane Warriors]&lt;br /&gt;
|-&lt;br /&gt;
| 300000-300047&lt;br /&gt;
| rebel5555's [http://social.bioware.com/project/3637/ Dual Weapon Abilities for Arcane Warriors]&lt;br /&gt;
|-&lt;br /&gt;
| 300000-300047&lt;br /&gt;
| rebel5555's [http://social.bioware.com/project/2644/ Weapon and Shield Abilities for Arcane Warriors]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== AI_TacticsPresets ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 9'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| 10 - 15&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/861/ Advanced Tactics]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
== ambient_ai ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| 1000000-1001000&lt;br /&gt;
| [http://social.bioware.com/project/178/ Crown of Creation]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== ANIM_base ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| 65000 - 65002&lt;br /&gt;
| BioSpirit's [http://social.bioware.com/project/1647/ Hilltop Under Siege]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== APR_base ==&lt;br /&gt;
&lt;br /&gt;
Note that there is a bug involving this 2DA: [[Bug: APR base maximum M2DA row ID is 65535 in the toolset]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 90'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000 - 38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 40000 - 40010&lt;br /&gt;
| [http://social.bioware.com/project/3175/ Horses]&lt;br /&gt;
|-&lt;br /&gt;
| 65000 - 65001&lt;br /&gt;
| BioSpirit's [http://social.bioware.com/project/1647/ Hilltop Under Siege]&lt;br /&gt;
|-&lt;br /&gt;
| 55000 - 57000&lt;br /&gt;
| World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
||-&lt;br /&gt;
| 65010 - 65025&lt;br /&gt;
| Mutantspicy Oracle and Enchanted Armor [Dragonage Nexus]&lt;br /&gt;
|--&lt;br /&gt;
| 1000001 - 1100000&lt;br /&gt;
| DA Workshop / by frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
== armor_massive_variation ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 8'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| 50-50&lt;br /&gt;
| [http://social.bioware.com/project/3666/ Sandbox]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: the highest working tested ID for this variation is 141. See [http://social.bioware.com/wiki/datoolset/index.php/Bug:_High_M2DA_ID_ranges_might_work_in_the_toolset,_but_not_in_game bug report]&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== BITM_base and ItemStats_ ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 30000 - 30500&lt;br /&gt;
| Ambaryerno - [http://social.bioware.com/project/415/ Arms and Armor]&lt;br /&gt;
|-&lt;br /&gt;
| 37000-38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 40000 - 40200&lt;br /&gt;
| DA Workshop / by frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
| 57000-59000&lt;br /&gt;
| [World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 50000 - 50100&lt;br /&gt;
| Feline Fuelled Games - (by Silk) [http://www.felinefuelledgames.de/ Feline Fuelled Games]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== CLA_base ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 25'''&lt;br /&gt;
| '''Bioware&lt;br /&gt;
|-&lt;br /&gt;
| 10000 - 10012&lt;br /&gt;
| Ladydesire&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== crafting_recipe_types ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 7'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680020&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== crafting_recipes ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 91'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680999&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== engineevents ==&lt;br /&gt;
&lt;br /&gt;
Those ranges relates to custom events types/ID and not to engineevents based [[Event_override|events overriding]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 500 - 500&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/861/ Advanced Tactics]&lt;br /&gt;
|-&lt;br /&gt;
| 510 - 511&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/1888/ Advanced Quickbar]&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680050&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== guitypes ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 600 - 600&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/861/ Advanced Tactics]&lt;br /&gt;
|-&lt;br /&gt;
| 601 - 601&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/1888/ Advanced Quickbar]&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 2560000 - 2560050&lt;br /&gt;
| Timelord's [http://social.bioware.com/project/1845/ Blood and Lyrium]&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680010&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
== Heraldry ==&lt;br /&gt;
There is a [[Bug:_High_M2DA_ID_ranges_might_work_in_the_toolset,_but_not_in_game | bug]] with this table. The range 0-255 is known to work.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 1000001 - 1001000&lt;br /&gt;
| [http://social.bioware.com/project/178/ Crown of Creation] (using 201 onwards temporarily) &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== itemprps ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 10022'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000-38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 1000001 - 2000000&lt;br /&gt;
| DA Workshop / by frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680050&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
| 7570000-7770000&lt;br /&gt;
| [World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone]&lt;br /&gt;
|-&lt;br /&gt;
| 536873321 - 536873322&lt;br /&gt;
| Elys' [http://social.bioware.com/project/522/ Mysterious Gifts]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== itemsets ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 30'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680500&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
| 7570000-7770000&lt;br /&gt;
| [World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone]&lt;br /&gt;
|-&lt;br /&gt;
| 1405261000 - 1405261999&lt;br /&gt;
| nezroy - [http://social.bioware.com/project/1834/ Warden Shields], [http://www.dragonagenexus.com/downloads/file.php?id=793 Leliana Item Set]&lt;br /&gt;
|-&lt;br /&gt;
| 1000001 - 2000000&lt;br /&gt;
| DA Workshop / by frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
| 7771000 - 7771500&lt;br /&gt;
| [http://social.bioware.com/project/2157/ Dark Times: The Confederacy of Malkuth] (reserved by Starlight on Questorion's behalf)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== ItemVariations (all) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 30'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000'''&lt;br /&gt;
| '''Bioware - reserved (guessed)'''&lt;br /&gt;
|-&lt;br /&gt;
| 12000 - 12100&lt;br /&gt;
| [http://social.bioware.com/project/1923/ Adonnay's Weaponry] (reserved by mikemike37 on his behalf)&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 101000 - 400000&lt;br /&gt;
| [http://social.bioware.com/project/2157/ Dark Times: The Confederacy of Malkuth] (reserved by Starlight on Questorion's behalf)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
note: ItemVariations are affected by the bug which prevents ID's above 255 from appearing properly in the game. See [[Bug: High M2DA ID ranges might work in the toolset, but not in game|Bug report]].&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== M2DA_base ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1016, 2000 - 2010, 10011 - 10142, ...? '''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 5000 - 5014&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/861/ Advanced Tactics]&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000 - 38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 100000 - 100000&lt;br /&gt;
| Anakin's [http://social.bioware.com/project/1907/ Event Manager]&lt;br /&gt;
|-&lt;br /&gt;
| 690000 - 690100&lt;br /&gt;
| [http://www.dragonagenexus.com/downloads/file.php?id=1617 Karma's Origins Companions]&lt;br /&gt;
|-&lt;br /&gt;
| 1000001 - 1100000&lt;br /&gt;
| DA Workshop / by frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
| 2300000 - 2300100&lt;br /&gt;
| [http://social.bioware.com/project/178/ Crown of Creation] (M2DA prefix: COC)&lt;br /&gt;
|-&lt;br /&gt;
| 2560000 - 2560050&lt;br /&gt;
| Timelord's [http://social.bioware.com/project/1845/ Blood and Lyrium]&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680050&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
| 5680050 - 5680055&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/3185/ Flexible craft UI]&lt;br /&gt;
|-&lt;br /&gt;
| 5681000 - 5681005&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/2896/ DACrafting framework]&lt;br /&gt;
|-&lt;br /&gt;
| 6000000 - 6000050&lt;br /&gt;
| TreDawn - [http://social.bioware.com/project/1750/ Nesiara Companion]&lt;br /&gt;
|-&lt;br /&gt;
| 7000000 - 7000050&lt;br /&gt;
| FtG - [http://social.bioware.com/project/1688/ UI Mod]&lt;br /&gt;
|-&lt;br /&gt;
| 7000051 - 7000055&lt;br /&gt;
| FtG - [http://social.bioware.com/project/3663/ Custom Loading Screen]&lt;br /&gt;
|-&lt;br /&gt;
| 7570000 - 7770000&lt;br /&gt;
| [World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone] &lt;br /&gt;
|-&lt;br /&gt;
| 7777770 - 7777799&lt;br /&gt;
| Magic - [http://social.bioware.com/project/1429/ Void Walker] (M2DA prefix: VWK)&lt;br /&gt;
|-&lt;br /&gt;
| 9000000 - 9000050&lt;br /&gt;
| Ambaryerno - [http://social.bioware.com/project/415/ Arms and Armor]&lt;br /&gt;
|- &lt;br /&gt;
| 30000000 - 40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 1140150041 - 1140150091&lt;br /&gt;
| DLAN_Immortality - [http://social.bioware.com/project/789/ Ser Gilmore NPC]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== materialrules ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000-38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 536873321 - 536873323&lt;br /&gt;
| Elys' [http://social.bioware.com/project/522/ Mysterious Gifts]&lt;br /&gt;
|-&lt;br /&gt;
| 1405261000 - 1405261999&lt;br /&gt;
| nezroy - [http://social.bioware.com/project/1834/ Warden Shields], [http://www.dragonagenexus.com/downloads/file.php?id=793 Leliana Item Set]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== materialtypes ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 88'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000-38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680300&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
| 536873321 - 536873340&lt;br /&gt;
| Elys' [http://social.bioware.com/project/522/ Mysterious Gifts]&lt;br /&gt;
|-&lt;br /&gt;
| 1405261000 - 1405261999&lt;br /&gt;
| nezroy - [http://social.bioware.com/project/1834/ Warden Shields], [http://www.dragonagenexus.com/downloads/file.php?id=793 Leliana Item Set]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== PartyPicker ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 11'''&lt;br /&gt;
| '''Bioware - Main campaign'''&lt;br /&gt;
|-&lt;br /&gt;
| '''????'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 101-199&lt;br /&gt;
| [http://social.bioware.com/project/178/ Crown of Creation]&lt;br /&gt;
|-&lt;br /&gt;
| 200 - 299&lt;br /&gt;
| DA Workshop / Author: frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
| 300 - 350&lt;br /&gt;
| [World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone]&lt;br /&gt;
|-&lt;br /&gt;
| 6900000 - 6900200&lt;br /&gt;
| [http://www.dragonagenexus.com/downloads/file.php?id=1617 Karma's Origins Companions]&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== PRCSCR ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000-38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 690000 - 690100&lt;br /&gt;
| [http://www.dragonagenexus.com/downloads/file.php?id=1617 Karma's Origins Companions]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 10100000&lt;br /&gt;
| Camp [http://social.bioware.com/project/463/ storage chest]&lt;br /&gt;
|-&lt;br /&gt;
| 10100011-10100013&lt;br /&gt;
| Didymos' [http://social.bioware.com/project/2620/ Camp Merchant Chest]&lt;br /&gt;
|-&lt;br /&gt;
| 10100014-10100016&lt;br /&gt;
| Didymos' [http://social.bioware.com/project/2717/ Item Sets Fix]&lt;br /&gt;
|-&lt;br /&gt;
| 10100100-10100110&lt;br /&gt;
| Eshme's [http://social.bioware.com/project/1929/ Sleeping Tent]&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680020&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
| 6000000 - 6000050&lt;br /&gt;
| TreDawn - [http://social.bioware.com/project/1750/ Nesiara Companion]&lt;br /&gt;
|-&lt;br /&gt;
| 7570000-7770000&lt;br /&gt;
| [World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone]&lt;br /&gt;
|-&lt;br /&gt;
| 1140150041 - 1140150091&lt;br /&gt;
| DLAN_Immortality - [http://social.bioware.com/project/789/ Ser Gilmore NPC]&lt;br /&gt;
|-&lt;br /&gt;
| 1672464532 - 1672464542&lt;br /&gt;
| DLAN_Immortality - [http://social.bioware.com/project/2991/ Ser Gilmore NPC Awakening]&lt;br /&gt;
|-&lt;br /&gt;
| 1405261000 - 1405261999&lt;br /&gt;
| nezroy - [http://social.bioware.com/project/1834/ Warden Shields], [http://www.dragonagenexus.com/downloads/file.php?id=793 Leliana Item Set]&lt;br /&gt;
|-&lt;br /&gt;
| 1000001 - 1100000&lt;br /&gt;
| DA Workshop / by frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
| 2000000-2000050&lt;br /&gt;
| [http://www.dragonagenexus.com/downloads/file.php?id=942 Oracle,mutantspicy's magic vault, and other custom armors]&lt;br /&gt;
|-&lt;br /&gt;
| 42006090 - 42006100&lt;br /&gt;
| [http://www.dragonagenexus.com/downloads/file.php?id=1120 Morrigan Restoration Patch]&lt;br /&gt;
|-&lt;br /&gt;
| 1109197751 - 1109197799&lt;br /&gt;
| Schwinni - [http://dragonagenexus.com/downloads/file.php?id=1020 Awakening Runes Fixes], [http://dragonagenexus.com/downloads/file.php?id=1112 Awakening Blackblade Armor Dragon Drop Fix]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== placeable_types ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 14000 - 16000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000-38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 43050-43061&lt;br /&gt;
| Eshme's [http://social.bioware.com/project/1929/ Sleeping Tent]  (Greater 65535 is showing bugs so this is until it is fixed)&lt;br /&gt;
|-&lt;br /&gt;
| 43062-43065&lt;br /&gt;
| BioSpirit's [http://social.bioware.com/project/1647/ Hilltop Under Siege]&lt;br /&gt;
|-&lt;br /&gt;
| 56000-56200&lt;br /&gt;
| [http://social.bioware.com/project/2472/#details Mikes Invisible Boxes]&lt;br /&gt;
|-&lt;br /&gt;
| 2696549 - 2696700&lt;br /&gt;
| PavelNovotny - [http://social.bioware.com/project/517/ Gay Bars of Ferelden] (NOTE: I'm using the 6000-6200 range until Bioware fixes the bug which prevents m2da ID ranges above 900000 from showing up in game.)&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 7570000-7770000&lt;br /&gt;
| [World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 1000001 - 1100000&lt;br /&gt;
| DA Workshop / Author: frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== PRJ_base ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680050&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
== String ID ==&lt;br /&gt;
It is not generally necessary to register String ID ranges here. The values generated by the toolset are sufficiently random to minimise the risk of collision. Exception : the Community Contest reserved the range below so that the builders will stick to that and can import VO without having to renumber the VO files.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 10000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 89000000  - 89999999&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== tint_override ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| 500 - 520&lt;br /&gt;
| PavelNovotny - [http://social.bioware.com/project/517/ Gay Bars of Ferelden]&lt;br /&gt;
|-&lt;br /&gt;
| 6900 - 6920&lt;br /&gt;
| [http://www.dragonagenexus.com/downloads/file.php?id=1617 Karma's Origins Companions]&lt;br /&gt;
|-&lt;br /&gt;
| 1000001-1001000&lt;br /&gt;
| [http://social.bioware.com/project/178/ Crown of Creation]&lt;br /&gt;
|-&lt;br /&gt;
| 30000000-40000000&lt;br /&gt;
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)&lt;br /&gt;
|-&lt;br /&gt;
| 1109197701 - 1109197750&lt;br /&gt;
| Schwinni - [http://dragonagenexus.com/downloads/file.php?id=1064 Helmets without wings and retints]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== ts_material ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| 1405261000 - 1405261999&lt;br /&gt;
| nezroy - [http://social.bioware.com/project/1834/ Warden Shields], [http://www.dragonagenexus.com/downloads/file.php?id=793 Leliana Item Set]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== TS_Category ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680005&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
| 1000001 - 1100000&lt;br /&gt;
| DA Workshop / by frosti [http://www.dragon-age-workshop.de/forum/viewforum.php?f=19/ Icewind Dale Remake]&lt;br /&gt;
|-&lt;br /&gt;
| 7570000-7770000&lt;br /&gt;
| [World of Grone (by Shodushi) [http://social.bioware.com/project/2194/ World of Grone]&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== vfx_base ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 1000000'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| 24000 - 26000&lt;br /&gt;
| [http://social.bioware.com/wiki/datoolset/index.php/Community_Contest_Main_Page Community Contest]&lt;br /&gt;
|-&lt;br /&gt;
| 37000-38000&lt;br /&gt;
| [http://bg2redux.student.utwente.nl/trac/wiki Baldur's Gate Redux]&lt;br /&gt;
|-&lt;br /&gt;
| 5680000 - 5680010&lt;br /&gt;
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]&lt;br /&gt;
|-&lt;br /&gt;
| 5680011 - 5680019&lt;br /&gt;
| BioSpirit's [http://social.bioware.com/project/1647/ Hilltop Under Siege]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== worldmaps (has to be less than 256) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Range&lt;br /&gt;
! Used by&lt;br /&gt;
|-&lt;br /&gt;
| '''0 - 6'''&lt;br /&gt;
| '''Bioware - reserved'''&lt;br /&gt;
|-&lt;br /&gt;
| '''210 - 220'''&lt;br /&gt;
| [http://social.bioware.com/project/1845/ Blood and Lyrium]&lt;br /&gt;
|}&lt;br /&gt;
----&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Custom_minimaps&amp;diff=13679</id>
		<title>Custom minimaps</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Custom_minimaps&amp;diff=13679"/>
				<updated>2010-09-19T18:28:27Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It's possible to use a handcrafted minimap texture instead of the one posted by the level editor, which can be quite large and non-stylized. Sometimes you may not even have the LVL file to export a minimap with, necessitating this procedure. Take for instance the ''arena2'' level available in the toolset. There is no accompanying LVL file released by BioWare and this level has no associated minimap. &lt;br /&gt;
&lt;br /&gt;
Let's presume you wanted to use this ''arena2'' level for one of your areas (although there are some culling issues by the doors). The files you'll need to create can go under ''addins\[UID]\core\override\arena2\minimap'' or elsewhere as appropriate, but will do for working with the toolset. These files would be ''arena2_mmap_ph.dds'' and ''arena2_mmi.gff'', or &amp;lt;level name&amp;gt;_mmap_ph.dds and &amp;lt;level name&amp;gt;_mmi.gff. If you can't use an exported minimap from the level editor as a base, perhaps the easiest way to start creating your own minimap image is create a test area with the desired area layout, turn on/off real lighting or whatever other settings, and then use print screen to capture and save the image as a BMP. After you save your first screen shot, add two waypoints: one to the bottom left of your area and one to the top right. These two waypoint coordinates will be used constrain your minimap area. Record the waypoints' position coordinates in the toolset as we'll need them for the arena2_mmi.gff file later. Take another screen shot with these two waypoints visible, as we'll use them as a reference when cropping the image. Also, keep the area at its default orientation when you open it so the screen shot will match up in game. TODO: determine whether Area Map North affects this at all. Obviously this method is also less useful the larger the area and smaller your display, but the maps don't need to be that large to be good enough. Many interior minimaps in the single player campaign are 256x256 textures.&lt;br /&gt;
&lt;br /&gt;
Using an image editor with layers, you can easily use the image with waypoints underneath the image without in order to crop the first screen shot from the bottom left waypoint to the top right waypoint and then save the file. Now you can rescale the image if required. E.g., if your cropped image is 1280x1024, then you may want to use a 1024x1024 texture and shrink the image to 1024x819. If not a power of two texture, then you'll probably want to at least make it a multiple of 4, which some DDS exporters demand. Now within the new texture, align your actual minimap image to the top left corner. Now would be a good time to record another value you'll need for ''arena2_mmi.gff'': basically how much of the texture is used. If your actual minimap is 1024x819 in a 1024x1024 texture, then you'll want 1024/1024=1 and 819/1024=0.799805 for ''ENV_MINIMAP_TEXTURE_MAP_COORDS'', which we'll get to below. Now you can export the file as a DDS texture, which may require a plugin.&lt;br /&gt;
&lt;br /&gt;
So now we have ''addins\[UID]\core\override\arena2\minimap\arena2_mmap_ph.dds'' finished, and now we need to edit the GFF for it. We'll use a preexisting file to edit in the toolset. Open the following file in the toolset ''C:\Program Files\Dragon Age\packages\core\env\brc505d\brc505d.rim'' and extract brc505d_mmi.gff. Now rename this file ''addins\[UID]\core\override\arena2\minimap\arena2_mmi.gff'' and open it up in the toolset for editing.&lt;br /&gt;
&lt;br /&gt;
Edit ''ENV_MINIMAP_TEXTURE_MAP_COORDS'' to 1,0.799805,1 as calculated for the example minimap above, with the third coordinate always 1.&lt;br /&gt;
Edit ''ENV_MINIMAP_LOWER_LEFT_POINT'' to the coordinates of your lower left waypoint, but with the z-value being -500.&lt;br /&gt;
Edit ''ENV_MINIMAP_UPPER_RIGHT_POINT'' to the coordinates of your upper right waypoint, but with the z-value being 500.&lt;br /&gt;
&lt;br /&gt;
You can seemingly round off the decimal for the lower left and upper right coordinates, as the map and minimap don't seem to require that much precision, and the toolset isn't that precise either when creating the GFF in the first place.&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Custom_minimaps&amp;diff=13678</id>
		<title>Custom minimaps</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Custom_minimaps&amp;diff=13678"/>
				<updated>2010-09-19T18:27:19Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It's possible to use a handcrafted minimap texture instead of the one posted by the level editor, which can be quite large and non-stylized. Sometimes you may not even have the LVL file to export a minimap with, necessitating this procedure. Take for instance the ''arena2'' level available in the toolset. There is no accompanying LVL file released by BioWare and this level has no associated minimap. &lt;br /&gt;
&lt;br /&gt;
Let's presume you wanted to use this ''arena2'' level for one of your areas (although there are some culling issues by the doors). The files you'll need to create can go under ''addins\[UID]\core\override\arena2\minimap'' or elsewhere as appropriate, but will do for working with the toolset. These files would be ''arena2_mmap_ph.dds'' and ''arena2_mmi.gff'', or &amp;lt;level name&amp;gt;_mmap_ph.dds and &amp;lt;level name&amp;gt;_mmi.gff. If you can't use an exported minimap from the level editor as a base, perhaps the easiest way to start creating your own minimap image is create a test area with the desired area layout, turn on/off real lighting or whatever other settings, and then use print screen to capture and save the image as a BMP. After you save your first screen shot, add two waypoints: one to the bottom left of your area and one to the top right. These two waypoint coordinates will be used constrain your minimap area. Record the waypoints' position coordinates in the toolset as we'll need them for the arena2_mmi.gff file later. Take another screen shot with these two waypoints visible, as we'll use them as a reference when cropping the image. Also, keep the area at its default orientation when you open it so the screen shot will match up in game. TODO: determine whether Area Map North affects this at all. Obviously this method is also less useful the larger the area and smaller your display, but the maps don't need to be that large to be good enough.&lt;br /&gt;
&lt;br /&gt;
Using an image editor with layers, you can easily use the image with waypoints underneath the image without in order to crop the first screen shot from the bottom left waypoint to the top right waypoint and then save the file. Now you can rescale the image if required. E.g., if your cropped image is 1280x1024, then you may want to use a 1024x1024 texture and shrink the image to 1024x819. If not a power of two texture, then you'll probably want to at least make it a multiple of 4, which some DDS exporters demand. Now within the new texture, align your actual minimap image to the top left corner. Now would be a good time to record another value you'll need for ''arena2_mmi.gff'': basically how much of the texture is used. If your actual minimap is 1024x819 in a 1024x1024 texture, then you'll want 1024/1024=1 and 819/1024=0.799805 for ''ENV_MINIMAP_TEXTURE_MAP_COORDS'', which we'll get to below. Now you can export the file as a DDS texture, which may require a plugin.&lt;br /&gt;
&lt;br /&gt;
So now we have ''addins\[UID]\core\override\arena2\minimap\arena2_mmap_ph.dds'' finished, and now we need to edit the GFF for it. We'll use a preexisting file to edit in the toolset. Open the following file in the toolset ''C:\Program Files\Dragon Age\packages\core\env\brc505d\brc505d.rim'' and extract brc505d_mmi.gff. Now rename this file ''addins\[UID]\core\override\arena2\minimap\arena2_mmi.gff'' and open it up in the toolset for editing.&lt;br /&gt;
&lt;br /&gt;
Edit ''ENV_MINIMAP_TEXTURE_MAP_COORDS'' to 1,0.799805,1 as calculated for the example minimap above, with the third coordinate always 1.&lt;br /&gt;
Edit ''ENV_MINIMAP_LOWER_LEFT_POINT'' to the coordinates of your lower left waypoint, but with the z-value being -500.&lt;br /&gt;
Edit ''ENV_MINIMAP_UPPER_RIGHT_POINT'' to the coordinates of your upper right waypoint, but with the z-value being 500.&lt;br /&gt;
&lt;br /&gt;
You can seemingly round off the decimal for the lower left and upper right coordinates, as the map and minimap don't seem to require that much precision, and the toolset isn't that precise either when creating the GFF in the first place.&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Custom_minimaps&amp;diff=13677</id>
		<title>Custom minimaps</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Custom_minimaps&amp;diff=13677"/>
				<updated>2010-09-19T18:25:18Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It's possible to use a handcrafted minimap texture instead of the one posted by the level editor, which can be quite large and non-stylized. Sometimes you may not even have the LVL file to export a minimap with, necessitating this procedure. Take for instance the ''arena2'' level available in the toolset. There is no accompanying LVL file released by BioWare and this level has no associated minimap. &lt;br /&gt;
&lt;br /&gt;
Let's presume you wanted to use this ''arena2'' level for one of your areas (although there are some culling issues by the doors). The files you'll need to create can go under ''addins\[UID]\core\override\arena2\minimap'' or elsewhere as appropriate, but will do for working with the toolset. These files would be ''arena2_mmap_ph.dds'' and ''arena2_mmi.gff'', or &amp;lt;level name&amp;gt;_mmap_ph.dds and &amp;lt;level name&amp;gt;_mmi.gff. If you can't use an exported minimap from the level editor as a base, perhaps the easiest way to start creating your own minimap image is create a test area with the desired area layout, turn on/off real lighting or whatever other settings, and then use print screen to capture and save the image as a BMP. After you save your first screen shot, add two waypoints: one to the bottom left of your area and one to the top right. These two waypoint coordinates will be used constrain your minimap area. Record the waypoints' position coordinates in the toolset as we'll need them for the arena2_mmi.gff file later. Take another screen shot with these two waypoints visible, as we'll use them as a reference when cropping the image. Also, keep the area at its default orientation when you open it so the screen shot will match up in game. TODO: determine whether Area Map North affects this at all. Obviously this method is also less useful the larger the area and smaller your display, but the maps don't need to be that large to be good enough.&lt;br /&gt;
&lt;br /&gt;
Using an image editor with layers, you can easily use the image with waypoints underneath the image without in order to crop the first screen shot from the bottom left waypoint to the top right waypoint and then save the file. Now open it up in a proper image editing program such as Photoshop and rescale the image so it can fit in a power-of-two sized texture. E.g., if your cropped image is 1280x1024, then you may want to use a 1024x1024 texture and shrink the image to 1024x819. If not a power of two texture, then you'll probably want to at least make it a multiple of 4, which some DDS exporters demand. Now within the power-of-two texture, align your actual minimap texture to the top left corner. Now would be a good time to record another value you'll need for ''arena2_mmi.gff'': basically how much of the texture is used. If your actual minimap is 1024x819 in a 1024x1024 texture, then you'll want 1024/1024=1 and 819/1024=0.799805 for ''ENV_MINIMAP_TEXTURE_MAP_COORDS'', which we'll get to below. Now you can export the file as a DDS texture, which may require a plugin.&lt;br /&gt;
&lt;br /&gt;
So now we have ''addins\[UID]\core\override\arena2\minimap\arena2_mmap_ph.dds'' finished, and now we need to edit the GFF for it. We'll use a preexisting file to edit in the toolset. Open the following file in the toolset ''C:\Program Files\Dragon Age\packages\core\env\brc505d\brc505d.rim'' and extract brc505d_mmi.gff. Now rename this file ''addins\[UID]\core\override\arena2\minimap\arena2_mmi.gff'' and open it up in the toolset for editing.&lt;br /&gt;
&lt;br /&gt;
Edit ''ENV_MINIMAP_TEXTURE_MAP_COORDS'' to 1,0.799805,1 as calculated for the example minimap above, with the third coordinate always 1.&lt;br /&gt;
Edit ''ENV_MINIMAP_LOWER_LEFT_POINT'' to the coordinates of your lower left waypoint, but with the z-value being -500.&lt;br /&gt;
Edit ''ENV_MINIMAP_UPPER_RIGHT_POINT'' to the coordinates of your upper right waypoint, but with the z-value being 500.&lt;br /&gt;
&lt;br /&gt;
You can seemingly round off the decimal for the lower left and upper right coordinates, as the map and minimap don't seem to require that much precision, and the toolset isn't that precise either when creating the GFF in the first place.&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Custom_minimaps&amp;diff=13676</id>
		<title>Custom minimaps</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Custom_minimaps&amp;diff=13676"/>
				<updated>2010-09-19T18:18:05Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It's possible to use a handcrafted minimap texture instead of the one posted by the level editor, which can be quite large and non-stylized. Sometimes you may not even have the LVL file to export a minimap with, necessitating this procedure. Take for instance the ''arena2'' level available in the toolset. There is no accompanying LVL file released by BioWare and this level has no associated minimap. &lt;br /&gt;
&lt;br /&gt;
Let's presume you wanted to use this ''arena2'' level for one of your areas (although there are some culling issues by the doors). The files you'll need to create can go under ''addins\[UID]\core\override\arena2\minimap'' or elsewhere as appropriate, but will do for working with the toolset. These files would be ''arena2_mmap_ph.dds'' and ''arena2_mmi.gff'', or &amp;lt;level name&amp;gt;_mmap_ph.dds and &amp;lt;level name&amp;gt;_mmi.gff. If you can't use an exported minimap from the level editor as a base, perhaps the easiest way to start creating your own minimap image is create a test area with the desired area layout, turn on/off real lighting or whatever other settings, and then use print screen to capture and save the image as a BMP. After you save your first screen shot, add two waypoints: one to the bottom left of your area and one to the top right. These two waypoint coordinates will be used constrain your minimap area. Record the waypoints' position coordinates in the toolset as we'll need them for the arena2_mmi.gff file later. Take another screen shot with these two waypoints visible, as we'll use them as a reference when cropping the image. Also, keep the area at its default orientation when you open it so the screen shot will match up in game. TODO: determine whether Area Map North affects this at all. Obviously this method is also less useful the larger the area and smaller your display, but the maps don't need to be that large to be good enough.&lt;br /&gt;
&lt;br /&gt;
Using an image editor with layers, you can easily use the image with waypoints underneath the image without in order to crop the first screen shot from the bottom left waypoint to the top right waypoint and then save the file. Now open it up in a proper image editing program such as Photoshop and rescale the image so it can fit in a power-of-two sized texture. E.g., if your cropped image is 1280x1024, then you may want to use a 1024x1024 texture and shrink the image to 1024x819, as the next power-of-two sized texture is 2048x2048 which would be somewhat wasteful. Now within the power-of-two texture, align your actual minimap texture to the top left corner. Now would be a good time to record another value you'll need for ''arena2_mmi.gff'': basically how much of the texture is used. If your actual minimap is 1024x819 in a 1024x1024 texture, then you'll want 1024/1024=1 and 819/1024=0.799805 for ''ENV_MINIMAP_TEXTURE_MAP_COORDS'', which we'll get to below. Now you can export the file as a DDS texture, which may require a plugin.&lt;br /&gt;
&lt;br /&gt;
So now we have ''addins\[UID]\core\override\arena2\minimap\arena2_mmap_ph.dds'' finished, and now we need to edit the GFF for it. We'll use a preexisting file to edit in the toolset. Open the following file in the toolset ''C:\Program Files\Dragon Age\packages\core\env\brc505d\brc505d.rim'' and extract brc505d_mmi.gff. Now rename this file ''addins\[UID]\core\override\arena2\minimap\arena2_mmi.gff'' and open it up in the toolset for editing.&lt;br /&gt;
&lt;br /&gt;
Edit ''ENV_MINIMAP_TEXTURE_MAP_COORDS'' to 1,0.799805,1 as calculated for the example minimap above, with the third coordinate always 1.&lt;br /&gt;
Edit ''ENV_MINIMAP_LOWER_LEFT_POINT'' to the coordinates of your lower left waypoint, but with the z-value being -500.&lt;br /&gt;
Edit ''ENV_MINIMAP_UPPER_RIGHT_POINT'' to the coordinates of your upper right waypoint, but with the z-value being 500.&lt;br /&gt;
&lt;br /&gt;
You can seemingly round off the decimal for the lower left and upper right coordinates, as the map and minimap don't seem to require that much precision, and the toolset isn't that precise either when creating the GFF in the first place.&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Custom_minimaps&amp;diff=13675</id>
		<title>Custom minimaps</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Custom_minimaps&amp;diff=13675"/>
				<updated>2010-09-19T17:52:42Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It's possible to use a handcrafted minimap texture instead of the one posted by the level editor, which can be quite large and non-stylized. Sometimes you may not even have the LVL file to export a minimap with, necessitating this procedure. Take for instance the ''arena2'' level available in the toolset. There is no accompanying LVL file released by BioWare and this level has no associated minimap. &lt;br /&gt;
&lt;br /&gt;
Let's presume you wanted to use this ''arena2'' level for one of your areas (although there are some culling issues by the doors). The files you'll need to create can go under ''addins\[UID]\core\override\arena2\minimap'' or elsewhere as appropriate, but will do for working with the toolset. These files would be ''arena2_mmap_ph.dds'' and ''arena2_mmi.gff'', or &amp;lt;level name&amp;gt;_mmap_ph.dds and &amp;lt;level name&amp;gt;_mmi.gff. If you can't use an exported minimap from the level editor as a base, perhaps the easiest way to start creating your own minimap image is create a test area with the desired area layout, turn on/off real lighting or whatever other settings, and then use print screen to capture and save the image as a BMP. After you save your first screen shot, add two waypoints: one to the bottom left of your area and one to the top right. These two waypoint coordinates will be used constrain your minimap area. Record the waypoints' position coordinates as we'll need them for the arena2_mmi.gff file later. Take another screen shot with these two waypoints visible, as we'll use them as a reference when cropping the image. Also, keep the area at its default orientation when you open it so the screen shot will match up in game. TODO: determine whether Area Map North affects this at all. Obviously this method is also less useful the larger the area and smaller your display, but the maps don't need to be that large to be good enough.&lt;br /&gt;
&lt;br /&gt;
Using an image editor with layers, you can easily use the image with waypoints underneath the image without in order to crop the first screen shot from the bottom left waypoint to the top right waypoint and then save the file. Now open it up in a proper image editing program such as Photoshop and rescale the image so it can fit in a power-of-two sized texture. E.g., if your cropped image is 1280x1024, then you may want to use a 1024x1024 texture and shrink the image to 1024x819, as the next power-of-two sized texture is 2048x2048 which would be somewhat wasteful. Now within the power-of-two texture, align your actual minimap texture to the top left corner. Now would be a good time to record another value you'll need for ''arena2_mmi.gff'': basically how much of the texture is used. If your actual minimap is 1024x819 in a 1024x1024 texture, then you'll want 1024/1024=1 and 819/1024=0.799805 for ''ENV_MINIMAP_TEXTURE_MAP_COORDS'', which we'll get to below. Now you can export the file as a DDS texture, which may require a plugin.&lt;br /&gt;
&lt;br /&gt;
So now we have ''addins\[UID]\core\override\arena2\minimap\arena2_mmap_ph.dds'' finished, and now we need to edit the GFF for it. We'll use a preexisting file to edit in the toolset. Open the following file in the toolset ''C:\Program Files\Dragon Age\packages\core\env\brc505d\brc505d.rim'' and extract brc505d_mmi.gff. Now rename this file ''addins\[UID]\core\override\arena2\minimap\arena2_mmi.gff'' and open it up in the toolset for editing.&lt;br /&gt;
&lt;br /&gt;
Edit ''ENV_MINIMAP_TEXTURE_MAP_COORDS'' to 1,0.799805,1 as calculated for the example minimap above, with the third coordinate always 1.&lt;br /&gt;
Edit ''ENV_MINIMAP_LOWER_LEFT_POINT'' to the coordinates of your lower left waypoint, but with the z-value being -500.&lt;br /&gt;
Edit ''ENV_MINIMAP_UPPER_RIGHT_POINT'' to the coordinates of your upper right waypoint, but with the z-value being 500.&lt;br /&gt;
&lt;br /&gt;
You can seemingly round off the decimal for the lower left and upper right coordinates, as the map and minimap don't seem to require that much precision, and the toolset isn't that precise either when creating the GFF in the first place.&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Custom_minimaps&amp;diff=13674</id>
		<title>Custom minimaps</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Custom_minimaps&amp;diff=13674"/>
				<updated>2010-09-19T17:29:11Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It's possible to use a handcrafted minimap texture instead of the one posted by the level editor, which can be quite large and non-stylized. Sometimes you may not even have the LVL file to export a minimap with, necessitating this procedure. Take for instance the ''arena2'' level available in the toolset. There is no accompanying LVL file released by BioWare and this level has no associated minimap. &lt;br /&gt;
&lt;br /&gt;
Let's presume you wanted to use this ''arena2'' level for one of your areas (although there are some culling issues by the doors). The files you'll need to create can go under ''addins\[UID]\core\override\arena2\minimap'' or elsewhere as appropriate, but will do for working with the toolset. These files would be ''arena2_mmap_ph.dds'' and ''arena2_mmi.gff'', or &amp;lt;level name&amp;gt;_mmap_ph.dds and &amp;lt;level name&amp;gt;_mmi.gff. Perhaps the easiest way to start creating your own minimap image is create a test area with the desired area layout, turn on/off real lighting or whatever other settings, and then use print screen to capture and save the image as a BMP. After you save your first screen shot, add two waypoints: one to the bottom left of your area and one to the top right. These two waypoint coordinates will be used constrain your minimap area. Record the waypoints' position coordinates as we'll need them for the arena2_mmi.gff file later. Take another screen shot with these two waypoints visible, as we'll use them as a reference when cropping the image. Also, keep the area at its default orientation when you open it so the screen shot will match up in game. TODO: determine whether Area Map North affects this at all. Obviously this method is also less useful the larger the area and smaller your display, but the maps don't need to be that large to be good enough.&lt;br /&gt;
&lt;br /&gt;
Using an image editor with layers, you can easily use the image with waypoints underneath the image without in order to crop the first screen shot from the bottom left waypoint to the top right waypoint and then save the file. Now open it up in a proper image editing program such as Photoshop and rescale the image so it can fit in a power-of-two sized texture. E.g., if your cropped image is 1280x1024, then you may want to use a 1024x1024 texture and shrink the image to 1024x819, as the next power-of-two sized texture is 2048x2048 which would be somewhat wasteful. Now within the power-of-two texture, align your actual minimap texture to the top left corner. Now would be a good time to record another value you'll need for ''arena2_mmi.gff'': basically how much of the texture is used. If your actual minimap is 1024x819 in a 1024x1024 texture, then you'll want 1024/1024=1 and 819/1024=0.799805 for ''ENV_MINIMAP_TEXTURE_MAP_COORDS'', which we'll get to below. Now you can export the file as a DDS texture, which may require a plugin.&lt;br /&gt;
&lt;br /&gt;
So now we have ''addins\[UID]\core\override\arena2\minimap\arena2_mmap_ph.dds'' finished, and now we need to edit the GFF for it. We'll use a preexisting file to edit in the toolset. Open the following file in the toolset ''C:\Program Files\Dragon Age\packages\core\env\brc505d\brc505d.rim'' and extract brc505d_mmi.gff. Now rename this file ''addins\[UID]\core\override\arena2\minimap\arena2_mmi.gff'' and open it up in the toolset for editing.&lt;br /&gt;
&lt;br /&gt;
Edit ''ENV_MINIMAP_TEXTURE_MAP_COORDS'' to 1,0.799805,1 as calculated for the example minimap above, with the third coordinate always 1.&lt;br /&gt;
Edit ''ENV_MINIMAP_LOWER_LEFT_POINT'' to the coordinates of your lower left waypoint, but with the z-value being -500.&lt;br /&gt;
Edit ''ENV_MINIMAP_UPPER_RIGHT_POINT'' to the coordinates of your upper right waypoint, but with the z-value being 500.&lt;br /&gt;
&lt;br /&gt;
You can seemingly round off the decimal for the lower left and upper right coordinates, as the map and minimap don't seem to require that much precision, and the toolset isn't that precise either when creating the GFF in the first place.&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Custom_minimaps&amp;diff=13672</id>
		<title>Custom minimaps</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Custom_minimaps&amp;diff=13672"/>
				<updated>2010-09-19T16:10:29Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It's possible to use a handcrafted minimap texture instead of the one posted by the level editor, which can be quite large and non-stylized. Sometimes you may not even have the LVL file to export a minimap with, necessitating this procedure. Take for instance the ''arena2'' level available in the toolset. There is no accompanying LVL file released by BioWare and this level has no associated minimap. &lt;br /&gt;
&lt;br /&gt;
Let's presume you wanted to use this ''arena2'' level for one of your areas (although there are some culling issues by the doors). The files you'll need to create can go under ''addins\[UID]\core\override\arena2\minimap'' or elsewhere as appropriate, but will do for working with the toolset. These files would be ''arena2_mmap_ph.dds'' and ''arena2_mmi.gff'', or &amp;lt;level name&amp;gt;_mmap_ph.dds and &amp;lt;level name&amp;gt;_mmi.gff. Perhaps the easiest way to start creating your own minimap image is create a test area with the desired area layout, turn on real lighting or whatever other settings, and then use print screen to capture and save the image as a BMP. After you save your first screen shot, add two waypoints: one to the bottom left of your area and one to the top right. These two waypoint coordinates will be used constrain your minimap area. Record the waypoints' position coordinates as we'll need them for the arena2_mmi.gff file later. Take another screen shot with these two waypoints visible, as we'll use them as a reference when cropping the image. Also, keep the area at its default orientation when you open it so the screen shot will match up in game. TODO: determine whether Area Map North affects this at all. Obviously this method is also less useful the larger the area and smaller your display, but the maps don't need to be that large to be good enough.&lt;br /&gt;
&lt;br /&gt;
Using the waypoints as a measuring guide, crop the first screen shot from the bottom left waypoint to the top right waypoint and then save the file. Now open it up in a proper image editing program such as Photoshop and rescale the image so it can fit in a power-of-two sized texture. E.g., if your cropped image is 1280x1024, then you may want to use a 1024x1024 texture and shrink the image to 1024x819, as the next power-of-two sized texture is 2048x2048 which would be somewhat wasteful. Now within the power-of-two texture, align your actual minimap texture to the top left corner. Now would be a good time to record another value you'll need for ''arena2_mmi.gff'': basically how much of the texture is used. If your actual minimap is 1024x819 in a 1024x1024 texture, then you'll want 1024/1024=1 and 819/1024=0.799805 for ''ENV_MINIMAP_TEXTURE_MAP_COORDS'', which we'll get to below. Now you can export the file as a DDS texture, which may require a plugin.&lt;br /&gt;
&lt;br /&gt;
So now we have ''addins\[UID]\core\override\arena2\minimap\arena2_mmap_ph.dds'' finished, and now we need to edit the GFF for it. We'll use a preexisting file to edit in the toolset. Open the following file in the toolset ''C:\Program Files\Dragon Age\packages\core\env\brc505d\brc505d.rim'' and extract brc505d_mmi.gff. Now rename this file ''addins\[UID]\core\override\arena2\minimap\arena2_mmi.gff'' and open it up in the toolset for editing.&lt;br /&gt;
&lt;br /&gt;
Edit ''ENV_MINIMAP_TEXTURE_MAP_COORDS'' to 1,0.799805,1 as calculated for the example minimap above, with the third coordinate always 1.&lt;br /&gt;
Edit ''ENV_MINIMAP_LOWER_LEFT_POINT'' to the coordinates of your lower left waypoint, but with the z-value being -500.&lt;br /&gt;
Edit ''ENV_MINIMAP_UPPER_RIGHT_POINT'' to the coordinates of your upper right waypoint, but with the z-value being 500.&lt;br /&gt;
&lt;br /&gt;
You can seemingly round off the decimal for the lower left and upper right coordinates, as the map and minimap don't seem to require that much precision, and the toolset isn't that precise either when creating the GFF in the first place.&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Custom_minimaps&amp;diff=13671</id>
		<title>Custom minimaps</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Custom_minimaps&amp;diff=13671"/>
				<updated>2010-09-19T16:09:04Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It's possible to use a handcrafted minimap texture instead of the one posted by the level editor, which can be quite large and non-stylized. Sometimes you may not even have the LVL file to export a minimap with, necessitating this procedure. Take for instance the ''arena2'' level available in the toolset. There is no accompanying LVL file released by BioWare and this level has no associated minimap. &lt;br /&gt;
&lt;br /&gt;
Let's presume you wanted to use this ''arena2'' level for one of your areas (although there are some culling issues by the doors). The files you'll need to create can go under ''addins\[UID]\core\override\arena2\minimap'' or elsewhere as appropriate, but will do for working with the toolset. These files would be ''arena2_mmap_ph.dds'' and ''arena2_mmi.gff'', or &amp;lt;level name&amp;gt;_mmap_ph.dds and &amp;lt;level name&amp;gt;_mmi.gff. Perhaps the easiest way to start creating your own minimap image is create a test area with the desired area layout, turn on real lighting or whatever other settings, and then use print screen to capture and save the image as a BMP. After you save your first screen shot, add two waypoints: one to the bottom left of your area and one to the top right. These two waypoint coordinates will be used constrain your minimap area. Record the waypoints' position coordinates as we'll need them for the arena2_mmi.gff file later. Take another screen shot with these two waypoints visible, as we'll use them as a reference when cropping the image. Also, keep the area at its default orientation when you open it so the screen shot will match up in game. TODO: determine whether Area Map North affects this at all. Obviously this method is also less useful the larger the area and smaller your display, but the maps don't need to be that large to be good enough.&lt;br /&gt;
&lt;br /&gt;
Using the waypoints as a measuring guide, crop the first screen shot from the bottom left waypoint to the top right waypoint and then save the file. Now open it up in a proper image editing program such as Photoshop and rescale the image so it can fit in a power-of-two sized texture. E.g., if your cropped image is 1280x1024, then you may want to use a 1024x1024 texture and shrink the image to 1024x819, as the next power-of-two sized texture is 2048x2048 which would be somewhat wasteful. Now within the power-of-two texture, align your actual minimap texture to the top left corner. Now would be a good time to record another value you'll need for ''arena2_mmi.gff'': basically how much of the texture is used. If your actual minimap is 1024x819 in a 1024x1024 texture, then you'll want 1024/1024=1 and 819/1024=0.799805 for ''ENV_MINIMAP_TEXTURE_MAP_COORDS'', which we'll get to below. Now you can export the file as a DDS texture, which may require a plugin.&lt;br /&gt;
&lt;br /&gt;
So now we have ''addins\[UID]\core\override\arena2\minimap\arena2_mmap_ph.dds'' finished, and now we need to edit the GFF for it. We'll use a preexisting file to edit in the toolset. Open the following file in the toolset ''C:\Program Files\Dragon Age\packages\core\env\brc505d\brc505d.rim'' and extract brc505d_mmi.gff. Now rename this file ''addins\[UID]\core\override\arena2\minimap\arena2_mmi.gff'' and open it up in the toolset for editing.&lt;br /&gt;
&lt;br /&gt;
Edit ''ENV_MINIMAP_TEXTURE_MAP_COORDS'' to 1,0.799805,1 as calculated for the example minimap above, with the third coordinate always 1.&lt;br /&gt;
Edit ''ENV_MINIMAP_LOWER_LEFT_POINT'' to the coordinates of your lower left waypoint, but with the z-value being -500.&lt;br /&gt;
Edit ''ENV_MINIMAP_UPPER_RIGHT_POINT'' to the coordinates of your upper right waypoint, but with the z-value being 500.&lt;br /&gt;
&lt;br /&gt;
You can seemingly round off the decimal for the lower left and upper right coordinates, as the map and minimap don't seem to require that much precision, and the toolset isn't that precise either when creating the GFF file in the first place.&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Level_Editor_Tutorial&amp;diff=13670</id>
		<title>Level Editor Tutorial</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Level_Editor_Tutorial&amp;diff=13670"/>
				<updated>2010-09-19T16:02:22Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: /* punctuation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Building your room (Interior Level)=&lt;br /&gt;
How to create/lightmap a [[Level]] for use in an Interior [[Area]]:&lt;br /&gt;
Objective: Following along with this tutorial, you should be able to create a simple room from scratch in 10 minutes or less&lt;br /&gt;
&lt;br /&gt;
 This was lifted from a posting by St4rdog http://social.bioware.com/forum/1/topic/8/index/150840&lt;br /&gt;
 It needs some additional formatting love, but is as good starting place for people to create usable &lt;br /&gt;
 interior levels&lt;br /&gt;
&lt;br /&gt;
File &amp;gt; New &amp;gt; Level &amp;gt; Room Level&lt;br /&gt;
&lt;br /&gt;
* Click on &amp;quot;New Area&amp;quot; in top-left list &amp;gt; Object Inspector in bottom-right &amp;gt; Layout Name &amp;gt; anything under 8 characters no spaces or special characters (*,&amp;amp;,%, etc).&lt;br /&gt;
* Click the Setup Start Point icon, then click anywhere to make a start point.&lt;br /&gt;
* Select the Area, then add the Start Point Name in the Object Inspector.  &lt;br /&gt;
*Right-click in 3D view and select Insert &amp;gt; New Room.&lt;br /&gt;
*Click Models (blue box) in the Palette in the top-right. These folders contain everything such as floor tiles, walls, etc.&lt;br /&gt;
*Enable Grid Snap with the magnet icon to make sure they line up.&lt;br /&gt;
*The &amp;quot;prp&amp;quot; folder contains things like beds/barrels to clutter your Level.&lt;br /&gt;
 Hint: Use [[DATool]] (3rd party tool downloadable at http://social.bioware.com/project/41/ )to browse &lt;br /&gt;
 through these quickly to find the floors/walls you want.&lt;br /&gt;
*Any gaps you can see between models (such as wall sections) will be visible in game. When you have time to refine the layout, you can remove most hairline gaps by setting exact X Y Z coordinates in the toolset (though sometimes 0.99 or 1.01 looks better than 1.00). Larger gaps may require the use of tileset assets such as pillars. The black box tileset (blk) can be placed outside a room to cover up any defects.&lt;br /&gt;
 Hint: If you need lots of wall sections quickly, place one at a convenient location e.g. (0,0). Copy (Ctrl-C) then Paste (Ctrl-V)&lt;br /&gt;
 as many as you need. In the Object Inspector, change the coordinates of successive sections to (0,8), (0,16) etc or drag manually &lt;br /&gt;
 if you can do that quicker.&lt;br /&gt;
&lt;br /&gt;
 Note: If you get &amp;quot;Cannot spawn models into the selected parent object&amp;quot; when trying to place a model &lt;br /&gt;
 then you don't have &amp;quot;New Room&amp;quot; selected.&lt;br /&gt;
&lt;br /&gt;
==Working with multiple rooms==&lt;br /&gt;
&lt;br /&gt;
In general it is best to define each building room as a new room in the level. This becomes important when you work on lighting. To physically connect rooms you need to slide them together to get the doors to line up, they do not line up automatically. It takes some trial and error but becomes easier with practice.&lt;br /&gt;
&lt;br /&gt;
Use the Room Properties icon to specify which rooms are connected etc.&lt;br /&gt;
&lt;br /&gt;
==Pathfinding==&lt;br /&gt;
&lt;br /&gt;
Click the Generate Pathfinding icon. Green dots indicate where the player will be allowed to walk.&lt;br /&gt;
&lt;br /&gt;
For this to work, the area properties must name a valid start point, and it needs to be bounded by walls or other obstacles.&lt;br /&gt;
&lt;br /&gt;
 Hint: you may need to place another startpoint in any room that can't be reached from the main startpoint. That would apply, for example, to&lt;br /&gt;
 rooms reached by transition doors within the area.&lt;br /&gt;
&lt;br /&gt;
==Adding lights==&lt;br /&gt;
&lt;br /&gt;
Two very simple alternatives are given here. &lt;br /&gt;
&lt;br /&gt;
The first is minimal, with shadows. &lt;br /&gt;
&lt;br /&gt;
The second makes no shadows, but ensures that faces are never in darkness.     &lt;br /&gt;
&lt;br /&gt;
=== Method 1 ===&lt;br /&gt;
&lt;br /&gt;
* Right-click on &amp;quot;New Room&amp;quot; in top-left list &amp;gt; Insert &amp;gt; New Light&lt;br /&gt;
&lt;br /&gt;
* Move it up off the floor a little (e.g. Z = 2). In Object Inspector &amp;gt; Affects Characters TRUE &amp;gt; &amp;quot;Color Intensity&amp;quot; 2 or more &amp;gt; &amp;quot;Light Type&amp;quot; Point - Static (lc) &amp;gt; Choose any bright color (this light illuminates both the level and the characters).&lt;br /&gt;
&lt;br /&gt;
*Copy and paste. In Object Inspector &amp;gt;&amp;quot;Light Type&amp;quot; Ambient - Baked (you must have an ambient light, and this approach stops your shadows being pitch black) &amp;gt; Choose a dark blue colour and keep the Color Intensity under 2/3.&lt;br /&gt;
&lt;br /&gt;
 Note: I'm not sure what the mix of Baked/Static light is supposed to be. &lt;br /&gt;
 If you just put a Baked + Ambient it complains about not having Static, but if &lt;br /&gt;
 you put a Static + Ambient it seems to work fine, but the wiki says Static is &lt;br /&gt;
 the most expensive.&lt;br /&gt;
&lt;br /&gt;
=== Method 2 ===&lt;br /&gt;
&lt;br /&gt;
* Right-click on &amp;quot;New Room&amp;quot; in top-left list &amp;gt; Insert &amp;gt; New Light anywhere in the room.&lt;br /&gt;
&lt;br /&gt;
* Raise it up off the floor a little (e.g. Z = 2).&lt;br /&gt;
&lt;br /&gt;
* In Object Inspector &amp;gt; &amp;quot;Light Type&amp;quot; Ambient - Baked &amp;gt; Colour 1,1,0.86 &amp;gt; leave the colour intensity at 1 (this ambient light will light the level but not the characters).&lt;br /&gt;
&lt;br /&gt;
* Copy and paste. In Object Inspector &amp;gt; &amp;quot;Light Type&amp;quot; Point - Static &amp;gt; Affects Characters TRUE &amp;gt; Affects Level FALSE &amp;gt; Colour 0.70,0.70,0.65 &amp;gt; Colour Intensity 1.7 Point Radius 10000 (this will light your characters).&lt;br /&gt;
&lt;br /&gt;
* Copy and paste until you have 3-4 static character lights.&lt;br /&gt;
&lt;br /&gt;
* Arrange the character lights in a circle outside all of the rooms.&lt;br /&gt;
&lt;br /&gt;
=== Light Probe ===&lt;br /&gt;
&lt;br /&gt;
Whether you use method 1 or 2,&lt;br /&gt;
&lt;br /&gt;
* Right-click on &amp;quot;New Room&amp;quot; in top-left list &amp;gt; Insert &amp;gt; New Light Probe&lt;br /&gt;
&lt;br /&gt;
 Note : you need a light probe to make character and water lighting work properly. The exact position doesn't seem to matter much.&lt;br /&gt;
&lt;br /&gt;
==Rendering Lightmaps==&lt;br /&gt;
&lt;br /&gt;
*Press the Render Lightmaps icon (you need ActivePython 2.5 installed to default location). When it's done click the Display Lightmaps On/Off icon in the top-left to refresh the results.&lt;br /&gt;
*Uncheck the &amp;quot;View Models Fully Lit&amp;quot; icon in the lop-left. You should see shadows from any objects you've dropped in.&lt;br /&gt;
&lt;br /&gt;
 Note: Lightmap-atlas messages might appear the first time you render. That seems normal.&lt;br /&gt;
 Sometimes re-rendering the lightmaps messes them up badly when Display Lightmaps On/Off is on. It &lt;br /&gt;
 doesn't seem to use the latest lightmaps. Try pressing Display Lightmaps On/Off a few times to &lt;br /&gt;
 update it. If they're still messed up sometimes one of these fixes it (don't know which)&lt;br /&gt;
 unloading/reloading your Area or Level/changing your Area's layout property/posting your Level to &lt;br /&gt;
 Local.&lt;br /&gt;
&lt;br /&gt;
==Adding the Minimap==&lt;br /&gt;
&lt;br /&gt;
Select the area. Right click, then select Minimap &amp;gt; Minimap Selection Tool. The default green box appears. Right click on the area again, Minimap &amp;gt; Post Minimap to Local. It's possible to handcraft or refine the minimap, as detailed under [[Custom minimaps]].&lt;br /&gt;
&lt;br /&gt;
==Exporting==&lt;br /&gt;
&lt;br /&gt;
*Press the Do All Local Posts icon to the right of the lightmapping icons. It will export the name you typed into the &amp;quot;New Area&amp;quot; &amp;quot;Layout Name&amp;quot;. &lt;br /&gt;
*If that doesn't work, select the area then Edit &amp;gt; Post Selection To Local.&lt;br /&gt;
*If there's a complaint about walkable/player start then delete your old start then place a new one on a flat area.&lt;br /&gt;
*Save your .lvl file. It's not used by the game and the name/location doesn't matter. Only the exported/posted files are used.&lt;br /&gt;
&lt;br /&gt;
==Using this in an Area==&lt;br /&gt;
&lt;br /&gt;
File &amp;gt; New &amp;gt; Area &amp;gt; Any Name&lt;br /&gt;
&lt;br /&gt;
*In the Object Inspector &amp;gt; Area Layout you should get a &amp;quot;...&amp;quot; box (make sure it's Checked Out) &amp;gt; click then select your &amp;quot;Layout Name&amp;quot; which should now be there.&lt;br /&gt;
&lt;br /&gt;
* Now you have a pretty lightmapped level inside an area.&lt;br /&gt;
&lt;br /&gt;
=Building your terrain (Exterior Level)=&lt;br /&gt;
How to create/lightmap a [[Level]] for use in an Exterior [[Area]]:&lt;br /&gt;
Objective: Following along with this tutorial, you should be able to create a simple terrain from scratch.&lt;br /&gt;
&lt;br /&gt;
File&amp;gt;New&amp;gt;Level&lt;br /&gt;
&lt;br /&gt;
* Choose Terrain (Landscape) Level and then click Next.&lt;br /&gt;
&lt;br /&gt;
* Accept the default values for the purpose of this tutorial and click Next and then click Finish. You can learn more about what the different terrain options do at the [[Level editor]] page.&lt;br /&gt;
&lt;br /&gt;
You should now see a flat, dark piece of terrain. To move around you hold down the mouse wheel. If you want to rotate the view press the Alt key while holding down the mouse wheel. You will want some light so you can see what you are doing, so we will generate a light source next.&lt;br /&gt;
&lt;br /&gt;
Tip: When choosing the size of your terrain level think about where you are going to put horizon and vista objects, like distant mountains and tree lines. You may need to allow for extra space around your adventure area to place those items.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Grid Size==&lt;br /&gt;
&lt;br /&gt;
If you want to work with a larger grid than the one provided by default you can change the grid size by going to: &lt;br /&gt;
&lt;br /&gt;
Tools/Options/Level Editor/Grid Square Size.&lt;br /&gt;
&lt;br /&gt;
This will not change the actual dimensions of the terrain level that you created, it only changes the size of the squares in the grid.&lt;br /&gt;
&lt;br /&gt;
==Define an area==&lt;br /&gt;
&lt;br /&gt;
Must be done before rendering the lightmap.&lt;br /&gt;
&lt;br /&gt;
* Click on the purple [[File:Purpleplus.png]]-sign and click Define Area. Start in one corner and draw the green square to define the area that you will export.&lt;br /&gt;
* Fill in the box Layout Name, max seven characters.&lt;br /&gt;
* Fill in the box Name.&lt;br /&gt;
&lt;br /&gt;
==Lighting==&lt;br /&gt;
&lt;br /&gt;
* Right click on Terrain World to the upper left and choose Insert&amp;gt;New Light. This will spawn a light source in your area.  Make sure you change the Light Type to Ambient - Baked (L).  Be sure to click on the Render Lightmaps button if you want to see how your ambient light is working.&lt;br /&gt;
&lt;br /&gt;
Now that the terrain is lit we can modify it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Modifying Terrain==&lt;br /&gt;
&lt;br /&gt;
The [[Terrain mesh]] tools allow you to modify the terrain by changing elevations, smoothing edges, flatting terrain, or painting textures.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Water==&lt;br /&gt;
&lt;br /&gt;
First use the [[Terrain mesh]] tools to make a hole.  It doesn't have to be deep.  Then right-click on Terrain world and select Insert -&amp;gt; New Water Mesh.  Double Click on the Water Mesh to zoom to it.  By default it gets placed in a corner.  Using the 3 Axis Movement tool [[File:moveTool.png]] grab the water and drag it to your hole.  Depending on the size of the hole, you might have to adjust the water mesh size by changing the Size X and Size Y property values.  Once you have the mesh placed, it's time to create the light probe.  Right-click near the water mesh and select Insert -&amp;gt; New Light Probe.  Using the move tool again, drag the light probe so that is roughly centered over the water mesh and slightly above it.  Click on Render Lightmaps, then Render Light Probs.  You might have to toggle Display Lightmaps, but you should now see your water looking like water and reflecting things around it.&lt;br /&gt;
&lt;br /&gt;
See also [[Bug: Water plane missing in-game]] for an important workaround.&lt;br /&gt;
&lt;br /&gt;
==Placing Models==&lt;br /&gt;
&lt;br /&gt;
* Click the blue box in the Palette Window to access the models that come with the game. The [[Model list]] shows pictures of many of the models available.&lt;br /&gt;
&lt;br /&gt;
* The [[Model]] page has more details on how to work with models.&lt;br /&gt;
&lt;br /&gt;
Tip 1: I had to change the Snap Options to make the models go where I wanted them. The settings I use were 0.10 for Snap to Grid and Snap Z Size. I also had to turn off Enable Snap to Surface whenever I wanted to change the vertical position of something (like creating the second floor of a building). Enable Snap to Surface is not applied globally, so once you turn it off and position an object vertically, turning it back on will not move that object unless you select it (or have it selected when you turn it back on).&lt;br /&gt;
&lt;br /&gt;
Tip 2: When placing premade cottages be aware that the door frames you can see attached to those buildings DO NOT have built in door hooks (see [[Area tutorial]] for information on placing doors). You can place a door frame model (for example, fhe_doorfrs_0) over the built in door frame to generate a door hook. The door frame model has to be placed from the Level Editor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Adding Vegetation and Wind==&lt;br /&gt;
&lt;br /&gt;
The [[Vegetation]] page includes a list with pictures of the various plants available for placement. If you do not see the plants once you place them with the Scatter Object Tool then you may need to adjust your SpeedTree Rendering Distance Selector. This is a drop-down that you will see in the Tool Bar. It lists the distances at which plants will be visible. I set it to Very Far and left it there.&lt;br /&gt;
&lt;br /&gt;
Each level can have one active wind object in it. The location of the wind object doesn't matter. The wind object defines how wind behaves on this level, which is used for such things as flapping banners and swaying trees.&lt;br /&gt;
&lt;br /&gt;
Image:Level editor wind object.png &lt;br /&gt;
&lt;br /&gt;
The Wind Object may be found by right clicking on Terrain World and selecting:&lt;br /&gt;
&lt;br /&gt;
Insert&amp;gt;New Wind Object&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Visual Effects (VFX)==&lt;br /&gt;
&lt;br /&gt;
Placeable visual effects like flames or smoke are considered to be art assets in the Dragon Age toolset, so you need to place them from within the Level Editor. &lt;br /&gt;
&lt;br /&gt;
The [[VFX Tutorial]] provides guidance on creating and placing visual effects.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Path finding and Obstructions==&lt;br /&gt;
&lt;br /&gt;
The path finding process lays down a grid of points that are marked &amp;quot;accessible&amp;quot; if they can be reached from a path finding start spot via passable terrain. This is essentially a flood-fill algorithm.&lt;br /&gt;
&lt;br /&gt;
You must create an [[Exportable area]] before you can generate any path finding data.&lt;br /&gt;
&lt;br /&gt;
* Click on the purple + in the tool bar ([[File:IconAddExportableArea.png]]). This will open an Area Properties window. The [[Level editor]] page has more details on this process, so I will just keep these steps very basic.&lt;br /&gt;
* Name your Exportable Area in the Layout Name field of the Area Properties window. The name of an exportable area layout is limited to seven characters. BioWare uses the following naming system:&lt;br /&gt;
** Three-letter prefix that describes the region or plot the layout is for. For example, &amp;quot;ost&amp;quot; for Ostagar and environs.&lt;br /&gt;
** Three-digit number that uniquely identifies the layout within that region. Increments of one hundred are commonly used for major areas to allow sub-regions to be grouped together.&lt;br /&gt;
** A single character identifying variants of the layout. For example, a &amp;quot;d&amp;quot; suffix for the &amp;quot;daytime&amp;quot; version of an exterior layout. &amp;quot;d&amp;quot; is also often used to mean &amp;quot;default&amp;quot;, for areas where day and night are irrelevant (deep in a cave, for example).&lt;br /&gt;
* Define your walkable area. Do this by clicking the Define Area button in the Area Properties window. The green box must include any areas that you want players to be able to walk. If you click in a corner of the level the green box will appear there. You can then expand it by dragging the corner.&lt;br /&gt;
* Close the Area Properties window.&lt;br /&gt;
&lt;br /&gt;
In most cases you will want to block off certain areas of your terrain.&lt;br /&gt;
* Turn on the Build Terrain Blocking tool.  It is the middle mountain icon.&lt;br /&gt;
* Using left-click to place and right-click to end chains/delete, place down blocks or 'walls' around areas you don't want the player to enter&lt;br /&gt;
* Be sure to provide visual clues if it isn't obvious why the player can't walk there.&lt;br /&gt;
&lt;br /&gt;
Now that you have your exportable area you can generate path finding data.&lt;br /&gt;
&lt;br /&gt;
* Place a Starting Point in your level. I found that path finding does not work if you place the Starting Point before you have an Exportable Area. To place a Starting Point click on Setup Start Point in the tool bar.&lt;br /&gt;
* Record the name of your Starting Point by clicking on it and looking at the name in the Object Inspector. Do not change the name - changing the name can prevent path finding from working.&lt;br /&gt;
* Click Exportable Area Properties in the tool bar to open the Area Properties window. Put the Start Point name in the appropriate  field and close the window.&lt;br /&gt;
&lt;br /&gt;
You should now be ready to generate pathfinding data by clicking on the Generate Pathfinding for Active Area button in the tool bar.&lt;br /&gt;
&lt;br /&gt;
==Converting Levels into Areas==&lt;br /&gt;
&lt;br /&gt;
Click on Do All Local Posts (you can avoid problems by generating a lightmap and pathfinding before doing local posts). This can be found in the menu at Tools&amp;gt;Export&amp;gt;Do All Local Posts&lt;br /&gt;
&lt;br /&gt;
Your level has now been converted and can be used to make an area. The [[Area tutorial]] will walk you through what to do next.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Tutorials]]&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Level_Editor_Tutorial&amp;diff=13669</id>
		<title>Level Editor Tutorial</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Level_Editor_Tutorial&amp;diff=13669"/>
				<updated>2010-09-19T16:01:53Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: Link to custom minimaps&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Building your room (Interior Level)=&lt;br /&gt;
How to create/lightmap a [[Level]] for use in an Interior [[Area]]:&lt;br /&gt;
Objective: Following along with this tutorial, you should be able to create a simple room from scratch in 10 minutes or less&lt;br /&gt;
&lt;br /&gt;
 This was lifted from a posting by St4rdog http://social.bioware.com/forum/1/topic/8/index/150840&lt;br /&gt;
 It needs some additional formatting love, but is as good starting place for people to create usable &lt;br /&gt;
 interior levels&lt;br /&gt;
&lt;br /&gt;
File &amp;gt; New &amp;gt; Level &amp;gt; Room Level&lt;br /&gt;
&lt;br /&gt;
* Click on &amp;quot;New Area&amp;quot; in top-left list &amp;gt; Object Inspector in bottom-right &amp;gt; Layout Name &amp;gt; anything under 8 characters no spaces or special characters (*,&amp;amp;,%, etc).&lt;br /&gt;
* Click the Setup Start Point icon, then click anywhere to make a start point.&lt;br /&gt;
* Select the Area, then add the Start Point Name in the Object Inspector.  &lt;br /&gt;
*Right-click in 3D view and select Insert &amp;gt; New Room.&lt;br /&gt;
*Click Models (blue box) in the Palette in the top-right. These folders contain everything such as floor tiles, walls, etc.&lt;br /&gt;
*Enable Grid Snap with the magnet icon to make sure they line up.&lt;br /&gt;
*The &amp;quot;prp&amp;quot; folder contains things like beds/barrels to clutter your Level.&lt;br /&gt;
 Hint: Use [[DATool]] (3rd party tool downloadable at http://social.bioware.com/project/41/ )to browse &lt;br /&gt;
 through these quickly to find the floors/walls you want.&lt;br /&gt;
*Any gaps you can see between models (such as wall sections) will be visible in game. When you have time to refine the layout, you can remove most hairline gaps by setting exact X Y Z coordinates in the toolset (though sometimes 0.99 or 1.01 looks better than 1.00). Larger gaps may require the use of tileset assets such as pillars. The black box tileset (blk) can be placed outside a room to cover up any defects.&lt;br /&gt;
 Hint: If you need lots of wall sections quickly, place one at a convenient location e.g. (0,0). Copy (Ctrl-C) then Paste (Ctrl-V)&lt;br /&gt;
 as many as you need. In the Object Inspector, change the coordinates of successive sections to (0,8), (0,16) etc or drag manually &lt;br /&gt;
 if you can do that quicker.&lt;br /&gt;
&lt;br /&gt;
 Note: If you get &amp;quot;Cannot spawn models into the selected parent object&amp;quot; when trying to place a model &lt;br /&gt;
 then you don't have &amp;quot;New Room&amp;quot; selected.&lt;br /&gt;
&lt;br /&gt;
==Working with multiple rooms==&lt;br /&gt;
&lt;br /&gt;
In general it is best to define each building room as a new room in the level. This becomes important when you work on lighting. To physically connect rooms you need to slide them together to get the doors to line up, they do not line up automatically. It takes some trial and error but becomes easier with practice.&lt;br /&gt;
&lt;br /&gt;
Use the Room Properties icon to specify which rooms are connected etc.&lt;br /&gt;
&lt;br /&gt;
==Pathfinding==&lt;br /&gt;
&lt;br /&gt;
Click the Generate Pathfinding icon. Green dots indicate where the player will be allowed to walk.&lt;br /&gt;
&lt;br /&gt;
For this to work, the area properties must name a valid start point, and it needs to be bounded by walls or other obstacles.&lt;br /&gt;
&lt;br /&gt;
 Hint: you may need to place another startpoint in any room that can't be reached from the main startpoint. That would apply, for example, to&lt;br /&gt;
 rooms reached by transition doors within the area.&lt;br /&gt;
&lt;br /&gt;
==Adding lights==&lt;br /&gt;
&lt;br /&gt;
Two very simple alternatives are given here. &lt;br /&gt;
&lt;br /&gt;
The first is minimal, with shadows. &lt;br /&gt;
&lt;br /&gt;
The second makes no shadows, but ensures that faces are never in darkness.     &lt;br /&gt;
&lt;br /&gt;
=== Method 1 ===&lt;br /&gt;
&lt;br /&gt;
* Right-click on &amp;quot;New Room&amp;quot; in top-left list &amp;gt; Insert &amp;gt; New Light&lt;br /&gt;
&lt;br /&gt;
* Move it up off the floor a little (e.g. Z = 2). In Object Inspector &amp;gt; Affects Characters TRUE &amp;gt; &amp;quot;Color Intensity&amp;quot; 2 or more &amp;gt; &amp;quot;Light Type&amp;quot; Point - Static (lc) &amp;gt; Choose any bright color (this light illuminates both the level and the characters).&lt;br /&gt;
&lt;br /&gt;
*Copy and paste. In Object Inspector &amp;gt;&amp;quot;Light Type&amp;quot; Ambient - Baked (you must have an ambient light, and this approach stops your shadows being pitch black) &amp;gt; Choose a dark blue colour and keep the Color Intensity under 2/3.&lt;br /&gt;
&lt;br /&gt;
 Note: I'm not sure what the mix of Baked/Static light is supposed to be. &lt;br /&gt;
 If you just put a Baked + Ambient it complains about not having Static, but if &lt;br /&gt;
 you put a Static + Ambient it seems to work fine, but the wiki says Static is &lt;br /&gt;
 the most expensive.&lt;br /&gt;
&lt;br /&gt;
=== Method 2 ===&lt;br /&gt;
&lt;br /&gt;
* Right-click on &amp;quot;New Room&amp;quot; in top-left list &amp;gt; Insert &amp;gt; New Light anywhere in the room.&lt;br /&gt;
&lt;br /&gt;
* Raise it up off the floor a little (e.g. Z = 2).&lt;br /&gt;
&lt;br /&gt;
* In Object Inspector &amp;gt; &amp;quot;Light Type&amp;quot; Ambient - Baked &amp;gt; Colour 1,1,0.86 &amp;gt; leave the colour intensity at 1 (this ambient light will light the level but not the characters).&lt;br /&gt;
&lt;br /&gt;
* Copy and paste. In Object Inspector &amp;gt; &amp;quot;Light Type&amp;quot; Point - Static &amp;gt; Affects Characters TRUE &amp;gt; Affects Level FALSE &amp;gt; Colour 0.70,0.70,0.65 &amp;gt; Colour Intensity 1.7 Point Radius 10000 (this will light your characters).&lt;br /&gt;
&lt;br /&gt;
* Copy and paste until you have 3-4 static character lights.&lt;br /&gt;
&lt;br /&gt;
* Arrange the character lights in a circle outside all of the rooms.&lt;br /&gt;
&lt;br /&gt;
=== Light Probe ===&lt;br /&gt;
&lt;br /&gt;
Whether you use method 1 or 2,&lt;br /&gt;
&lt;br /&gt;
* Right-click on &amp;quot;New Room&amp;quot; in top-left list &amp;gt; Insert &amp;gt; New Light Probe&lt;br /&gt;
&lt;br /&gt;
 Note : you need a light probe to make character and water lighting work properly. The exact position doesn't seem to matter much.&lt;br /&gt;
&lt;br /&gt;
==Rendering Lightmaps==&lt;br /&gt;
&lt;br /&gt;
*Press the Render Lightmaps icon (you need ActivePython 2.5 installed to default location). When it's done click the Display Lightmaps On/Off icon in the top-left to refresh the results.&lt;br /&gt;
*Uncheck the &amp;quot;View Models Fully Lit&amp;quot; icon in the lop-left. You should see shadows from any objects you've dropped in.&lt;br /&gt;
&lt;br /&gt;
 Note: Lightmap-atlas messages might appear the first time you render. That seems normal.&lt;br /&gt;
 Sometimes re-rendering the lightmaps messes them up badly when Display Lightmaps On/Off is on. It &lt;br /&gt;
 doesn't seem to use the latest lightmaps. Try pressing Display Lightmaps On/Off a few times to &lt;br /&gt;
 update it. If they're still messed up sometimes one of these fixes it (don't know which)&lt;br /&gt;
 unloading/reloading your Area or Level/changing your Area's layout property/posting your Level to &lt;br /&gt;
 Local.&lt;br /&gt;
&lt;br /&gt;
==Adding the Minimap==&lt;br /&gt;
&lt;br /&gt;
Select the area. Right click, then select Minimap &amp;gt; Minimap Selection Tool. The default green box appears. Right click on the area again, Minimap &amp;gt; Post Minimap to Local. It's possible to handcraft or refine the minimap, as detailed under [[Custom minimaps]]&lt;br /&gt;
&lt;br /&gt;
==Exporting==&lt;br /&gt;
&lt;br /&gt;
*Press the Do All Local Posts icon to the right of the lightmapping icons. It will export the name you typed into the &amp;quot;New Area&amp;quot; &amp;quot;Layout Name&amp;quot;. &lt;br /&gt;
*If that doesn't work, select the area then Edit &amp;gt; Post Selection To Local.&lt;br /&gt;
*If there's a complaint about walkable/player start then delete your old start then place a new one on a flat area.&lt;br /&gt;
*Save your .lvl file. It's not used by the game and the name/location doesn't matter. Only the exported/posted files are used.&lt;br /&gt;
&lt;br /&gt;
==Using this in an Area==&lt;br /&gt;
&lt;br /&gt;
File &amp;gt; New &amp;gt; Area &amp;gt; Any Name&lt;br /&gt;
&lt;br /&gt;
*In the Object Inspector &amp;gt; Area Layout you should get a &amp;quot;...&amp;quot; box (make sure it's Checked Out) &amp;gt; click then select your &amp;quot;Layout Name&amp;quot; which should now be there.&lt;br /&gt;
&lt;br /&gt;
* Now you have a pretty lightmapped level inside an area.&lt;br /&gt;
&lt;br /&gt;
=Building your terrain (Exterior Level)=&lt;br /&gt;
How to create/lightmap a [[Level]] for use in an Exterior [[Area]]:&lt;br /&gt;
Objective: Following along with this tutorial, you should be able to create a simple terrain from scratch.&lt;br /&gt;
&lt;br /&gt;
File&amp;gt;New&amp;gt;Level&lt;br /&gt;
&lt;br /&gt;
* Choose Terrain (Landscape) Level and then click Next.&lt;br /&gt;
&lt;br /&gt;
* Accept the default values for the purpose of this tutorial and click Next and then click Finish. You can learn more about what the different terrain options do at the [[Level editor]] page.&lt;br /&gt;
&lt;br /&gt;
You should now see a flat, dark piece of terrain. To move around you hold down the mouse wheel. If you want to rotate the view press the Alt key while holding down the mouse wheel. You will want some light so you can see what you are doing, so we will generate a light source next.&lt;br /&gt;
&lt;br /&gt;
Tip: When choosing the size of your terrain level think about where you are going to put horizon and vista objects, like distant mountains and tree lines. You may need to allow for extra space around your adventure area to place those items.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Grid Size==&lt;br /&gt;
&lt;br /&gt;
If you want to work with a larger grid than the one provided by default you can change the grid size by going to: &lt;br /&gt;
&lt;br /&gt;
Tools/Options/Level Editor/Grid Square Size.&lt;br /&gt;
&lt;br /&gt;
This will not change the actual dimensions of the terrain level that you created, it only changes the size of the squares in the grid.&lt;br /&gt;
&lt;br /&gt;
==Define an area==&lt;br /&gt;
&lt;br /&gt;
Must be done before rendering the lightmap.&lt;br /&gt;
&lt;br /&gt;
* Click on the purple [[File:Purpleplus.png]]-sign and click Define Area. Start in one corner and draw the green square to define the area that you will export.&lt;br /&gt;
* Fill in the box Layout Name, max seven characters.&lt;br /&gt;
* Fill in the box Name.&lt;br /&gt;
&lt;br /&gt;
==Lighting==&lt;br /&gt;
&lt;br /&gt;
* Right click on Terrain World to the upper left and choose Insert&amp;gt;New Light. This will spawn a light source in your area.  Make sure you change the Light Type to Ambient - Baked (L).  Be sure to click on the Render Lightmaps button if you want to see how your ambient light is working.&lt;br /&gt;
&lt;br /&gt;
Now that the terrain is lit we can modify it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Modifying Terrain==&lt;br /&gt;
&lt;br /&gt;
The [[Terrain mesh]] tools allow you to modify the terrain by changing elevations, smoothing edges, flatting terrain, or painting textures.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Water==&lt;br /&gt;
&lt;br /&gt;
First use the [[Terrain mesh]] tools to make a hole.  It doesn't have to be deep.  Then right-click on Terrain world and select Insert -&amp;gt; New Water Mesh.  Double Click on the Water Mesh to zoom to it.  By default it gets placed in a corner.  Using the 3 Axis Movement tool [[File:moveTool.png]] grab the water and drag it to your hole.  Depending on the size of the hole, you might have to adjust the water mesh size by changing the Size X and Size Y property values.  Once you have the mesh placed, it's time to create the light probe.  Right-click near the water mesh and select Insert -&amp;gt; New Light Probe.  Using the move tool again, drag the light probe so that is roughly centered over the water mesh and slightly above it.  Click on Render Lightmaps, then Render Light Probs.  You might have to toggle Display Lightmaps, but you should now see your water looking like water and reflecting things around it.&lt;br /&gt;
&lt;br /&gt;
See also [[Bug: Water plane missing in-game]] for an important workaround.&lt;br /&gt;
&lt;br /&gt;
==Placing Models==&lt;br /&gt;
&lt;br /&gt;
* Click the blue box in the Palette Window to access the models that come with the game. The [[Model list]] shows pictures of many of the models available.&lt;br /&gt;
&lt;br /&gt;
* The [[Model]] page has more details on how to work with models.&lt;br /&gt;
&lt;br /&gt;
Tip 1: I had to change the Snap Options to make the models go where I wanted them. The settings I use were 0.10 for Snap to Grid and Snap Z Size. I also had to turn off Enable Snap to Surface whenever I wanted to change the vertical position of something (like creating the second floor of a building). Enable Snap to Surface is not applied globally, so once you turn it off and position an object vertically, turning it back on will not move that object unless you select it (or have it selected when you turn it back on).&lt;br /&gt;
&lt;br /&gt;
Tip 2: When placing premade cottages be aware that the door frames you can see attached to those buildings DO NOT have built in door hooks (see [[Area tutorial]] for information on placing doors). You can place a door frame model (for example, fhe_doorfrs_0) over the built in door frame to generate a door hook. The door frame model has to be placed from the Level Editor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Adding Vegetation and Wind==&lt;br /&gt;
&lt;br /&gt;
The [[Vegetation]] page includes a list with pictures of the various plants available for placement. If you do not see the plants once you place them with the Scatter Object Tool then you may need to adjust your SpeedTree Rendering Distance Selector. This is a drop-down that you will see in the Tool Bar. It lists the distances at which plants will be visible. I set it to Very Far and left it there.&lt;br /&gt;
&lt;br /&gt;
Each level can have one active wind object in it. The location of the wind object doesn't matter. The wind object defines how wind behaves on this level, which is used for such things as flapping banners and swaying trees.&lt;br /&gt;
&lt;br /&gt;
Image:Level editor wind object.png &lt;br /&gt;
&lt;br /&gt;
The Wind Object may be found by right clicking on Terrain World and selecting:&lt;br /&gt;
&lt;br /&gt;
Insert&amp;gt;New Wind Object&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Visual Effects (VFX)==&lt;br /&gt;
&lt;br /&gt;
Placeable visual effects like flames or smoke are considered to be art assets in the Dragon Age toolset, so you need to place them from within the Level Editor. &lt;br /&gt;
&lt;br /&gt;
The [[VFX Tutorial]] provides guidance on creating and placing visual effects.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Path finding and Obstructions==&lt;br /&gt;
&lt;br /&gt;
The path finding process lays down a grid of points that are marked &amp;quot;accessible&amp;quot; if they can be reached from a path finding start spot via passable terrain. This is essentially a flood-fill algorithm.&lt;br /&gt;
&lt;br /&gt;
You must create an [[Exportable area]] before you can generate any path finding data.&lt;br /&gt;
&lt;br /&gt;
* Click on the purple + in the tool bar ([[File:IconAddExportableArea.png]]). This will open an Area Properties window. The [[Level editor]] page has more details on this process, so I will just keep these steps very basic.&lt;br /&gt;
* Name your Exportable Area in the Layout Name field of the Area Properties window. The name of an exportable area layout is limited to seven characters. BioWare uses the following naming system:&lt;br /&gt;
** Three-letter prefix that describes the region or plot the layout is for. For example, &amp;quot;ost&amp;quot; for Ostagar and environs.&lt;br /&gt;
** Three-digit number that uniquely identifies the layout within that region. Increments of one hundred are commonly used for major areas to allow sub-regions to be grouped together.&lt;br /&gt;
** A single character identifying variants of the layout. For example, a &amp;quot;d&amp;quot; suffix for the &amp;quot;daytime&amp;quot; version of an exterior layout. &amp;quot;d&amp;quot; is also often used to mean &amp;quot;default&amp;quot;, for areas where day and night are irrelevant (deep in a cave, for example).&lt;br /&gt;
* Define your walkable area. Do this by clicking the Define Area button in the Area Properties window. The green box must include any areas that you want players to be able to walk. If you click in a corner of the level the green box will appear there. You can then expand it by dragging the corner.&lt;br /&gt;
* Close the Area Properties window.&lt;br /&gt;
&lt;br /&gt;
In most cases you will want to block off certain areas of your terrain.&lt;br /&gt;
* Turn on the Build Terrain Blocking tool.  It is the middle mountain icon.&lt;br /&gt;
* Using left-click to place and right-click to end chains/delete, place down blocks or 'walls' around areas you don't want the player to enter&lt;br /&gt;
* Be sure to provide visual clues if it isn't obvious why the player can't walk there.&lt;br /&gt;
&lt;br /&gt;
Now that you have your exportable area you can generate path finding data.&lt;br /&gt;
&lt;br /&gt;
* Place a Starting Point in your level. I found that path finding does not work if you place the Starting Point before you have an Exportable Area. To place a Starting Point click on Setup Start Point in the tool bar.&lt;br /&gt;
* Record the name of your Starting Point by clicking on it and looking at the name in the Object Inspector. Do not change the name - changing the name can prevent path finding from working.&lt;br /&gt;
* Click Exportable Area Properties in the tool bar to open the Area Properties window. Put the Start Point name in the appropriate  field and close the window.&lt;br /&gt;
&lt;br /&gt;
You should now be ready to generate pathfinding data by clicking on the Generate Pathfinding for Active Area button in the tool bar.&lt;br /&gt;
&lt;br /&gt;
==Converting Levels into Areas==&lt;br /&gt;
&lt;br /&gt;
Click on Do All Local Posts (you can avoid problems by generating a lightmap and pathfinding before doing local posts). This can be found in the menu at Tools&amp;gt;Export&amp;gt;Do All Local Posts&lt;br /&gt;
&lt;br /&gt;
Your level has now been converted and can be used to make an area. The [[Area tutorial]] will walk you through what to do next.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Tutorials]]&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Custom_minimaps&amp;diff=13668</id>
		<title>Custom minimaps</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Custom_minimaps&amp;diff=13668"/>
				<updated>2010-09-19T16:00:51Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It's possible to use a handcrafted minimap texture instead of the one posted by the level editor, which can be quite large and non-stylized. Sometimes you may not even have the LVL file to export a minimap with, necessitating this procedure. Take for instance the ''arena2'' level available in the toolset. There is no accompanying LVL file released by BioWare and this level has no associated minimap. &lt;br /&gt;
&lt;br /&gt;
Let's presume you wanted to use this ''arena2'' level for one of your areas (although there are some culling issues by the doors). The files you'll need to create can go under ''addins\[UID]\core\override\arena2\minimap'' or elsewhere as appropriate, but will do for working with the toolset. These files would be ''arena2_mmap_ph.dds'' and ''arena2_mmi.gff'', or &amp;lt;level name&amp;gt;_mmap_ph.dds and &amp;lt;level name&amp;gt;_mmi.gff. Perhaps the easiest way to start creating your own minimap image is create a test area with the desired area layout, turn on real lighting or whatever other settings, and then use print screen to capture and save the image as a BMP. After you save your first screen shot, add two waypoints: one to the bottom left of your area and one to the top right. These two waypoint coordinates will be used constrain your minimap area. Record the waypoints' position coordinates as we'll need them for the arena2_mmi.gff file later. Take another screen shot with these two waypoints visible, as we'll use them as a reference when cropping the image. Also, keep the area at its default orientation when you open it so the screen shot will match up in game. TODO: determine whether Area Map North affects this at all.&lt;br /&gt;
&lt;br /&gt;
Using the waypoints as a measuring guide, crop the first screen shot from the bottom left waypoint to the top right waypoint and then save the file. Now open it up in a proper image editing program such as Photoshop and rescale the image so it can fit in a power-of-two sized texture. E.g., if your cropped image is 1280x1024, then you may want to use a 1024x1024 texture and shrink the image to 1024x819, as the next power-of-two sized texture is 2048x2048 which would be somewhat wasteful. Now within the power-of-two texture, align your actual minimap texture to the top left corner. Now would be a good time to record another value you'll need for ''arena2_mmi.gff'': basically how much of the texture is used. If your actual minimap is 1024x819 in a 1024x1024 texture, then you'll want 1024/1024=1 and 819/1024=0.799805 for ''ENV_MINIMAP_TEXTURE_MAP_COORDS'', which we'll get to below. Now you can export the file as a DDS texture, which may require a plugin.&lt;br /&gt;
&lt;br /&gt;
So now we have ''addins\[UID]\core\override\arena2\minimap\arena2_mmap_ph.dds'' finished, and now we need to edit the GFF for it. We'll use a preexisting file to edit in the toolset. Open the following file in the toolset ''C:\Program Files\Dragon Age\packages\core\env\brc505d\brc505d.rim'' and extract brc505d_mmi.gff. Now rename this file ''addins\[UID]\core\override\arena2\minimap\arena2_mmi.gff'' and open it up in the toolset for editing.&lt;br /&gt;
&lt;br /&gt;
Edit ''ENV_MINIMAP_TEXTURE_MAP_COORDS'' to 1,0.799805,1 as calculated for the example minimap above, with the third coordinate always 1.&lt;br /&gt;
Edit ''ENV_MINIMAP_LOWER_LEFT_POINT'' to the coordinates of your lower left waypoint, but with the z-value being -500.&lt;br /&gt;
Edit ''ENV_MINIMAP_UPPER_RIGHT_POINT'' to the coordinates of your upper right waypoint, but with the z-value being 500.&lt;br /&gt;
&lt;br /&gt;
You can seemingly round off the decimal for the lower left and upper right coordinates, as the map and minimap don't seem to require that much precision, and the toolset isn't that precise either when creating the GFF file in the first place.&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	<entry>
		<id>http://www.datoolset.net/mw/index.php?title=Custom_minimaps&amp;diff=13667</id>
		<title>Custom minimaps</title>
		<link rel="alternate" type="text/html" href="http://www.datoolset.net/mw/index.php?title=Custom_minimaps&amp;diff=13667"/>
				<updated>2010-09-19T15:56:29Z</updated>
		
		<summary type="html">&lt;p&gt;FollowTheGourd: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;It's possible to use a handcrafted minimap texture instead of the one posted by the level editor, which can be quite large and non-stylized. Sometimes you may not even have the LVL file to export a minimap with, necessitating this procedure. Take for instance the ''arena2'' level available in the toolset. There is no accompanying LVL file released by BioWare and this level has no associated minimap. &lt;br /&gt;
&lt;br /&gt;
Let's presume you wanted to use this ''arena2'' level for one of your areas (although there are some culling issues by the doors). The files you'll need to create can go under ''addins\[UID]\core\override\arena2\minimap'' or elsewhere as appropriate, but will do for working with the toolset. These files would be ''arena2_mmap_ph.dds'' and ''arena2_mmi.gff'', or &amp;lt;level name&amp;gt;_mmap_ph.dds and &amp;lt;level name&amp;gt;_mmi.gff. Perhaps the easiest way to start creating your own minimap image is create a test area with the desired area layout, turn on real lighting or whatever other settings, and then use print screen to capture and save the image as a BMP. After you save your first screen shot, add two waypoints: one to the bottom left of your area and one to the top right. These two waypoint coordinates will be used constrain your minimap area. Record the waypoints' position coordinates as we'll need them for the arena2_mmi.gff file later. Take another screen shot with these two waypoints visible, as we'll use them as a reference when cropping the image.&lt;br /&gt;
&lt;br /&gt;
Using the waypoints as a measuring guide, crop the first screen shot from the bottom left waypoint to the top right waypoint and then save the file. Now open it up in a proper image editing program such as Photoshop and rescale the image so it can fit in a power-of-two sized texture. E.g., if your cropped image is 1280x1024, then you may want to use a 1024x1024 texture and shrink the image to 1024x819, as the next power-of-two sized texture is 2048x2048 which would be somewhat wasteful. Now within the power-of-two texture, align your actual minimap texture to the top left corner. Now would be a good time to record another value you'll need for ''arena2_mmi.gff'': basically how much of the texture is used. If your actual minimap is 1024x819 in a 1024x1024 texture, then you'll want 1024/1024=1 and 819/1024=0.799805 for ''ENV_MINIMAP_TEXTURE_MAP_COORDS'', which we'll get to below. Now you can export the file as a DDS texture, which may require a plugin.&lt;br /&gt;
&lt;br /&gt;
So now we have ''addins\[UID]\core\override\arena2\minimap\arena2_mmap_ph.dds'' finished, and now we need to edit the GFF for it. We'll use a preexisting file to edit in the toolset. Open the following file in the toolset ''C:\Program Files\Dragon Age\packages\core\env\brc505d\brc505d.rim'' and extract brc505d_mmi.gff. Now rename this file ''addins\[UID]\core\override\arena2\minimap\arena2_mmi.gff'' and open it up in the toolset for editing.&lt;br /&gt;
&lt;br /&gt;
Edit ''ENV_MINIMAP_TEXTURE_MAP_COORDS'' to 1,0.799805,1 as calculated for the example minimap above, with the third coordinate always 1.&lt;br /&gt;
Edit ''ENV_MINIMAP_LOWER_LEFT_POINT'' to the coordinates of your lower left waypoint, but with the z-value being -500.&lt;br /&gt;
Edit ''ENV_MINIMAP_UPPER_RIGHT_POINT'' to the coordinates of your upper right waypoint, but with the z-value being 500.&lt;/div&gt;</summary>
		<author><name>FollowTheGourd</name></author>	</entry>

	</feed>