//The MIT License
//
//Copyright (c) 2009 nodchip
//
//Permission is hereby granted, free of charge, to any person obtaining a copy
//of this software and associated documentation files (the "Software"), to deal
//in the Software without restriction, including without limitation the rights
//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
//copies of the Software, and to permit persons to whom the Software is
//furnished to do so, subject to the following conditions:
//
//The above copyright notice and this permission notice shall be included in
//all copies or substantial portions of the Software.
//
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
//THE SOFTWARE.
package tv.dyndns.kishibe.qmaclone.client.lobby;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import tv.dyndns.kishibe.qmaclone.client.Controller;
import tv.dyndns.kishibe.qmaclone.client.SceneBase;
import tv.dyndns.kishibe.qmaclone.client.SceneMatching;
import tv.dyndns.kishibe.qmaclone.client.Service;
import tv.dyndns.kishibe.qmaclone.client.StatusUpdater;
import tv.dyndns.kishibe.qmaclone.client.UserData;
import tv.dyndns.kishibe.qmaclone.client.constant.Constant;
import tv.dyndns.kishibe.qmaclone.client.game.GameMode;
import tv.dyndns.kishibe.qmaclone.client.game.ProblemGenre;
import tv.dyndns.kishibe.qmaclone.client.game.ProblemType;
import tv.dyndns.kishibe.qmaclone.client.game.SessionData;
import tv.dyndns.kishibe.qmaclone.client.packet.NewAndOldProblems;
import tv.dyndns.kishibe.qmaclone.client.packet.PacketPlayerSummary;
import tv.dyndns.kishibe.qmaclone.client.packet.PacketRegistrationData;
import tv.dyndns.kishibe.qmaclone.client.packet.PacketServerStatus;
import com.google.common.base.Strings;
import com.google.gwt.user.client.rpc.AsyncCallback;
public class SceneLobby extends SceneBase {
private static final Logger logger = Logger.getLogger(SceneLobby.class.getName());
public static final int SESSION_TYPE_VS_COM = 0;
public static final int SESSION_TYPE_WHOLE = 1;
public static final int SESSION_TYPE_EVENT = 2;
public static final int SESSION_TYPE_THEME = 3;
private static final int UPDATE_INTERVAL = 10 * 1000;
private LobbyUi lobbyUi = new LobbyUi(this);
private final StatusUpdater<PacketServerStatus> updater = new StatusUpdater<PacketServerStatus>(
PacketServerStatus.class.getName(), UPDATE_INTERVAL) {
@Override
protected void request(AsyncCallback<PacketServerStatus> callback) {
Service.Util.getInstance().getServerStatus(callback);
}
@Override
protected PacketServerStatus parse(String json) {
return PacketServerStatus.Json.READER.read(json);
}
@Override
protected void onReceived(PacketServerStatus status) {
setServerStatus(status);
}
};
private boolean addPenalty = false;
private boolean event;
private boolean themeMode;
private void updateServerData() {
Service.Util.getInstance().getServerStatus(callbackGetServerStatus);
}
private final AsyncCallback<PacketServerStatus> callbackGetServerStatus = new AsyncCallback<PacketServerStatus>() {
public void onSuccess(PacketServerStatus result) {
setServerStatus(result);
}
public void onFailure(Throwable caught) {
logger.log(Level.WARNING, "サーバー状態の取得中にエラーが発生しました", caught);
}
};
private void setServerStatus(PacketServerStatus status) {
if (status == null) {
logger.log(Level.WARNING, "取得したサーバー情報が壊れています");
return;
}
if (lobbyUi == null) {
return;
}
lobbyUi.setServerStatus(status);
lobbyUi.setLastestPlayers(status.lastestPlayers);
}
public void register(int sessionType) {
PacketPlayerSummary playlerSummary = lobbyUi.getPlayerSummary();
Set<ProblemGenre> genres = lobbyUi.getGenres();
Set<ProblemType> types = lobbyUi.getTypes();
String greeting = lobbyUi.getGreeting();
NewAndOldProblems newAndOldProblems = lobbyUi.getNewAndOldProblems();
boolean publicEvent = lobbyUi.getPublicEvent();
UserData record = UserData.get();
int classNumber = record.getClassLevel();
int classLevel = classNumber / Constant.STEP_PER_CLASS_LEVEL;
if (classLevel >= Constant.MAX_CLASS_LEVEL) {
classLevel = Constant.MAX_CLASS_LEVEL;
}
String imageFileName = record.getImageFileName();
GameMode gameMode;
String roomName;
String theme;
switch (sessionType) {
case SESSION_TYPE_VS_COM: {
gameMode = GameMode.VS_COM;
roomName = null;
theme = null;
this.event = false;
this.themeMode = false;
addPenalty = false;
break;
}
case SESSION_TYPE_WHOLE: {
gameMode = GameMode.WHOLE;
roomName = null;
theme = null;
this.event = true;
this.themeMode = false;
addPenalty = true;
break;
}
case SESSION_TYPE_EVENT: {
gameMode = GameMode.EVENT;
roomName = lobbyUi.getEventName();
theme = null;
this.event = true;
this.themeMode = false;
addPenalty = true;
break;
}
case SESSION_TYPE_THEME: {
gameMode = GameMode.THEME;
roomName = null;
theme = lobbyUi.getThemeModeTheme();
if (Strings.isNullOrEmpty(theme)) {
return;
}
this.event = true;
this.themeMode = true;
addPenalty = false;
break;
}
default: {
gameMode = null;
roomName = null;
theme = null;
this.event = false;
addPenalty = true;
break;
}
}
int difficultSelect = lobbyUi.getDifficultSelect();
int rating = UserData.get().getRating();
int userCode = UserData.get().getUserCode();
int volatility = UserData.get().getVolatility();
int playCount = UserData.get().getPlayCount();
Service.Util.getInstance().register(playlerSummary, genres, types, greeting, gameMode,
roomName, theme, imageFileName, classLevel, difficultSelect, rating, userCode,
volatility, playCount, newAndOldProblems, publicEvent, callbackRegister);
}
private final AsyncCallback<PacketRegistrationData> callbackRegister = new AsyncCallback<PacketRegistrationData>() {
public void onSuccess(PacketRegistrationData result) {
if (result == null) {
logger.log(Level.SEVERE, "登録処理中にエラーが発生しました。ゲームを中断します。頻繁に発生する場合は管理者に御連絡ください。");
return;
}
if (result.sessionId == 0) {
logger.log(Level.SEVERE, "登録データにエラーが見つかりました。ゲームを中断します。頻繁に発生する場合は管理者に御連絡ください。");
return;
}
SessionData sessionData = new SessionData(result.sessionId, result.playerListIndex,
addPenalty, event, themeMode);
// シーン切り替え
Controller.getInstance().setScene(new SceneMatching(sessionData));
lobbyUi = null;
}
public void onFailure(Throwable caught) {
logger.log(Level.SEVERE, "登録処理中にエラーが発生しました。頻繁に発生する場合は管理者に御連絡ください。", caught);
}
};
@Override
protected void onLoad() {
super.onLoad();
Controller.getInstance().setGamePanel(lobbyUi);
updateServerData();
updater.start();
}
@Override
protected void onUnload() {
updater.stop();
super.onUnload();
}
}