package org.ntlab.SproutServer.battles; import net.arnx.jsonic.JSON; import org.ntlab.SproutServer.accounts.Accounts; import org.ntlab.SproutServer.rooms.Room; import org.ntlab.SproutServer.rooms.Rooms; import javax.inject.Singleton; import javax.print.attribute.standard.Media; import javax.ws.rs.*; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.UriInfo; import java.util.HashMap; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * バトルを管理するクラス * * @author matsumoto_k */ public class Battles implements Runnable { private static Battles theInstance = null; // シングルトンパターン private HashMap<Integer, Battle> battleMap = new HashMap<>(); // バトル一覧 private int battleCount = 0; // バトルを識別するためのid private ScheduledThreadPoolExecutor schedule = null; @Context UriInfo uriInfo; private Battles() { System.out.println("create battles singleton"); schedule = new ScheduledThreadPoolExecutor(1); schedule.scheduleAtFixedRate(this, BattlesConst.UPDATE_DELAY, BattlesConst.UPDATE_INTERVAL, TimeUnit.MILLISECONDS); } public static Battles getInstance() { if (theInstance == null) { theInstance = new Battles(); } return theInstance; } // バトル作成 public int createBattle(Room room1, Room room2) { Battle battle = new Battle(room1, room2); battleMap.put(battleCount, battle); int resBattleCount = battleCount; battleCount++; return resBattleCount; } // ダミーバトル作成 public void createDummyBattle(int battleId, Room room1, Room room2) { Battle battle = new Battle(room1, room2); if (battleMap.get(battleId) != null) { battleMap.remove(battleId); } battleMap.put(battleId, battle); } // バトル削除 public void removeBattle(int battleId) { battleMap.remove(battleId); } public HashMap<Integer, Battle> getBattleMap() { return battleMap; } /** * プレイヤー情報の更新 * * @param battleId バトルID * @param roomId ルームID * @param userId ユーザーID * @param playerData 更新するプレイヤーの情報 */ public void updatePlayer(int battleId, int roomId, int userId, PlayerData playerData) { findBattleById(battleId).update(userId, roomId, playerData); } /** * Battlesのメインループ */ @Override public void run() { for (Battle battle : battleMap.values()) { battle.update(); } } /** * battleIdによってBattleを取得 * * @param battleId 取得したいbattleのbattleId * @return Battle */ public Battle findBattleById(int battleId) { return battleMap.get(battleId); } }