package servlet;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import account.Account;
import account.AccountManager;
import framework.model3D.Position3D;
import game.Game;
import game.Stage;
import room.Room;
import room.RoomManager;
public class RoomServlet extends HttpServlet {
public static final int TEAM_RED = 0;
public static final int TEAM_BLUE = 1;
// 受け取る部分 ↓reqで受け取る ↓respで返す
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, java.io.IOException {
// RoomManagerを使うために宣言しておく ↓シングルトンパターンを利用しているため
RoomManager roommgr = RoomManager.getInstance();
AccountManager accountmgr = AccountManager.getInstance();
// 返す文字の宣言 ↓返すためresp
PrintWriter printwriter = resp.getWriter();
/*******************************
* パラメータを受け取る req
*******************************/
String state = req.getParameter("state");
String sId = req.getSession().getId();
String clSelfWait = req.getParameter("wait");
/*******************************
* sIdからアカウントを取得
*******************************/
Account svSelf = accountmgr.getAccount(sId);
//部屋を取得
Room myRoom = svSelf.getRoom();
//最終通信時間を更新
svSelf.setFinalConnectTime();
/*******************************
* enter / update の処理
*******************************/
if((state.equals("enter")) || (state.equals("update"))) {
if(state.equals("enter")) {
System.out.println("<state> : " + state);
}
printwriter.println("<room>");
//waitが異なる時、更新する
if(!clSelfWait.equals(svSelf.getWait())) {
svSelf.setWait(clSelfWait);
}
//Room内の人の最終接続時間確認
myRoom.removeNotConnectMember();
//Room内のアカウント情報を取得
Account account = new Account();
for(int i=0; i<myRoom.getMemberCount(); i++) {
account = myRoom.getMember(i);
printwriter.println("<player sid=\"" + account.getsId() + "\" name = \"" + account.getName() + "\" wait = \"" + account.getWait() +"\">");
printwriter.println("</player>");
if(state.equals("enter")) {
System.out.println("player" + i + " sId : " + account.getsId());
System.out.println(" wait : " + account.getWait());
}
}
printwriter.println("</room>");
}
/*******************************
* exit の処理
*******************************/
else if(state.equals("exit")) {
//部屋から自分を削除
myRoom.removeMember(svSelf);
//部屋の人数が0になった場合部屋を削除
if(myRoom.getMemberCount() == 0) {
roommgr.removeRoom(myRoom);
}
printwriter.println("<result id=\"ok\">");
printwriter.println("</result>");
}
/*******************************
* divide の処理
*******************************/
else if(state.equals("divide")){
System.out.println("state : divide");
if(myRoom.getDivideFlag() == 0) {
myRoom.setDivideFlag(1);
myRoom.divideTeam();
myRoom.setDivideFlag(2);
}
//他のクライアントがチーム分け処理中の場合、ngを送信する
if(myRoom.getDivideFlag() != 2) {
printwriter.println("<divide id=\"ng\">");
printwriter.println("</divide>");
}
//チーム分け完了していた場合 チーム分け情報転送
if(myRoom.getDivideFlag() == 2) {
Game game = new Game();
game = myRoom.getGame();
int myTeam = 0;
int myNum = 0;
printwriter.println("<team>");
//赤チームの情報を転送
printwriter.println("<teamRed>");
System.out.println("+++++++ teamRed +++++++");
for(int i=0; i<Room.MAX_MEMBERS/2; i++){
Account ac = new Account();
ac = game.getTeamMember(i, TEAM_RED);
String getsId = ac.getsId();
String getname = ac.getName();
printwriter.println("<player sid=\""+getsId+"\" name=\""+ getname +"\">");
printwriter.println("</player>");
//自分が存在するとき myTeam=0,myNum=0~2
if(getsId.equals(sId)){
myTeam = 0;
myNum = i;
}
}
printwriter.println("</teamRed>");
//青チームの情報を転送
printwriter.println("<teamBlue>");
System.out.println("+++++++ teamBlue +++++++");
for(int i=0; i<Room.MAX_MEMBERS/2; i++){
Account ac = new Account();
ac = game.getTeamMember(i, TEAM_BLUE);
String getsId = ac.getsId();
String getname = ac.getName();
printwriter.println("<player sid=\""+getsId+"\" name=\""+ getname +"\">");
printwriter.println("</player>");
//自分が存在するとき myTeam=1,myNum=0~2
if(getsId.equals(sId)){
myTeam = 1;
myNum = i;
}
}
printwriter.println("</teamBlue>");
//自分の座標を設定
Stage stage = new Stage();
Position3D p = stage.getSpawnPoint(myTeam, myNum);
System.out.println("point x=" + p.getX() + " y=" + p.getY() + " z=" + p.getZ());
printwriter.println("<point x=\"" + p.getX() + "\" y=\"" + p.getY() + "\" z=\"" + p.getZ() + "\"></point>");
printwriter.println("</team>");
}
}
}
// 返す部分(テスト用)
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, java.io.IOException {
// 共有させることによってこちらだけで実効できる
doPost(req, resp);
}
}