<?php
require_once('include/init.php');
$INIT_CONF->LoadFile('room_class', 'icon_functions');
$INIT_CONF->LoadClass('SESSION', 'GAME_CONF', 'MESSAGE');
$INIT_CONF->LoadRequest('RequestUserManager'); //引数を取得
$DB_CONF->Connect(); //DB 接続
$RQ_ARGS->entry ? EntryUser() : OutputEntryUserPage();
$DB_CONF->Disconnect(); //DB 接続解除

//-- 関数 --//
//ユーザを登録する
function EntryUser(){
  global $DEBUG_MODE, $GAME_CONF, $MESSAGE, $RQ_ARGS, $SESSION;

  extract($RQ_ARGS->ToArray()); //引数を取得

  //記入漏れチェック
  $title = '村人登録 [入力エラー]';
  $sentence = 'が空です (空白と改行コードは自動で削除されます)';
  if($uname == '')       OutputActionResult($title, 'ユーザ名'     . $sentence);
  if($handle_name == '') OutputActionResult($title, '村人の名前'   . $sentence);
  if($password == '')    OutputActionResult($title, 'パスワード'   . $sentence);
  if($profile == '')     OutputActionResult($title, 'プロフィール' . $sentence);
  if(empty($sex))        OutputActionResult($title, '性別が入力されていません');
  if(empty($icon_no))    OutputActionResult($title, 'アイコン番号が入力されていません');

  //文字数制限チェック
  if(strlen($uname) > $GAME_CONF->entry_uname_limit){
    OutputActionResult($title, 'ユーザ名は' . $GAME_CONF->entry_uname_limit . '文字まで');
  }
  if(strlen($handle_name) > $GAME_CONF->entry_uname_limit){
    OutputActionResult($title, '村人の名前は' . $GAME_CONF->entry_uname_limit . '文字まで');
  }
  if(strlen($profile) > $GAME_CONF->entry_profile_limit){
    OutputActionResult($title, 'プロフィールは' . $GAME_CONF->entry_profile_limit . '文字まで');
  }

  //例外チェック
  if($uname == 'dummy_boy' || $uname == 'system'){
    OutputActionResult($title, 'ユーザ名「' . $uname . '」は使用できません');
  }
  if($handle_name == '身代わり君' || $handle_name == 'システム'){
    OutputActionResult($title, '村人名「' . $handle_name . '」は使用できません');
  }
  if($sex != 'male' && $sex != 'female') OutputActionResult($title, '無効な性別です');

  $query = 'SELECT COUNT(icon_no) FROM user_icon WHERE icon_no = ' . $icon_no;
  if($icon_no < 1 || FetchResult($query) < 1) OutputActionResult($title, '無効なアイコン番号です');

  //テーブルをロック
  if(! LockTable()){
    OutputActionResult('村人登録 [サーバエラー]',
		       'サーバが混雑しています。<br>'."\n".'再度登録してください');
  }

  //項目被りチェック
  $query = "SELECT COUNT(uname) FROM user_entry WHERE room_no = {$room_no} AND ";

  //キックされた人と同じユーザ名
  if(FetchResult($query . "uname = '{$uname}' AND user_no = -1") > 0){
    OutputActionResult('村人登録 [キックされたユーザ]',
		       'キックされた人と同じユーザ名は使用できません。 (村人名は可)<br>'."\n" .
		       '別の名前にしてください。');
  }

  //ユーザ名、村人名
  $query .= 'user_no > 0 AND ';
  if(FetchResult($query . "(uname = '{$uname}' OR handle_name = '{$handle_name}')") > 0){
    OutputActionResult('村人登録 [重複登録エラー]',
		       'ユーザ名、または村人名が既に登録してあります。<br>'."\n" .
		       '別の名前にしてください。');
  }
  //OutputActionResult('トリップテスト', $uname . '<br>' . $handle_name);

  //IPアドレスチェック
  $ip_address = $_SERVER['REMOTE_ADDR']; //ユーザのIPアドレスを取得
  if(! $DEBUG_MODE && $GAME_CONF->entry_one_ip_address &&
     FetchResult("{$query} ip_address = '{$ip_address}'") > 0){
    OutputActionResult('村人登録 [多重登録エラー]', '多重登録はできません。');
  }

  //DBからユーザNoを降順に取得
  $query = 'SELECT user_no FROM user_entry WHERE room_no = ' . $room_no .
    ' AND user_no > 0 ORDER BY user_no DESC';
  $user_no = (int)FetchResult($query) + 1; //最も大きい No + 1

  //DBから最大人数を取得
  $ROOM = RoomDataSet::LoadEntryUser($room_no);

  //定員オーバーしているとき
  if($user_no > $ROOM->max_user){
    OutputActionResult('村人登録 [入村不可]', '村が満員です。', '', true);
  }
  if(! $ROOM->IsBeforeGame() || $ROOM->status != 'waiting'){
    OutputActionResult('村人登録 [入村不可]', 'すでにゲームが開始されています', '', true);
  }

  //クッキーの削除
  $ROOM->system_time = TZTime(); //現在時刻を取得
  $cookie_time = $ROOM->system_time - 3600;
  setcookie('day_night',  '', $cookie_time);
  setcookie('vote_times', '', $cookie_time);
  setcookie('objection',  '', $cookie_time);

  //DB にユーザデータを登録
  if(InsertUser($room_no, $uname, $handle_name, $password, $user_no, $icon_no, $profile,
		$sex, $role, $SESSION->Get(true))){
    $ROOM->Talk($handle_name . ' ' . $MESSAGE->entry_user); //入村メッセージ
    $url = 'game_frame.php?room_no=' . $room_no;
    OutputActionResult('村人登録',
		       $user_no . ' 番目の村人登録完了、村の寄り合いページに飛びます。<br>'."\n" .
		       '切り替わらないなら <a href="' . $url. '">ここ</a> 。',
		       $url, true);
  }
  else{
    OutputActionResult('村人登録 [データベースサーバエラー]',
		       'データベースサーバが混雑しています。<br>'."\n" .
		       '時間を置いて再度登録してください。', '', true);
  }
  UnlockTable(); //ロック解除
}

