//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;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import tv.dyndns.kishibe.qmaclone.client.constant.Constant;
import tv.dyndns.kishibe.qmaclone.client.game.SessionData;
import tv.dyndns.kishibe.qmaclone.client.packet.PacketProblem;
import tv.dyndns.kishibe.qmaclone.client.packet.PacketResult;
import tv.dyndns.kishibe.qmaclone.client.statistics.PanelStatisticsRatingHistory;
import tv.dyndns.kishibe.qmaclone.client.statistics.PanelStatisticsUserAccuracyRate;
import com.google.common.base.Preconditions;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.rpc.AsyncCallback;
public class SceneResult extends SceneBase {
private static final Logger logger = Logger.getLogger(SceneResult.class.getName());
private final PanelResult panel;
private final SessionData sessionData;
public SceneResult(List<PacketProblem> problems, SessionData sessionData) {
this.panel = new PanelResult(problems);
this.sessionData = Preconditions.checkNotNull(sessionData);
Controller.getInstance().setGamePanel(panel);
}
private void getResult() {
final int sessionId = sessionData.getSessionId();
new RetryAsyncCallback<List<PacketResult>>() {
@Override
protected void request() {
Service.Util.getInstance().getResult(sessionId, this);
}
@Override
protected boolean onReceived(List<PacketResult> playerResults) {
if (playerResults == null) {
return false;
}
panel.setPlayerList(playerResults);
PacketResult myResult = null;
for (PacketResult result : playerResults) {
if (result.playerListId == sessionData.getPlayerListIndex()) {
myResult = result;
break;
}
}
Preconditions.checkNotNull(myResult);
// プレイヤー履歴書き換え
UserData record = UserData.get();
// ハイスコア更新
if (!sessionData.isThemeMode() && record.getHighScore() < myResult.score) {
record.setHighScore(myResult.score);
}
// プレイ回数
int playCount = record.getPlayCount();
if (playCount == Integer.MAX_VALUE) {
playCount = 0;
}
++playCount;
record.setPlayCount(playCount);
// 平均得点
if (!sessionData.isThemeMode()) {
int averageScore = record.getAverageScore() * (record.getPlayCount() - 1);
averageScore += myResult.score;
averageScore /= record.getPlayCount();
record.setAverageScore(averageScore);
}
// 平均順位
float avarageRank = record.getAverageRank() * (float) (record.getPlayCount() - 1);
avarageRank += (float) myResult.rank;
avarageRank /= record.getPlayCount();
record.setAvarageRank(avarageRank);
// レーティング計算
int oldRating = record.getRating();
int newRating = myResult.newRating;
Service.Util.getInstance().notifyGameFinished(record.getUserCode(), oldRating,
newRating, sessionData.getSessionId(), callbackNotifyGameFinished);
record.setRating(myResult.newRating);
record.setVolatility(myResult.newVolatility);
Service.Util.getInstance().addRatingHistory(UserData.get().getUserCode(),
myResult.newRating, callbackAddRatingHistory);
PanelStatisticsRatingHistory.getInstance().resetFlag();
// クラス
int classLevel = record.getClassLevel();
if (myResult.score >= classLevel * 100 + 500 || myResult.rank == 1) {
if (++classLevel >= (Constant.MAX_CLASS_LEVEL + 1)
* Constant.STEP_PER_CLASS_LEVEL) {
classLevel = (Constant.MAX_CLASS_LEVEL + 1) * Constant.STEP_PER_CLASS_LEVEL
- 1;
}
} else if (myResult.score < classLevel * 100 - 500 || myResult.rank == 8) {
if (--classLevel <= 0) {
classLevel = 0;
}
}
record.setClassLevel(classLevel);
record.save();
if (PanelStatisticsUserAccuracyRate.getInstance() != null) {
PanelStatisticsUserAccuracyRate.getInstance().update();
}
return true;
}
@Override
protected void onLightFailure(Throwable caught) {
logger.log(Level.WARNING, "最終結果の取得に失敗しました。リクエストを再送します。");
}
@Override
protected void onHeavyFailure(Throwable caught) {
logger.log(Level.SEVERE, "通信エラーが発生しました。ゲームを中断します。");
}
}.start();
}
private final AsyncCallback<Void> callbackAddRatingHistory = new AsyncCallback<Void>() {
@Override
public void onSuccess(Void result) {
}
@Override
public void onFailure(Throwable caught) {
logger.log(Level.WARNING, "レーティング履歴の登録に失敗しました", caught);
}
};
private final AsyncCallback<Void> callbackNotifyGameFinished = new AsyncCallback<Void>() {
@Override
public void onSuccess(Void result) {
}
@Override
public void onFailure(Throwable caught) {
logger.log(Level.WARNING, "ゲーム終了の通知に失敗しました", caught);
}
};
@Override
protected void onLoad() {
super.onLoad();
new Timer() {
@Override
public void run() {
getResult();
}
}.schedule(1000);
}
}