Index: /trunk/src/game/WaypointMovementGenerator.cpp
===================================================================
--- /trunk/src/game/WaypointMovementGenerator.cpp (revision 44)
+++ /trunk/src/game/WaypointMovementGenerator.cpp (revision 98)
@@ -166,8 +166,7 @@
                         creature.Say(behavior->text[0].c_str(), 0, 0);
                 }
-
-                i_hasDone[idx] = true;
-                MovementInform(creature);
             }                                               // wpBehaviour found
+            i_hasDone[idx] = true;
+            MovementInform(creature);
         }                                                   // HasDone == false
     }                                                       // i_creature.IsStopped()
Index: /trunk/src/game/SpellMgr.cpp
===================================================================
--- /trunk/src/game/SpellMgr.cpp (revision 87)
+++ /trunk/src/game/SpellMgr.cpp (revision 98)
@@ -1041,4 +1041,7 @@
         if(spellInfo_1->SpellFamilyFlags == spellInfo_2->SpellFamilyFlags)
             return true;
+        if(spellInfo_1->SpellFamilyName == SPELLFAMILY_SHAMAN)
+            if(IsElementalShield(spellInfo_1) && IsElementalShield(spellInfo_2))
+                return true;
         //Corruption & Seed of corruption
         if(spellInfo_1->SpellFamilyName == SPELLFAMILY_WARLOCK)
Index: /trunk/src/bindings/scripts/scripts/zone/gruuls_lair/boss_gruul.cpp
===================================================================
--- /trunk/src/bindings/scripts/scripts/zone/gruuls_lair/boss_gruul.cpp (revision 90)
+++ /trunk/src/bindings/scripts/scripts/zone/gruuls_lair/boss_gruul.cpp (revision 98)
@@ -67,5 +67,12 @@
 
         if(pInstance)
-            pInstance->SetData(DATA_GRUULEVENT, 0);
+               {
+         pInstance->SetData(DATA_GRUULEVENT, NOT_STARTED);
+
+                GameObject* Door = NULL;
+                Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GRUULDOOR));
+                if(Door)
+                        Door->SetGoState(0);
+               }
     }
 
@@ -73,5 +80,13 @@
     {
         if(pInstance)
-            pInstance->SetData(DATA_GRUULEVENT, 1);
+               {
+                       pInstance->SetData(DATA_GRUULEVENT, DONE);
+                       
+                       GameObject* Door = NULL;
+                       Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GRUULDOOR));
+                       if(Door)
+                               Door->SetGoState(0);
+
+               }
     }
 
@@ -80,7 +95,15 @@
 
         DoYell(SAY_AGGRO,LANG_UNIVERSAL,NULL);
+               DoZoneInCombat();
 
         if(pInstance)
-            pInstance->SetData(DATA_GRUULEVENT, 1);
+               {
+            pInstance->SetData(DATA_GRUULEVENT, IN_PROGRESS);
+
+                       GameObject* Door = NULL;
+            Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_GRUULDOOR));
+            if(Door)
+                Door->SetGoState(1);
+               }
     }
 
Index: /trunk/src/bindings/scripts/scripts/zone/gruuls_lair/boss_high_king_maulgar.cpp
===================================================================
--- /trunk/src/bindings/scripts/scripts/zone/gruuls_lair/boss_high_king_maulgar.cpp (revision 90)
+++ /trunk/src/bindings/scripts/scripts/zone/gruuls_lair/boss_high_king_maulgar.cpp (revision 98)
@@ -17,6 +17,6 @@
 /* ScriptData
 SDName: Boss_High_King_Maulgar
-SD%Complete: 80
-SDComment: Verify that the script is working properly
+SD%Complete: 90
+SDComment: Correct timers, after whirlwind melee attack bug, prayer of healing
 SDCategory: Gruul's Lair
 EndScriptData */
@@ -25,33 +25,41 @@
 #include "def_gruuls_lair.h"
 