//ユーザ登録画面表示
function OutputEntryUserPage(){
  global $SERVER_CONF, $GAME_CONF, $ICON_CONF, $RQ_ARGS;

  extract($RQ_ARGS->ToArray()); //引数を取得
  $ROOM = RoomDataSet::LoadEntryUserPage($room_no);
  $sentence = $room_no . ' 番地の村は';
  if(is_null($ROOM->id))  OutputActionResult('村人登録 [村番号エラー]', $sentence . '存在しません');
  if($ROOM->IsFinished()) OutputActionResult('村人登録 [入村不可]',  $sentence . '終了しました');
  if($ROOM->status != 'waiting'){
    OutputActionResult('村人登録 [入村不可]', $sentence . 'すでにゲームが開始されています。');
  }
  $ROOM->ParseOption(true);
  $trip = '(トリップ使用' . ($GAME_CONF->trip ? '可能' : '不可') . ')';

  OutputHTMLHeader($SERVER_CONF->title .'[村人登録]', 'entry_user');
  echo <<<HEADER
</head>
<body>
<a href="./">←戻る</a><br>
<form method="POST" action="user_manager.php?room_no={$ROOM->id}">
<input type="hidden" name="entry" value="on">
<div align="center">
<table class="main">
<tr><td><img src="img/entry_user/title.gif"></td></tr>
<tr><td class="title">{$ROOM->name} 村<img src="img/entry_user/top.gif"></td></tr>
<tr><td class="number">〜{$ROOM->comment}〜 [{$ROOM->id} 番地]</td></tr>
<tr><td>
<table class="input">
<tr>
<td class="img"><img src="img/entry_user/uname.gif"></td>
<td><input type="text" name="uname" size="30" maxlength="30"></td>
<td class="explain">普段は表示されず、他のユーザ名がわかるのは<br>死亡したときとゲーム終了後のみです{$trip}</td>
</tr>
<tr>
<td class="img"><img src="img/entry_user/handle_name.gif"></td>
<td><input type="text" name="handle_name" size="30" maxlength="30"></td>
<td class="explain">村で表示される名前です</td>
</tr>
<tr>
<td class="img"><img src="img/entry_user/password.gif"></td>
<td><input type="password" name="password" size="30" maxlength="30"></td>
<td class="explain">セッションが切れた場合のログイン時に使います<br> (暗号化されていないので要注意)</td>
</tr>
<tr>
<td class="img"><img src="img/entry_user/sex.gif"></td>
<td class="img">
<label for="male"><img src="img/entry_user/sex_male.gif"><input type="radio" id="male" name="sex" value="male"></label>
<label for="female"><img src="img/entry_user/sex_female.gif"><input type="radio" id="female" name="sex" value="female"></label>
</td>
<td class="explain">特に意味は無いかも……</td>
</tr>
<tr>
<td class="img"><img src="img/entry_user/profile.gif"></td>
<td colspan="2">
<textarea name="profile" cols="30" rows="2"></textarea>
<input type="hidden" name="role" value="none">
</td>
</tr>

HEADER;

  if($ROOM->IsOption('wish_role')){
    echo <<<IMAGE
<tr>
<td class="role"><img src="img/entry_user/role.gif"></td>
<td colspan="2">

IMAGE;

    $wish_role_list = array('none');
    if($ROOM->IsOption('duel')){
      array_push($wish_role_list, 'wolf', 'trap_mad', 'assassin');
    }
    else{
      if($ROOM->IsOption('chaos')){
	array_push($wish_role_list, 'human', 'mage', 'necromancer', 'guard', 'common',
		   'poison', 'pharmacist', 'wolf', 'mad', 'fox', 'child_fox', 'cupid', 'mania');
      }
      elseif($ROOM->IsOption('chaosfull')){
	array_push($wish_role_list, 'human', 'mage', 'necromancer', 'priest', 'guard', 'common',
		   'poison', 'poison_cat', 'pharmacist', 'assassin', 'mind_scanner', 'jealousy',
		   'doll', 'wolf', 'mad', 'fox', 'child_fox', 'cupid', 'angel', 'quiz',
		   'chiroptera', 'fairy', 'mania');
      }
      else{
	if(! $ROOM->IsOption('full_mania')) $wish_role_list[] = 'human';
	$wish_role_list[] = 'wolf';
	if($ROOM->IsQuiz()){
	  array_push($wish_role_list, 'mad', 'common', 'fox');
	}
	else{
	  array_push($wish_role_list, 'mage', 'necromancer', 'mad', 'guard', 'common');
	  if($ROOM->IsOption('detective')) $wish_role_list[] = 'detective_common';
	  $wish_role_list[] = 'fox';
	}
      }
    }
    if($ROOM->IsOption('poison')) $wish_role_list[] = 'poison';
    if($ROOM->IsOption('assassin')) $wish_role_list[] = 'assassin';
    if($ROOM->IsOption('boss_wolf')) $wish_role_list[] = 'boss_wolf';
    if($ROOM->IsOption('poison_wolf')){
      array_push($wish_role_list, 'poison_wolf', 'pharmacist');
    }
    if($ROOM->IsOption('possessed_wolf')) $wish_role_list[] = 'possessed_wolf';
    if($ROOM->IsOption('sirius_wolf')) $wish_role_list[] = 'sirius_wolf';
    if($ROOM->IsOption('cupid')) $wish_role_list[] = 'cupid';
    if($ROOM->IsOption('medium')) array_push($wish_role_list, 'medium', 'mind_cupid');
    if($ROOM->IsOptionGroup('mania') && ! in_array('mania', $wish_role_list)){
      $wish_role_list[] = 'mania';
    }

    $count = 0;
    foreach($wish_role_list as $role){
      if($count > 0 && $count % 4 == 0) echo '<br>'; //4個ごとに改行
      $count++;
      echo <<<TAG
<label for="{$role}"><img src="img/entry_user/role_{$role}.gif"><input type="radio" id="{$role}" name="role" value="{$role}"></label>

TAG;
    }
    echo '</td>';
  }
  else{
    echo '<input type="hidden" name="role" value="none">';
  }

  echo <<<BODY
</tr>
<tr>
<td class="submit" colspan="3">
<span class="explain">
ユーザ名、村人の名前、パスワードの前後の空白および改行コードは自動で削除されます
</span>
<input type="submit" value="村人登録申請"></td>
</tr>
</table>
</td></tr>

<tr><td>
<fieldset><legend><img src="img/entry_user/icon.gif"></legend>
<table class="icon">
<tr><td colspan="5">
<input id="fix_number" type="radio" name="icon_no"><label for="fix_number">手入力</label>
<input type="text" name="icon_no" size="10px">(半角英数で入力してください)
</td></tr>

BODY;
  OutputIconList('user_manager');
  echo <<<FOOTER
</tr></table>
</fieldset>
</td></tr>

</table></div></form>
</body></html>

FOOTER;
}
