package com.ntlab.irisserver.entities;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DrawingController {
private int stage = 0;
private int maxstage;
private IStateListener stateListener;
private List<Member> members;
private Game game;
private Map<Member, List<Integer>> assignments;
//ニックネームからメンバーを特定するマップ
private Map<String,Member> membersMap= new HashMap<>();
private long startTime; //ステージの開始時刻
private long nowTime; //現在の時刻
private int drawingTime; //お絵描きのタイムリミット
private int countdown; //あと何秒でタイムリミットになるか
private boolean isDrawingTimer; //タイマーを使うかどうか
//描いている最中にタイムリミット(countdown==0)がくれば、描いている途中のものをputさせる。既に描き終わっている人は何もしない
//時間が0になったときに、描き終わっていない人は「描いている最中の絵をput」する。(クライアントサイド) デバッグがしにくい assingmentのgetで見れるようにする
//getdnoの番号が変わっていたら、「新しい絵を描く」
public DrawingController(IStateListener stateListener, List<Member> members, Game game) {
this.stateListener = stateListener;
this.members = members;
this.game = game;
assignments = game.getAssignments();
//16枚の絵をそろえるために必要なステージ数を計算 16/人数 端数切り上げ
maxstage = (16 + members.size() - 1)/members.size();
for(Member mem :members) {
String nick = mem.getNickname();
membersMap.put(nick,mem);
}
//お絵描きのタイムリミットを記録
Settings setting = game.getSettings();
startTime = System.currentTimeMillis();
this.drawingTime = setting.getDrawingTimerTimes();
this.isDrawingTimer = setting.isDrawingTimer();
}
//絵がアップロードされたときに、ステージを進めるか確認する
public void update(){
boolean canUpdate = true;
//参加者全員が絵を書き終わっているかを確認
for(Member mem :members) {
int dno = getDno(mem.getNickname());
Drawing drawing = game.getDrawing(dno);
//まだ描けていない絵があればステージ変更しない
if(drawing == null){
canUpdate = false;
}
}
//全員描き終わていれば、ステージを進める
if(canUpdate) {
stage += 1;
//タイマーをリセット
startTime = System.currentTimeMillis();
countdown = drawingTime;
//ゲームに必要な枚数がそろうと、roomのstateを「お絵描き中2」から「ゲーム中3」に変更
if(stage == maxstage){
stateListener.changeState();
}
}
}
//お絵描き中のタイマーを更新
private void updateTimer(){
//経過した時間を計算(秒)
nowTime = System.currentTimeMillis();
int count = ((int)nowTime - (int)startTime)/1000;
if(drawingTime - count > 0){
countdown = drawingTime - count;
}else {
countdown = 0;
}
}
//pathパラメーターを引数にするので、memberではなくてString
//nicknameから書いてほしいdnoを返す
public Integer getDno(String nickname) {
Member mem = membersMap.get(nickname);
if(mem == null){
return null;
}
List<Integer> dnoList = assignments.get(mem);
int dno = dnoList.get(stage);
return dno;
}
//現在のステージでお絵描きができる残り時間を返す
public Integer getCountdown(){
if(isDrawingTimer){
updateTimer();
return countdown;
}else{
return null;
}
}
}