-#define SOUND_AGGRO              11367                      //"Gronn are the real power in outland."
-
-#define SOUND_ENRAGE             11368                      //"You will not defeat the hand of Gruul!"
-
-#define SOUND_OGRE_DEATH1        11369                      //"You won't kill next one so easy!"
-#define SOUND_OGRE_DEATH2        11370                      //"Pah! Does not prove anything!"
-#define SOUND_OGRE_DEATH3        11371                      //"I'm not afraid of you."
-#define SOUND_OGRE_DEATH4        11372                      //"Good, now you fight me!"
-
-#define SOUND_SLAY1              11373                      //"You not so tough afterall!"
-#define SOUND_SLAY2              11374                      //"Aha ha ha ha!"
-#define SOUND_SLAY3              11375                      //"Mulgar is king!"
-
-#define SOUND_DEATH              11376                      //"Gruul ...will crush you..."
+//Sounds
+#define SOUND_AGGRO             11367                      //"Gronn are the real power in outland."
+#define SOUND_ENRAGE            11368                      //"You will not defeat the hand of Gruul!"
+#define SOUND_OGRE_DEATH1       11369                      //"You won't kill next one so easy!"
+#define SOUND_OGRE_DEATH2       11370                      //"Pah! Does not prove anything!"
+#define SOUND_OGRE_DEATH3       11371                      //"I'm not afraid of you."
+#define SOUND_OGRE_DEATH4       11372                      //"Good, now you fight me!"
+#define SOUND_SLAY1             11373                      //"You not so tough afterall!"
+#define SOUND_SLAY2             11374                      //"Aha ha ha ha!"
+#define SOUND_SLAY3             11375                      //"Mulgar is king!"
+#define SOUND_DEATH             11376                      //"Gruul ...will crush you..."
 
 // High King Maulgar
-#define SPELL_ARCING_SMASH       39144
-#define SPELL_MIGHTY_BLOW        33230
-#define SPELL_WHIRLWIND          33238
-#define SPELL_ENRAGE             34970
-
-// Council spells
+#define SPELL_ARCING_SMASH      39144
+#define SPELL_MIGHTY_BLOW       33230
+#define SPELL_WHIRLWIND         33238
+#define SPELL_BERSERKER_C              26561
+#define SPELL_ROAR                             16508
+#define SPELL_FLURRY                   33232
+
+// Olm the Summoner
 #define SPELL_DARK_DECAY        33129
+#define SPELL_DEATH_COIL               33130
+#define SPELL_SUMMON_WFH               33131
+
+//Kiggler the Craed
 #define SPELL_GREATER_POLYMORPH 33173
 #define SPELL_LIGHTNING_BOLT    36152
 #define SPELL_ARCANE_SHOCK      33175
 #define SPELL_ARCANE_EXPLOSION  33237
+
+//Blindeye the Seer
 #define SPELL_GREATER_PW_SHIELD 33147
 #define SPELL_HEAL              33144
+#define SPELL_PRAYER_OH                        33152
+
+//Krosh Firehand
 #define SPELL_GREATER_FIREBALL  33051
 #define SPELL_SPELLSHIELD       33054
@@ -75,4 +83,5 @@
     uint32 Whirlwind_Timer;
     uint32 Charging_Timer;
+       uint32 Roar_Timer;
 
     bool Phase2;
@@ -86,4 +95,6 @@
         Whirlwind_Timer = 30000;
         Charging_Timer = 0;
+               Roar_Timer = 0;
+
         Phase2 = false;
 
@@ -104,5 +115,5 @@
         //reset encounter
         if (pInstance)
-            pInstance->SetData(DATA_MAULGAREVENT, 0);
+            pInstance->SetData(DATA_MAULGAREVENT, NOT_STARTED);
     }
 
@@ -122,6 +133,25 @@
 
         if (pInstance)
-            pInstance->SetData(DATA_MAULGAREVENT, 0);
-    }
+               {
+            pInstance->SetData(DATA_MAULGAREVENT, DONE);
+
+                       GameObject* Door = NULL;
+                       Door = GameObject::GetGameObject((*m_creature), pInstance->GetData64(DATA_MAULGARDOOR));
+                       if(Door)
+                               Door->SetGoState(0);
+               }
+    }
+
+       void AddDeath()
+       {
+               switch(rand()%3)
+               {
+               case 0: DoPlaySoundToSet(m_creature, SOUND_OGRE_DEATH1);break;
+               case 1: DoPlaySoundToSet(m_creature, SOUND_OGRE_DEATH2);break;
+               case 2: DoPlaySoundToSet(m_creature, SOUND_OGRE_DEATH3);break;
+               case 3: DoPlaySoundToSet(m_creature, SOUND_OGRE_DEATH4);break;
+               }
+       }
+
 
     void Aggro(Unit *who) { StartEvent(who); }
