void SkinnedHints::AddHint( Widget *hint_owner, const Hint &h )
{
    SkinMixer::Mix( (int)hint_owner,
        CaptionSkin( h._text, _fonts.GetFont(h._font_no) ),
        h._alignment );
        
    RemoveHint(hint_owner);
    _hints.Insert( hint_owner, h);
}
bool Scene_Inca_Passage::ItemUsed(const char *szItemName, const char *szObjectName)
{
   // Le joueur utilise la statuette
   if (strcmp(szItemName, "inv_inca_statuette") == 0) {
      if (strcmp(szObjectName, "inca_passage_blocks_ceiling") == 0) {
         // Ouverture de la vignette
         ESoundBank::getSound("success")->playSample();
         _lpSceneDirector->GoToVignette("vignette_inca_statuette", szObjectName, true);
         return true;
      }
   }
   
   // Le joueur utilise un effet de la statuette
   if (strcmp(szItemName, "statuette_effect_earthquake") == 0) {
      if (strcmp(szObjectName, "inca_passage_blocks_ceiling") == 0) {
         // Lancement de l'effet
         _bEffect = true;
         _lpSceneDirector->getSequencer()->NarrationMode(NULL, SEQUENCE_NARRATION_CINEMATIC, true);
         _lpSceneDirector->getSequencer()->PlaySound(NULL, "rockfall");
         _lpSceneDirector->getSequencer()->EarthQuake(NULL, true);
         _lpSceneDirector->getSequencer()->Wait(NULL, 4000);
         _lpSceneDirector->getSequencer()->SwitchImage(NULL, "inca_passage_blocks_ceiling", "inca_passage_blocks_ground");
         _lpSceneDirector->getSequencer()->EarthQuake(NULL, false);
         ResolveTask("task_inca_fillhole");
         RemoveHint("inca","4artefacts","cross");
         SetVisible("inca_final_zone", true);
         _lpSceneDirector->getSequencer()->NarrationMode(NULL, SEQUENCE_NARRATION_CINEMATIC, false);
         return true;
      }
   }

   char *effectprefix = "statuette_effect_";
   if (strncmp(szItemName, effectprefix,strlen(effectprefix)) == 0) {
         _lpSceneDirector->getSequencer()->Talk(NULL, CHARACTER_POSX, CHARACTER_POSY, KStr("INCA_MAIN_YUMANCO_STATUETTE_NOEFFECT"), "", true, false);
		 return true;
   }

   // Le joueur recompose la fresque3
   if (strcmp(szObjectName, "inca_stairsfresco3_zone") == 0) {
      if (strcmp(szItemName, "inv_inca_cartouche1") == 0) {
         ESoundBank::getSound("success")->playSample();
         _lpSceneDirector->getSequencer()->ShowImage(NULL, "inca_cartouche1_wall", true, true);
         // Mini jeu
         EMiniJeuBase *lpMiniJeu = new EMiniJeuPhotoComp("mg_photocomp_fresque1.png","mg_photocomp_bg_f1.jpg",79,129,"mg_photocomp_artefact_f1.png","mg_photocomp_cartouche_f1.png",458,225);
         _lpSceneDirector->getSequencer()->MiniGame(NULL, "fresco3", lpMiniJeu);
      }
      else {
         // Ca ne va pas ici
         _lpSceneDirector->getSequencer()->Talk(NULL, CHARACTER_POSX, CHARACTER_POSY, KStr("INCA_YUMANCO_NOTHERE"), "", true, false);
      }
      return true;
   }
   
   // Le joueur recompose la fresque4
   if (strcmp(szObjectName, "inca_stairsfresco4_zone") == 0) {
      if (strcmp(szItemName, "inv_inca_cartouche2") == 0) {
         if (TaskResolved("task_inca_fillhole")) {
            ESoundBank::getSound("success")->playSample();
            _lpSceneDirector->getSequencer()->ShowImage(NULL, "inca_cartouche1_wall", true, true);
            // Mini jeu
            EMiniJeuBase *lpMiniJeu = new EMiniJeuPhotoComp("mg_photocomp_fresque2.png","mg_photocomp_bg_f2.jpg",79,129,"mg_photocomp_artefact_f2.png","mg_photocomp_cartouche_f2.png",462,235);
            _lpSceneDirector->getSequencer()->MiniGame(NULL, "fresco4", lpMiniJeu);
         }
         else {
            _lpSceneDirector->getSequencer()->Talk(NULL, CHARACTER_POSX, CHARACTER_POSY, KStr("INCA_YUMANCO_HOLE"), "", true, false);
         }
      }
      else {
         // Ca ne va pas ici
         _lpSceneDirector->getSequencer()->Talk(NULL, CHARACTER_POSX, CHARACTER_POSY, KStr("INCA_YUMANCO_NOTHERE"), "", true, false);
      }
      return true;
   }
   
   return false;
}
bool SceneBasement::ItemUsed(const char *szItemName, const char *szObjectName)
{
   // Le joueur donne quelque chose au fantôme debout
   if (strcmp(szObjectName, "basement_ghostup") == 0)
   {
      int x,y;
      bool bGiven = false;
      GetObjectPosition("basement_ghostup", x, y);
      if (strcmp(szItemName, "inv_house_basement_paper") == 0) {
         ResolveTask("task_house_basement_givepaper");
         RemoveHint("house","helpnatsumi","nextpaper");
         // On peut maintenant retirer l'objet de l'inventaire
         _lpSceneDirector->DropItem("inv_house_basement_paper");
         _lpSceneDirector->getSequencer()->PlaySound(NULL, "success");
         _lpSceneDirector->getSequencer()->Talk(NULL, x, y, KStr("HOUSE_BASEMENT_NATSUMI_THANKYOU"), "", true, false, _lpGhostVoice);
         if (!TaskResolved("task_house_basement_givecharcoal")) {
            AddHint("house","helpnatsumi","nextcharcoal");
         }
         bGiven = true;
      }
      else
      if (strcmp(szItemName, "inv_house_basement_grid_charcoal") == 0) {
         ResolveTask("task_house_basement_givecharcoal");
         RemoveHint("house","helpnatsumi","nextcharcoal");
         // On peut maintenant retirer l'objet de l'inventaire
         _lpSceneDirector->DropItem("inv_house_basement_grid_charcoal");
         _lpSceneDirector->getSequencer()->PlaySound(NULL, "success");
         _lpSceneDirector->getSequencer()->Talk(NULL, x, y, KStr("HOUSE_BASEMENT_NATSUMI_THANKYOU"), "", true, false, _lpGhostVoice);
         bGiven = true;
      }
      else {
         _lpSceneDirector->getSequencer()->Talk(NULL, x, y, KStr("HOUSE_BASEMENT_NATSUMI_IDONTNEED"), "", true, false, _lpGhostVoice);
      }
      
      // On teste si on a donné les 2 objets attendus par le fantôme
      if (bGiven) {
         if (TaskResolved("task_house_basement_givepaper") && TaskResolved("task_house_basement_givecharcoal")) {
            _lpSceneDirector->getSequencer()->NarrationMode(NULL, SEQUENCE_NARRATION_DIALOG, true);
            _lpSceneDirector->getSequencer()->ShowEmitter(NULL, "creeping_static_up", false);
            _lpSceneDirector->getSequencer()->ShowImage(NULL,"basement_ghostup",false);
            _lpSceneDirector->getSequencer()->ShowImage(NULL,"basement_ghostdrawing1",true);
            _lpSceneDirector->getSequencer()->SwitchImage(NULL, "basement_ghostdrawing1", "basement_ghostdrawing2");
            _lpSceneDirector->getSequencer()->SwitchImage(NULL, "basement_ghostdrawing2", "basement_ghostdrawing1");
            _lpSceneDirector->getSequencer()->SwitchImage(NULL, "basement_ghostdrawing1", "basement_ghostdrawing2");
            _lpSceneDirector->getSequencer()->SwitchImage(NULL, "basement_ghostdrawing2", "basement_ghostdrawing1");
            _lpSceneDirector->getSequencer()->Talk(NULL, CHARACTER_POSX, CHARACTER_POSY, KStr("HOUSE_BASEMENT_ASHLEY_SHEDRAW"), "", false, true);
            _lpSceneDirector->getSequencer()->SwitchImage(NULL, "basement_ghostdrawing1", "basement_ghostdrawing2");
            _lpSceneDirector->getSequencer()->SwitchImage(NULL, "basement_ghostdrawing2", "basement_ghostdrawing1");
            _lpSceneDirector->getSequencer()->ShowImage(NULL,"basement_ghostdrawing1",false);
            _lpSceneDirector->getSequencer()->ShowEmitter(NULL, "creeping_static_hidden", true);
            _lpSceneDirector->getSequencer()->ShowImage(NULL,"basement_ghosthidden",true);
            _lpSceneDirector->getSequencer()->PlaySound(NULL, "success");
            _lpSceneDirector->getSequencer()->ShowImage(NULL,"basement_sketch",true);
            _lpSceneDirector->getSequencer()->Animation(NULL, "sketchanimp2p", true);
            _lpSceneDirector->getSequencer()->NarrationMode(NULL, SEQUENCE_NARRATION_DIALOG, false);
            _lpSceneDirector->getSequencer()->Talk(NULL, CHARACTER_POSX, CHARACTER_POSY, KStr("HOUSE_BASEMENT_ASHLEY_SHEDRAW2"), "", true);
            ResolveTask("task_house_basement_natsumineed");
            AddTask("task_house_basement_bonzai");
            RemoveHint("house","helpnatsumi","what");
            AddObjective("house","bonzai");
            AddHint("house","bonzai","how");
            AddHint("house","bonzai","grip");
         }
      }
      return true;
   }
   // Le joueur donne quelque chose au fantôme caché
   if (strcmp(szObjectName, "basement_ghosthidden") == 0)
   {
      _lpSceneDirector->getSequencer()->PlaySound(NULL, "ghostappear");
      int x,y;
      GetObjectPosition("basement_ghostup", x, y);
      _lpSceneDirector->getSequencer()->ShowImage(NULL,"basement_ghosthidden",false);
      _lpSceneDirector->getSequencer()->ShowEmitter(NULL, "creeping_static_hidden", false);
      _lpSceneDirector->getSequencer()->ShowEmitter(NULL, "creeping_static_up", true);
      _lpSceneDirector->getSequencer()->ShowImage(NULL,"basement_ghostup",true);
      _lpSceneDirector->getSequencer()->Talk(NULL, x, y, KStr("HOUSE_BASEMENT_NATSUMI_DOYOUWANT2GIVE"), "", false, false, _lpGhostVoice);
      _lpTimerGhost->startCounter(0.0f, 1.0f, 0, 10000, K_COUNTER_LINEAR);
      return true;
   }
   // Le joueur utilise l'ampoule sur le bulbe cassé
   if ( strcmp(szItemName, "inv_house_basement_bulb") == 0 ) {
      if (strcmp(szObjectName, "bulbbroken") == 0)
      {
         _lpSceneDirector->getSequencer()->VoiceOver(NULL, KStr("HOUSE_BASEMENT_ASHLEY_IMPOBULB"),"");
         return true;
      }
   }
   // Le joueur utilise le torchon sur le bulbe cassé
   if ( strcmp(szItemName, "inv_house_basement_rag") == 0 ) {
      if (strcmp(szObjectName, "bulbbroken") == 0)
      {
         ESoundBank::getSound("success")->playSample();
         // On peut maintenant retirer l'objet de l'inventaire
         _lpSceneDirector->DropItem("inv_house_basement_rag");
         // On enlève la douille cassée
         SetVisible("bulbbroken", false);
         SetVisible("nobulb", true);
         // Tache résolue : enlever le bulbe brisé
         ResolveTask("task_house_basement_removebulb");
         return true;
      }
   }
   // Le joueur utilise l'ampoule neuve sur la douille vide
   if ( strcmp(szItemName, "inv_house_basement_bulb") == 0 ) {
      if (strcmp(szObjectName, "nobulb") == 0)
      {
         ESoundBank::getSound("success")->playSample();
         // On peut maintenant retirer l'objet de l'inventaire
         _lpSceneDirector->DropItem("inv_house_basement_bulb");
         // On met l'ampoule
         SetVisible("bulboff", true);
         SetVisible("nobulb", false);
         // Tache résolue : enlever le bulbe brisé
         ResolveTask("task_house_basement_changebulb");
         return true;
      }
   }
   // Le joueur utilise le marteau sur le vase
   if ( strcmp(szItemName, "inv_house_basement_hammer") == 0 ) {
      if (strcmp(szObjectName, "basement_vase") == 0)
      {
         ESoundBank::getSound("success")->playSample();
         // On peut maintenant retirer l'objet de l'inventaire
         _lpSceneDirector->DropItem("inv_house_basement_hammer");
         SetVisible("basement_vase", false);
         SetVisible("basement_vasebroken", true);
         SetVisible("basement_paper", true);
         _lpSceneDirector->getSequencer()->Talk(NULL, CHARACTER_POSX, CHARACTER_POSY, KStr("HOUSE_BASEMENT_VASEBROKEN_INFO"), "", true);
         // Tache résolue
         ResolveTask("task_house_basement_brokevase");
         return true;
      }
   }
   
   // Le joueur utilise la pince cassée sur le bonzai
   if ( strcmp(szItemName, "inv_house_basement_gripbroken") == 0 ) {
      _lpSceneDirector->getSequencer()->Talk(NULL, CHARACTER_POSX, CHARACTER_POSY, KStr("HOUSE_BASEMENT_ASHLEY_CANNOTWRIST"), "", true);
   }
   // Le joueur utilise la pince sur le bonzai
   if ( strcmp(szItemName, "inv_house_basement_grip") == 0 ) {
      // On doit avoir le modèle pour faire le mini jeu !
      if (_lpSceneDirector->getInventory()->getItemFromInventory("inv_house_basement_sketch")) {
         if (strcmp(szObjectName, "basement_bonzai") == 0)
         {
            EMiniJeuBase *lpMiniJeu = new EMinijeuBonzai();
            _lpSceneDirector->GoToMiniGame("bonzai", lpMiniJeu);
            return true;
         }
      }
      else {
         _lpSceneDirector->getSequencer()->Talk(NULL, CHARACTER_POSX, CHARACTER_POSY, KStr("HOUSE_BASEMENT_ASHLEY_INEEDMODEL"), "", true);
         return true;
      }
   }
   return false;
}
bool Scene_Hell_Vale::ObjectClicked(const char *szObjectName, float x, float y)
{
   // Le joueur pioche dans les âmes
   if (strcmp(szObjectName, "hell_vale_hands_zone") == 0) {
      // Il y a déjà une âme
      if (isVisible("hell_vale_soul_1")
          || isVisible("hell_vale_soul_2")
          || isVisible("hell_vale_soul_3")
          ) {
         _lpSceneDirector->getSequencer()->Talk(szObjectName, CHARACTER_POSX, CHARACTER_POSY, KStr("HELL_ASHLEY_ENOUGHSOUL"), "", true, false);
         return true;
      }
      else if (isVisible("hell_vale_soul_richard"))
      {
         _lpSceneDirector->getSequencer()->Talk(szObjectName, CHARACTER_POSX, CHARACTER_POSY, KStr("HELL_ASHLEY_ENDSOUL"), "", true, false);
         return true;
      }
      // On pioche une âme
      else if (TaskResolved("task_hell_foundrichard")) {
         _lpSceneDirector->getSequencer()->Talk(szObjectName, CHARACTER_POSX, CHARACTER_POSY, KStr("HELL_ASHLEY_ENDSOUL"), "", true, false);
      }
      else if (TaskResolved("task_hell_savesoul_3")) {
         RemoveHint("hell","escape","soul");
         ResolveTask("task_hell_meetsoul_richard");
         AddTask("task_hell_reassureseth");
         StartAnimation("soul4anim");
         StartAnimation("soul4rot");
         _lpSceneDirector->getSequencer()->PlaySound(NULL, "ghostcreep");
         _lpSceneDirector->getSequencer()->ShowImage(NULL, "hell_vale_soul_richard", true);
         SoulRequest(4);
      }
      else if (TaskResolved("task_hell_savesoul_2")) {
         ResolveTask("task_hell_meetsoul_3");
         AddTask("task_hell_savesoul_3");
         StartAnimation("soul3anim");
         StartAnimation("soul3rot");
         _lpSceneDirector->getSequencer()->PlaySound(NULL, "ghostcreep");
         _lpSceneDirector->getSequencer()->ShowImage(NULL, "hell_vale_soul_3", true);
         _lpSceneDirector->getSequencer()->NarrationMode(NULL, SEQUENCE_NARRATION_DIALOG, true);
         _lpSceneDirector->getSequencer()->Talk(szObjectName, CHARACTER_POSX, CHARACTER_POSY, KStr("HELL_ASHLEY_NEWSOUL"), "", false, true);
         SoulRequest(3);
      }
      else if (TaskResolved("task_hell_savesoul_1")) {
         ResolveTask("task_hell_meetsoul_2");
         AddTask("task_hell_savesoul_2");
         StartAnimation("soul2anim");
         StartAnimation("soul3rot");
         _lpSceneDirector->getSequencer()->PlaySound(NULL, "ghostcreep");
         _lpSceneDirector->getSequencer()->ShowImage(NULL, "hell_vale_soul_2", true);
         _lpSceneDirector->getSequencer()->NarrationMode(NULL, SEQUENCE_NARRATION_DIALOG, true);
         _lpSceneDirector->getSequencer()->Talk(szObjectName, CHARACTER_POSX, CHARACTER_POSY, KStr("HELL_ASHLEY_NEWSOUL"), "", false, true);
         SoulRequest(2);
      }
      else {
         ResolveTask("task_hell_meetsoul_1");
         AddTask("task_hell_savesoul_1");
         StartAnimation("soul1anim");
         StartAnimation("soul1rot");
         _lpSceneDirector->getSequencer()->PlaySound(NULL, "ghostcreep");
         _lpSceneDirector->getSequencer()->ShowImage(NULL, "hell_vale_soul_1", true);
         _lpSceneDirector->getSequencer()->NarrationMode(NULL, SEQUENCE_NARRATION_DIALOG, true);
         _lpSceneDirector->getSequencer()->Talk(szObjectName, CHARACTER_POSX, CHARACTER_POSY, KStr("HELL_ASHLEY_NEWSOUL"), "", false, true);
         SoulRequest(1);
      }
   }
   
   // Clic sur une âme : rappel
   if (strcmp(szObjectName, "hell_vale_soul_1") == 0) {
      SoulRequest(1);
   }
   else if (strcmp(szObjectName, "hell_vale_soul_2") == 0) {
      SoulRequest(2);
   }
   else if (strcmp(szObjectName, "hell_vale_soul_3") == 0) {
      SoulRequest(3);
   }
   else if (strcmp(szObjectName, "hell_vale_soul_richard") == 0) {
      _lpSceneDirector->getSequencer()->Talk(szObjectName, CHARACTER_POSX, CHARACTER_POSY, KStr("HELL_ASHLEY_ENDSOUL"), "", true, false);
   }
   
   // Objets à ramasser
   if (strcmp(szObjectName, "hell_item_heart") == 0)
   {
      PickupSimple(szObjectName, "inv_hell_item_heart");
      return true;
   }
   if (strcmp(szObjectName, "hell_item_eyeball") == 0)
   {
      _lpSceneDirector->getSequencer()->Talk(szObjectName, CHARACTER_POSX, CHARACTER_POSY, KStr("HELL_ASHLEY_EYEBALL"), "", true, false);
      return true;
   }
   if (strcmp(szObjectName, "hell_item_butterfly") == 0)
   {
      PickupSimple(szObjectName, "inv_hell_item_butterfly");
      return true;
   }
   if (strcmp(szObjectName, "hell_sling_stick") == 0)
   {
      PickupMultiple(szObjectName, "inv_hell_sling_stick",-1);
      return true;
   }
   if ( strncmp(szObjectName, "hell_item_cane[", strlen("hell_item_cane[")) == 0 )
   {
      PickupMultiple(szObjectName, "inv_hell_item_cane_part", 3);
   }
   
   return false;
}
void SceneBasement::Init()
{
   StartAnimation("basement_ghostup_anim");
   SetVisible("basement_ghostup", false, true);
   SetupItem("envelope_basement");
   
   // 1ère visite
   if (!TaskResolved("task_house_basementvisit")) {
      ResolveTask("task_house_basementvisit");
      AddObjective("house","basementlight");
      AddHint("house","basementlight","how");
      RemoveHint("house","helpnatsumi","where");
      AddHint("house","helpnatsumi","what");
      AddHint("house","helpnatsumi","nextpaper");
   }
   
   // Lumière éteinte
   if (!TaskResolved("task_house_basement_light")) {
      AddTask("task_house_basement_light");
      SetVisible("darkness", true);
      // Ampoule non réparée
      if (TaskResolved("task_house_basement_changebulb")) {
         SetVisible("bulboff", true);
      }
      else {
         // Bulbe cassé retiré ?
         if (TaskResolved("task_house_basement_removebulb")) {
            SetVisible("bulbbroken", false);
            SetVisible("nobulb", true);
         }else {
            SetVisible("bulbbroken", true);
         }
      }
   }
   else {
      SetVisible("darkness", false);
      SetVisible("lightning", true);
      SetVisible("bulboff", false, true);
      SetVisible("bulbon", true, true);
   }
   
   if (TaskResolved("task_japan_universeresolved")) {
      SetVisible("basement_ghosthidden", false, true);
      SetupItem("basement_rope");
      if (isVisible("basement_rope")) {
         StartEmitter("flake_rope");
      }
   }         

   // La clé
   SetVisible("basement_screwdriver", TestGlobal("basement_screwdriver") == false);
   // La pince
   SetVisible("basement_grip", TestGlobal("basement_grip") == false);
   // Le bonzaï
   if (TaskResolved("task_house_basement_bonzai")) {
      SetVisible("basement_bonzairesolved", true, true);
   } else {
      SetVisible("basement_bonzai", true, true);
   }
   
   // La grille
   if (TaskResolved("task_house_basement_opengrid")) {
      SetVisible("basement_gridopen", true);
   } else {
      SetVisible("basement_gridclosed", true);
   }
   
   // Le charbon
   if (!TaskResolved("task_house_basement_reversecoal")) {
      SetVisible("basement_coalbucketup", true, true);
   } else {
      SetVisible("basement_coalbucketdown", true, true);
   }
   
   // Le vase
   if (!TaskResolved("task_house_basement_brokevase")) {
      SetVisible("basement_vase", true, true);
   } else {
      SetVisible("basement_vasebroken", true, true);
      // Le papier
      SetVisible("basement_paper", TestGlobal("basement_paper") == false);
   }
   
   // La boite à outils
   if (!TaskResolved("task_house_basement_opentoolbox")) {
      SetVisible("basement_toolboxclosed", true, true);
   } else {
      SetVisible("basement_toolboxopen", true, true);
      // Le marteau
      SetVisible("basement_hammer", TestGlobal("basement_hammer") == false);
   }
   
   // Le fantôme
   if (!TaskResolved("task_house_basement_light")) {
      int x,y;
      GetObjectPosition("basement_ghostup", x, y);
      _lpSceneDirector->getSequencer()->ShowEmitter(NULL, "creeping_static_up", true);
      _lpSceneDirector->getSequencer()->PlaySound(NULL, "ghostcreep");
      _lpSceneDirector->getSequencer()->Wait(NULL, 2500);
      _lpSceneDirector->getSequencer()->PlaySound(NULL, "ghostappear");
      _lpSceneDirector->getSequencer()->ShowImage(NULL,"basement_ghostup",true);
      _lpSceneDirector->getSequencer()->Talk(NULL, x, y, KStr("HOUSE_BASEMENT_NATSUMI_LETME"), "", false, false, _lpGhostVoice);
      _lpSceneDirector->getSequencer()->ShowImage(NULL,"basement_ghostup",false);
      _lpSceneDirector->getSequencer()->ShowImage(NULL,"basement_ghosthidden",true);
      _lpSceneDirector->getSequencer()->ShowEmitter(NULL, "creeping_static_up", false);
      _lpSceneDirector->getSequencer()->ShowEmitter(NULL, "creeping_static_hidden", true);
   } else {
      if (!TaskResolved("task_japan_universeresolved")) {
         _lpSceneDirector->getSequencer()->ShowEmitter(NULL, "creeping_static_hidden", true);
         _lpSceneDirector->getSequencer()->ShowImage(NULL,"basement_ghosthidden",true);
      }
   }
   
   // Le croquis
   if (TaskResolved("task_house_basement_givepaper") && TaskResolved("task_house_basement_givecharcoal")) {
      SetVisible("basement_sketch", TestGlobal("basement_sketch") == false);
   }
   
   // On revient de l'univers
   if (getAdditionalName() == "backfrombeyond") {
      int x,y;
      x = 1024/2;
      y = 768/2;
      SetVisible("black", true, true);
      _lpSceneDirector->getSequencer()->ShowEmitter(NULL, "creeping_static_up", true);
      _lpSceneDirector->getSequencer()->NarrationMode(NULL, SEQUENCE_NARRATION_CINEMATIC, true);
      _lpSceneDirector->getSequencer()->Talk(NULL, x, y, KStr("JAPAN_NATSUMI_HOUSEEPILOG1"), "", false, false, _lpGhostVoice);
      _lpSceneDirector->getSequencer()->Talk(NULL, x, y, KStr("JAPAN_NATSUMI_HOUSEEPILOG2"), "", false, false, _lpGhostVoice);
      _lpSceneDirector->getSequencer()->Talk(NULL, x, y, KStr("JAPAN_NATSUMI_HOUSEEPILOG3"), "", false, false, _lpGhostVoice);
      _lpSceneDirector->getSequencer()->PlaySound(NULL, "ghostgone");
      _lpSceneDirector->getSequencer()->GotoVideo(NULL, "videos/reveil.ogv","frombeyond");
      SetupItem("basement_rope");
      StartEmitter("flake_rope");
      _lpSceneDirector->getSequencer()->ShowImage(NULL, "black", false);
      _lpSceneDirector->getSequencer()->ShowEmitter(NULL, "creeping_static_up", false);
      _lpSceneDirector->getSequencer()->Wait(NULL, 2000);
      _lpSceneDirector->getSequencer()->NarrationMode(NULL, SEQUENCE_NARRATION_CINEMATIC, false);
      ResolveTask("task_freeghost_done_japan");
      AddObjective("house","freemurray");
      AddHint("house","freemurray","where");
      _lpSceneDirector->getDiaryPtr()->beginCreatePage();
      _lpSceneDirector->getDiaryPtr()->addImageToPage("diary_basement2.png");
      _lpSceneDirector->getDiaryPtr()->addStringToPage("DIARY_BASEMENT2", FONT_DIARY_1, 0, 0);
      _lpSceneDirector->getDiaryPtr()->endCreatePage();
      return;
   }
   
   // Allumage
   if (getAdditionalName() == "light") {
      // On provoque l'apparition de Natsumi
      ObjectClicked("basement_ghosthidden", 0, 0);
      _lpSceneDirector->getDiaryPtr()->beginCreatePage();
      _lpSceneDirector->getDiaryPtr()->addImageToPage("diary_basement1.png");
      _lpSceneDirector->getDiaryPtr()->addStringToPage("DIARY_BASEMENT1", FONT_DIARY_1, 0, 0);
      _lpSceneDirector->getDiaryPtr()->endCreatePage();
   }
   
   if (getAdditionalName() == "completed") {
      BasementGoforUniverse();
      return;
   }   
   
   // On force le passage à l'univers, en cas de plantage/quit prématuré entre la scène et l'univers
   if (TaskResolved("task_japan_prologcompleted") && !TaskResolved("task_japan_universeresolved")) {
      BasementGoforUniverse();
      return;
   }
   
   // On a tout terminé
   if ( TaskResolved("task_japan_universeresolved") && TestGlobal("basement_rope")) {
      _lpSceneDirector->getSequencer()->Talk(NULL, CHARACTER_POSX, CHARACTER_POSY, KStr("GLOBAL_ASHLEY_FINISHED"), "", true);
      return;
   }
}