Newer
Older
IrisServerWebSocket / src / main / java / com / ntlab / irisserver / entities / DrawingController.java
Kota on 8 Dec 2022 4 KB first commit
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;
        }

    }

}