@@ -146,5 +176,7 @@
 
         pInstance->SetData64(DATA_MAULGAREVENT_TANK, who->GetGUID());
-        pInstance->SetData(DATA_MAULGAREVENT, 1);
+        pInstance->SetData(DATA_MAULGAREVENT, IN_PROGRESS);
+
+               DoZoneInCombat();
     }
 
@@ -182,9 +214,9 @@
 
         //Whirlwind_Timer
-        if (Whirlwind_Timer < diff)
-        {
-            DoCast(m_creature->getVictim(), SPELL_WHIRLWIND);
-            Whirlwind_Timer = 55000;
-        }else Whirlwind_Timer -= diff;
+               if (Whirlwind_Timer < diff)
+               {
+                       DoCast(m_creature->getVictim(), SPELL_WHIRLWIND);
+                       Whirlwind_Timer = 55000;
+               }else Whirlwind_Timer -= diff;
 
         //MightyBlow_Timer
@@ -200,4 +232,8 @@
             Phase2 = true;
             DoPlaySoundToSet(m_creature, SOUND_ENRAGE);
+                       DoCast(m_creature, SPELL_FLURRY);
+
+                       m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 0);
+               m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0);                
         }
 
@@ -211,7 +247,15 @@
                 if(target)
                     DoStartAttackAndMovement(target);
+                                       DoCast(target, SPELL_BERSERKER_C);      
 
                 Charging_Timer = 20000;
             }else Charging_Timer -= diff;
+
+                       //Intimidating Roar
+                       if(Roar_Timer < diff)
+                       {
+                               DoCast(m_creature, SPELL_ROAR);
+                               Roar_Timer = 40000+(rand()%10000);
+                       }else Roar_Timer -= diff;
         }
 
@@ -231,4 +275,5 @@
     uint32 DarkDecay_Timer;
     uint32 Summon_Timer;
+       uint32 DeathCoil_Timer;
 
     ScriptedInstance* pInstance;
@@ -238,8 +283,9 @@
         DarkDecay_Timer = 10000;
         Summon_Timer = 15000;
+               DeathCoil_Timer = 20000;
 
         //reset encounter
         if (pInstance)
-            pInstance->SetData(DATA_MAULGAREVENT, 0);
+            pInstance->SetData(DATA_MAULGAREVENT, NOT_STARTED);
     }
 
@@ -249,20 +295,19 @@
         {
             pInstance->SetData64(DATA_MAULGAREVENT_TANK, who->GetGUID());
-            pInstance->SetData(DATA_MAULGAREVENT, 1);
-        }
-    }
-
-    float DoCalculateRandomLocation()
-    {
-        float Loc;
-        float Rand = rand()%8;
-
-        switch(rand()%2)
-        {
-            case 0: Loc = 0 + Rand; break;
-            case 1: Loc = 0 - Rand; break;
-        }
-        return Loc;
-    }
+            pInstance->SetData(DATA_MAULGAREVENT, IN_PROGRESS);
+        }
+    }
+
+       void JustDied(Unit* Killer)
+       {
+               if(pInstance)
+        {
+            Creature *Maulgar = NULL;
+            Maulgar = (Creature*)(Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_MAULGAR)));
+
+            if(Maulgar)
+                ((boss_high_king_maulgarAI*)Maulgar->AI())->AddDeath();
+        }
+       }
 
     void UpdateAI(const uint32 diff)
