/// <summary>
        /// Create a new instanced area, or return one from the free list if
        /// there was a free instance.
        /// </summary>
        /// <param name="TemplateArea">Supplies the template area object id.
        /// </param>
        /// <returns>The instanced area, else OBJECT_INVALID.</returns>
        private uint CreateAreaInstance(uint TemplateArea)
        {
            Stack <uint> FreeList;

            if (InstancedAreaFreeList.TryGetValue(TemplateArea, out FreeList))
            {
                if (FreeList.Count != 0)
                {
                    return(FreeList.Pop());
                }
            }

            uint AreaObject = CreateInstancedAreaFromSource(TemplateArea);

            if (AreaObject == OBJECT_INVALID)
            {
                return(OBJECT_INVALID);
            }

            //
            // We've created a new area, so inform the AI subsystem that there
            // is a new area to add to its representation.
            //

            ClearScriptParams();
            AddScriptParameterInt(200); // AREA_ON_INSTANCE_CREATE
            ExecuteScriptEnhanced("ACR_CreatureBehavior", AreaObject, TRUE);

            return(AreaObject);
        }
        /// <summary>
        /// Place an instanced area on the internal free list for its
        /// associated template area.
        /// </summary>
        /// <param name="InstancedArea">Supplies the instanced area to place on
        /// the free list.</param>
        private void ReleaseInstancedArea(uint InstancedArea)
        {
            uint         TemplateArea = GetLocalObject(InstancedArea, "ACR_AREA_INSTANCE_PARENT_AREA");
            Stack <uint> FreeList;

            if (!InstancedAreaFreeList.TryGetValue(TemplateArea, out FreeList))
            {
                FreeList = new Stack <uint>();
                InstancedAreaFreeList.Add(TemplateArea, FreeList);
            }

            FreeList.Push(InstancedArea);
        }