<?php
/*
  ◆憑狼 (possessed_wolf)
  ○仕様
  ・襲撃：憑依
*/
RoleManager::LoadFile('wolf');
class Role_possessed_wolf extends Role_wolf {
  protected function OutputResult() {
    if (DB::$ROOM->date > 1) RoleHTML::OutputPossessed();
  }

  function IsMindReadPossessed(User $user) { return $this->GetTalkFlag('wolf'); }

  function WolfKill(User $user) {
    if ($user->IsDummyBoy() || $user->IsCamp('fox') || $user->IsPossessedLimited()) { //スキップ判定
      parent::WolfKill($user);
      return;
    }
    $this->AddStack($user->uname, 'possessed', $this->GetWolfVoter()->uname);
    $user->dead_flag = true;
    //憑依リセット判定
    if ($user->IsRole('anti_voodoo')) $this->GetWolfVoter()->possessed_reset = true;
  }

  //憑依処理
  function Possessed() {
    $possessed_date = DB::$ROOM->date + 1; //憑依する日を取得
    foreach ($this->GetStack('possessed') as $uname => $target_uname) {
      $user    = DB::$USER->ByUname($uname); //憑依者
      $target  = DB::$USER->ByUname($target_uname); //憑依予定先
      $virtual = DB::$USER->ByVirtual($user->user_no); //現在の憑依先
      if (! isset($user->possessed_reset))  $user->possessed_reset  = null;
      if (! isset($user->possessed_cancel)) $user->possessed_cancel = null;

      if ($user->IsDead(true)) { //憑依者死亡
	if (isset($target->user_no)) {
	  $target->dead_flag = false; //死亡フラグをリセット
	  DB::$USER->Kill($target->user_no, 'WOLF_KILLED');
	  if ($target->revive_flag) $target->Update('live', 'live'); //蘇生対応
	}
      }
      elseif ($user->possessed_reset) { //憑依リセット
	if (isset($target->user_no)) {
	  $target->dead_flag = false; //死亡フラグをリセット
	  DB::$USER->Kill($target->user_no, 'WOLF_KILLED');
	  if ($target->revive_flag) $target->Update('live', 'live'); //蘇生対応
	}

	if ($user != $virtual) { //憑依中なら元の体に戻される
	  //憑依先のリセット処理
	  $virtual->ReturnPossessed('possessed');
	  $virtual->SaveLastWords();
	  DB::$ROOM->ResultDead($virtual->handle_name, 'POSSESSED_RESET');

	  //見かけ上の蘇生処理
	  $user->ReturnPossessed('possessed_target');
	  $user->SaveLastWords($virtual->handle_name);
	  DB::$ROOM->ResultDead($user->handle_name, 'REVIVE_SUCCESS');
	}
	continue;
      }
      elseif ($user->possessed_cancel || $target->revive_flag) { //憑依失敗
	$target->dead_flag = false; //死亡フラグをリセット
	DB::$USER->Kill($target->user_no, 'WOLF_KILLED');
	if ($target->revive_flag) $target->Update('live', 'live'); //蘇生対応
	continue;
      }
      else { //憑依成功
	if ($user->IsRole('possessed_wolf')) {
	  $target->dead_flag = false; //死亡フラグをリセット
	  DB::$USER->Kill($target->user_no, 'POSSESSED_TARGETED'); //憑依先の死亡処理
	  //憑依先が誰かに憑依しているケースがあるので仮想ユーザで上書きする
	  //Ver. 1.5.0 β13 の仕様変更でこのケースはなくなったはず
	  $target = DB::$USER->ByVirtual($target->user_no);
	}
	else {
	  DB::$ROOM->ResultDead($target->handle_name, 'REVIVE_SUCCESS');
	  $user->LostAbility();
	}
	$target->AddRole("possessed[{$possessed_date}-{$user->user_no}]");

	//憑依処理
	$user->AddRole("possessed_target[{$possessed_date}-{$target->user_no}]");
	DB::$ROOM->ResultDead($virtual->handle_name, 'POSSESSED');
	$user->SaveLastWords($virtual->handle_name);
	$user->Update('last_words', null);
      }

      if (! $user->IsSame($virtual->uname)) { //多段憑依対応
	$virtual->ReturnPossessed('possessed');
	if ($user->IsLive(true)) $virtual->SaveLastWords();
      }
    }
  }
}