@@ -297,8 +342,18 @@
         if(Summon_Timer < diff)
         {
-            Creature *Add = NULL;
-            Add = DoSpawnCreature(18847, DoCalculateRandomLocation(), DoCalculateRandomLocation(), 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
-            Summon_Timer = 30000;
+                       DoCast(m_creature, SPELL_SUMMON_WFH);
+                       Summon_Timer = 30000;
         }else Summon_Timer -= diff;
+
+               //DeathCoil Timer /need correct timer
+               if(DeathCoil_Timer < diff)
+               {
+                       Unit* target = NULL;
+                       target = SelectUnit(SELECT_TARGET_RANDOM, 0);
+                       if(target)
+                       DoCast(target, SPELL_DEATH_COIL);
+                       DeathCoil_Timer = 20000;
+               }else DeathCoil_Timer -= diff;
+
 
         DoMeleeAttackIfReady();
@@ -315,5 +370,5 @@
     }
 
-    uint32 GreatherPolymorph_Timer;
+    uint32 GreaterPolymorph_Timer;
     uint32 LightningBolt_Timer;
     uint32 ArcaneShock_Timer;
@@ -324,5 +379,5 @@
     void Reset()
     {
-        GreatherPolymorph_Timer = 5000;
+        GreaterPolymorph_Timer = 5000;
         LightningBolt_Timer = 10000;
         ArcaneShock_Timer = 20000;
@@ -331,5 +386,5 @@
         //reset encounter
         if (pInstance)
-            pInstance->SetData(DATA_MAULGAREVENT, 0);
+            pInstance->SetData(DATA_MAULGAREVENT, NOT_STARTED);
     }
 
@@ -339,8 +394,19 @@
         {
             pInstance->SetData64(DATA_MAULGAREVENT_TANK, who->GetGUID());
-            pInstance->SetData(DATA_MAULGAREVENT, 1);
-        }
-    }
-
+            pInstance->SetData(DATA_MAULGAREVENT, IN_PROGRESS);
+        }
+    }
+
+       void JustDied(Unit* Killer)
+       {
+               if(pInstance)
+        {
+            Creature *Maulgar = NULL;
+            Maulgar = (Creature*)(Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_MAULGAR)));
+
+            if(Maulgar)
+                ((boss_high_king_maulgarAI*)Maulgar->AI())->AddDeath();
+        }
+       }
     void MoveInLineOfSight(Unit *who)
     {
@@ -362,5 +428,5 @@
                     {
                         pInstance->SetData64(DATA_MAULGAREVENT_TANK, who->GetGUID());
-                        pInstance->SetData(DATA_MAULGAREVENT, 1);
+                        pInstance->SetData(DATA_MAULGAREVENT, IN_PROGRESS);
                     }
                 }
@@ -390,6 +456,6 @@
             EnterEvadeMode();
 
-        //GreaterPolymorph_Timer / disabled: it makes you fall under the texture / if you've got vmaps feel free to uncomment this
-        /*if(GreaterPolymorph_Timer < diff)
+        //GreaterPolymorph_Timer
+        if(GreaterPolymorph_Timer < diff)
         {
             Unit *target = SelectUnit(SELECT_TARGET_RANDOM, 0);
@@ -398,5 +464,5 @@
 
             GreaterPolymorph_Timer = 20000;
-        }else GreaterPolymorph_Timer -= diff;*/
+        }else GreaterPolymorph_Timer -= diff;
 
         //LightningBolt_Timer
@@ -446,5 +512,5 @@
         //reset encounter
         if (pInstance)
-            pInstance->SetData(DATA_MAULGAREVENT, 0);
+            pInstance->SetData(DATA_MAULGAREVENT, NOT_STARTED);
     }
 
@@ -454,7 +520,19 @@
         {
             pInstance->SetData64(DATA_MAULGAREVENT_TANK, who->GetGUID());
-            pInstance->SetData(DATA_MAULGAREVENT, 1);
-        }
-    }
+            pInstance->SetData(DATA_MAULGAREVENT, IN_PROGRESS);
+        }
+    }
+
+       void JustDied(Unit* Killer)
+       {
+               if(pInstance)
+        {
+            Creature *Maulgar = NULL;
+            Maulgar = (Creature*)(Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_MAULGAR)));
+
+            if(Maulgar)
+                ((boss_high_king_maulgarAI*)Maulgar->AI())->AddDeath();
+        }
+       }
 
     void MoveInLineOfSight(Unit *who)
@@ -477,5 +555,5 @@
                     {
                         pInstance->SetData64(DATA_MAULGAREVENT_TANK, who->GetGUID());
-                        pInstance->SetData(DATA_MAULGAREVENT, 1);
+                        pInstance->SetData(DATA_MAULGAREVENT, IN_PROGRESS);
                     }
                 }
@@ -546,5 +624,5 @@
         //reset encounter
         if (pInstance)
-            pInstance->SetData(DATA_MAULGAREVENT, 0);
+            pInstance->SetData(DATA_MAULGAREVENT, NOT_STARTED);
     }
 
@@ -554,8 +632,19 @@
         {
             pInstance->SetData64(DATA_MAULGAREVENT_TANK, who->GetGUID());
-            pInstance->SetData(DATA_MAULGAREVENT, 1);
-        }
-    }
-
+            pInstance->SetData(DATA_MAULGAREVENT, IN_PROGRESS);
+        }
+    }
+
+       void JustDied(Unit* Killer)
+       {
+               if(pInstance)
+        {
+            Creature *Maulgar = NULL;
+            Maulgar = (Creature*)(Unit::GetUnit((*m_creature), pInstance->GetData64(DATA_MAULGAR)));
+
+            if(Maulgar)
+                ((boss_high_king_maulgarAI*)Maulgar->AI())->AddDeath();
+        }
+       }
     void MoveInLineOfSight(Unit *who)
     {
@@ -577,5 +666,5 @@
                     {
                         pInstance->SetData64(DATA_MAULGAREVENT_TANK, who->GetGUID());
-                        pInstance->SetData(DATA_MAULGAREVENT, 1);
+                        pInstance->SetData(DATA_MAULGAREVENT, IN_PROGRESS);
                     }
                 }
@@ -606,5 +695,5 @@
 
         //GreaterFireball_Timer
-        if(GreaterFireball_Timer < diff)
+        if(GreaterFireball_Timer < diff || m_creature->GetDistance(m_creature->getVictim()) < 30)
         {
             DoCast(m_creature->getVictim(), SPELL_GREATER_FIREBALL);
@@ -623,6 +712,20 @@
         if(BlastWave_Timer < diff)
         {
+                       Unit *target;
+            std::list<HostilReference *> t_list = m_creature->getThreatManager().getThreatList();
+            std::vector<Unit *> target_list;
+            for(std::list<HostilReference *>::iterator itr = t_list.begin(); itr!= t_list.end(); ++itr)
+            {
+                target = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid());
+                                                            //15 yard radius minimum
+                if(target && target->GetDistance2d(m_creature) < 15)
+                    target_list.push_back(target);
+                target = NULL;
+            }
+            if(target_list.size())
+                target = *(target_list.begin()+rand()%target_list.size());
+
             m_creature->InterruptNonMeleeSpells(false);
-            DoCast(m_creature->getVictim(), SPELL_BLAST_WAVE);
+                       DoCast(target, SPELL_BLAST_WAVE);
             BlastWave_Timer = 60000;
         }else BlastWave_Timer -= diff;
Index: /trunk/src/bindings/scripts/scripts/zone/gruuls_lair/def_gruuls_lair.h
===================================================================
--- /trunk/src/bindings/scripts/scripts/zone/gruuls_lair/def_gruuls_lair.h (revision 90)
+++ /trunk/src/bindings/scripts/scripts/zone/gruuls_lair/def_gruuls_lair.h (revision 98)
@@ -13,3 +13,6 @@
 #define DATA_MAULGAREVENT_TANK 6
 #define DATA_OLMTHESUMMONER 7
+#define DATA_MAULGARDOOR 8
+#define DATA_GRUULDOOR 9
+#define DATA_MAULGAR 10
 #endif
Index: /trunk/src/bindings/scripts/scripts/zone/gruuls_lair/instance_gruuls_lair.cpp
===================================================================
--- /trunk/src/bindings/scripts/scripts/zone/gruuls_lair/instance_gruuls_lair.cpp (revision 90)
+++ /trunk/src/bindings/scripts/scripts/zone/gruuls_lair/instance_gruuls_lair.cpp (revision 98)
@@ -43,4 +43,8 @@
     uint64 OlmTheSummoner;
     uint64 KroshFirehand;
+       uint64 Maulgar;
+
+       uint64 MaulgarDoor;
+       uint64 GruulDoor;
 
     void Initialize()
@@ -51,4 +55,9 @@
         OlmTheSummoner = 0;
         KroshFirehand = 0;
+               Maulgar = 0;
+
+               MaulgarDoor = 0;
+               GruulDoor = 0;
+
 
         for(uint8 i = 0; i < ENCOUNTERS; i++)
@@ -72,6 +81,16 @@
             case 18834: OlmTheSummoner = creature->GetGUID(); break;
             case 18832: KroshFirehand = creature->GetGUID(); break;
+                       case 18831: Maulgar = creature->GetGUID();break;
         }
     }
+
+       void OnObjectCreate(GameObject* go)
+    {
+               switch(go->GetEntry())
+               {
+               case 184468: MaulgarDoor = go->GetGUID();break;
+               case 184662: GruulDoor = go->GetGUID();break;
+               }
+       }
 
     void SetData64(uint32 type, uint64 data)
@@ -85,14 +104,12 @@
         switch(identifier)
         {
-            case DATA_MAULGAREVENT_TANK:
-                return MaulgarEvent_Tank;
-            case DATA_KIGGLERTHECRAZED:
-                return KigglerTheCrazed;
-            case DATA_BLINDEYETHESEER:
-                return BlindeyeTheSeer;
-            case DATA_OLMTHESUMMONER:
-                return OlmTheSummoner;
-            case DATA_KROSHFIREHAND:
-                return KroshFirehand;
+            case DATA_MAULGAREVENT_TANK: return MaulgarEvent_Tank;
+            case DATA_KIGGLERTHECRAZED: return KigglerTheCrazed;
+                       case DATA_BLINDEYETHESEER: return BlindeyeTheSeer;
+            case DATA_OLMTHESUMMONER: return OlmTheSummoner;
+            case DATA_KROSHFIREHAND: return KroshFirehand;
+                       case DATA_MAULGARDOOR: return MaulgarDoor;
+                       case DATA_GRUULDOOR: return GruulDoor;
+                       case DATA_MAULGAR: return Maulgar;
         }
         return 0;
@@ -104,10 +121,11 @@
         {
             case DATA_MAULGAREVENT:
-                Encounters[0] = (data) ? true : false;
-                break;
+                Encounters[0] = data; break;
             case DATA_GRUULEVENT:
-                Encounters[1] = (data) ? true : false;
-                break;
+                Encounters[1] = data; break;
         }
+
+               if(data == DONE)
+                       SaveToDB();
     }
 
@@ -116,13 +134,44 @@
         switch(type)
         {
-            case DATA_MAULGAREVENT:
-                return Encounters[0];
-            case DATA_GRUULEVENT:
-                return Encounters[1];
+            case DATA_MAULGAREVENT: return Encounters[0];
+            case DATA_GRUULEVENT: return Encounters[1];
         }
         return 0;
     }
+
+
+               const char* Save()
+    {
+        OUT_SAVE_INST_DATA;
+        std::ostringstream stream;
+        stream << Encounters[0] << " " << Encounters[1];
+        char* out = new char[stream.str().length() + 1];
+        strcpy(out, stream.str().c_str());
+        if(out)
+        {
+            OUT_SAVE_INST_DATA_COMPLETE;
+            return out;
+        }
+
+        return NULL;
+    }
+
+    void Load(const char* in)
+    {
+        if(!in)
+        {
+            OUT_LOAD_INST_DATA_FAIL;
+            return;
+        }
+
+        OUT_LOAD_INST_DATA(in);
+        std::istringstream stream(in);
+        stream >> Encounters[0] >> Encounters[1];
+        for(uint8 i = 0; i < ENCOUNTERS; ++i)
+            if(Encounters[i] == IN_PROGRESS)                // Do not load an encounter as "In Progress" - reset it instead.
+                Encounters[i] = NOT_STARTED;
+        OUT_LOAD_INST_DATA_COMPLETE;
+    }
 };
-
 InstanceData* GetInstanceData_instance_gruuls_lair(Map* map)
 {
