Files
chocomae/src/game/ranking/ranking.js
T

637 lines
16 KiB
JavaScript

var Ranking = {
preload: function() {
game.load.image('icon_fullscreen', '../../../resources/image/icon/fullscreen_white.png');
game.load.image('bg_white', '../../../resources/image/ui/white_rect.png');
},
create: function() {
this.dbConnectManager = new DBConnectManager();
this.jsonData = null;
this.timeType = Ranking.MODE_HOUR;
this.refreshTimeSec = Ranking.REFRESH_TIME_SEC;
this.showingPageIndex = 0;
this.recordArray = [];
this.dateTime = null;
this.date = "";
this.time = "";
this.getDateTimeNow();
// bg
this.game.stage.backgroundColor = '#4d4d4d';
var posY = 100;
this.bgTimeline = game.add.sprite(0, 60, "bg_white");
this.bgTimeline.width = GAME_SCREEN_SIZE.x;
this.bgTimeline.height = 80;
this.setBgColor(this.timeType);
// keyboard shortcut
this.keyboardShortcut = new KeyboardShortcut();
this.keyboardShortcut.addCallback(
Phaser.KeyCode.ESC, // keyCode
null, // keyDownHandler
(function() { this.back(); }).bind(this), // keyUpHandler
"ranking" // callerClassName
);
// top ui
var screenTopUI = new ScreenTopUI();
screenTopUI.makeBackButton( (function() { this.back(); }).bind(this) );
screenTopUI.makeFullScreenButton();
var resultTextStyle = textStyleBasic;
resultTextStyle.font = "bold 42px Arial";
this.textTitle = game.add.text(
GAME_SCREEN_SIZE.x / 2, 32,
sessionStorageManager.getPlayingAppKoreanName() + " - 수업시간 순위",
resultTextStyle
).setShadow(3, 3, 'rgba(0, 0, 0, 0.5)', 2);
this.textTitle.anchor.set(0.5);
this.textTitle.addColor("#ff6666", 0);
// date time
this.textDateTime = game.add.text(GAME_SCREEN_SIZE.x / 2, 104, "", resultTextStyle);
this.textDateTime.fontSize = 28;
this.textDateTime.fontWeight = "normal";
this.textDateTime.stroke = "#333333";
this.textDateTime.strokeThickness = 3;
//.setShadow(3, 3, 'rgba(0, 0, 0, 0.5)', 2);
this.textDateTime.anchor.set(0.5);
// this.textDateTime.addColor("#ff6666", 0);
this.printDateTime(this.dateTime);
// ranking text
var rankingTextOffsetY = 190;
this.rankingTexts = new Array();
for(var i = 0; i < Ranking.RANK_COUNT; i++) {
var posX = ( (i < 10) ? 120 : 80 + (GAME_SCREEN_SIZE.x / 2) );
var posY = rankingTextOffsetY + (i % 10) * 40;
this.rankingTexts[i] = new RankingText(
RankingText.PLACE_FOR_RANKING,
posX, posY,
sessionStorageManager.getPlayingAppID()
);
}
var buttonOffsetX = 320;
var buttonPositionY = 100;
var dateTimeButtonWidth = 40;
this.buttonPrevDate = this.makeArrowButton(
buttonOffsetX, buttonPositionY,
dateTimeButtonWidth, dateTimeButtonWidth,
"<",
(function() { this.decreaseDateTime(); }).bind(this)
);
// this.buttonPrevDate.inputEnabled = false;
this.buttonNextDate = this.makeArrowButton(
GAME_SCREEN_SIZE.x - buttonOffsetX, buttonPositionY,
dateTimeButtonWidth, dateTimeButtonWidth,
">",
(function() { this.increaseDateTime(); }).bind(this)
);
// this.buttonNextDate.inputEnabled = false;
var buttonTestDate = null;
if(runMode == MODE_DEBUG) {
buttonTestDate = this.makeArrowButton(
30, buttonPositionY,
50, 50,
"@",
(function() {
this.date = "2018-08-23";
this.time = "15:53:00";
this.dateTime = new Date(this.date + "T" + this.time);
this.getRecordToRankingServer();
}).bind(this)
);
}
buttonOffsetX = 30;
buttonPositionY = 370;
this.buttonPrevRanking = this.makeArrowButton(
buttonOffsetX, buttonPositionY,
50, 400,
"<",
(function() { this.onClickPrevRanking(); }).bind(this)
);
// this.buttonPrevRanking.setInputEnabled(false);
this.buttonNextRanking = this.makeArrowButton(
GAME_SCREEN_SIZE.x - buttonOffsetX, buttonPositionY,
50, 400,
">",
(function() { this.onClickNextRanking() }).bind(this)
);
// this.buttonNextRanking.setInputEnabled(false);
buttonPositionY = 650;
var buttonHour = this.makeTextButton(
game.world.centerX - 220, buttonPositionY,
"수업시간 순위",
(function() { this.onClickRankingHour(); }).bind(this)
);
// buttonHour.setInputEnabled(false);
var buttonDay = this.makeTextButton(
game.world.centerX, buttonPositionY,
"오늘의 순위",
(function() { this.onClickRankingDay(); }).bind(this)
);
// buttonDay.setInputEnabled(false);
var buttonMonth = this.makeTextButton(
game.world.centerX + 220, buttonPositionY,
"이달의 순위",
(function() { this.onClickRankingMonth(); }).bind(this)
);
// buttonMonth.setInputEnabled(false);
// bottom ui
this.screenBottomUI = new ScreenBottomUI();
// ScreenBottomUI.printLeftText("게임 진행 정보");
// var playingAppName = appInfoManager.getAppNameKorean(sessionStorageManager.getPlayingAppName());
// ScreenBottomUI.printCenterText(playingAppName);
// this.screenBottomUI.printCenterText("수업시간 순위");
this.screenBottomUI.printRightText(sessionStorageManager.getPlayerName());
this.getRecordToRankingServer();
game.time.events.loop(Phaser.Timer.SECOND * this.refreshTimeSec, this.getRecordToRankingServer, this);
},
back: function() {
location.href = '../../web/client/start.html';
},
makeArrowButton: function(x, y, width, height, buttonText, eventListener) {
var setting = new RoundRectButtonSetting(x, y, width, height);
setting.fontStyle.fontWeight = "bold";
setting.strokeColors = {
out: 0x444444, // 0xdddddd,
over: 0x333333, // 0xcccccc,
down: 0x222222, // 0xbbbbbb,
disabled: 0x333333
};
setting.buttonColors = {
out: 0x666666, // 0xffffff,
over: 0x444444, // 0xdddddd,
down: 0x333333, // 0xcccccc,
disabled: 0x333333
};
setting.textColors = {
out: "#fff", // "#000",
over: "#000",
down: "#000",
disabled: "#999"
};
return new RoundRectButton(setting, RoundRectButton.NONE_ICON, buttonText, eventListener);
},
makeTextButton: function(x, y, buttonText, eventListener) {
var setting = new RoundRectButtonSetting(x, y, 200, 100);
setting.fontStyle.fontWeight = "bold";
switch(buttonText) {
case "수업시간 순위":
setting.strokeColors = {
out: 0xddcccc,
over: 0xccaaaa,
down: 0xbb9999,
disabled: 0x333333
};
setting.buttonColors = {
out: 0xffeeee,
over: 0xddcccc,
down: 0xccaaaa,
disabled: 0x333333
};
setting.textColors = {
out: "#f00",
over: "#f00",
down: "#f00",
disabled: "#999"
};
break;
case "오늘의 순위":
setting.strokeColors = {
out: 0xccccdd,
over: 0xaaaacc,
down: 0x9999bb,
disabled: 0x333333
};
setting.buttonColors = {
out: 0xeeeeff,
over: 0xccccdd,
down: 0xaaaacc,
disabled: 0x333333
};
setting.textColors = {
out: "#00f",
over: "#00f",
down: "#00f",
disabled: "#999"
};
break;
case "이달의 순위":
setting.strokeColors = {
out: 0xccddcc,
over: 0xaaccaa,
down: 0x99bb99,
disabled: 0x333333
};
setting.buttonColors = {
out: 0xeeffee,
over: 0xccddcc,
down: 0xaaccaa,
disabled: 0x333333
};
setting.textColors = {
out: "#0f0",
over: "#0f0",
down: "#0f0",
disabled: "#999"
};
break;
}
return new RoundRectButton(setting, RoundRectButton.NONE_ICON, buttonText, eventListener);
},
getDateTimeType: function() {
var dateTimeType = -1;
switch(this.timeType) {
case Ranking.MODE_HOUR:
dateTimeType = DBConnectManager.TYPE_MY_RANKING_HOUR;
break;
case Ranking.MODE_DAY:
dateTimeType = DBConnectManager.TYPE_MY_RANKING_DAY;
break;
case Ranking.MODE_MONTH:
dateTimeType = DBConnectManager.TYPE_MY_RANKING_MONTH;
break;
}
return dateTimeType;
},
getRndInteger: function(min, max) {
return Math.floor(Math.random() * (max - min + 1) ) + min;
},
getSampleRankingRecord: function() {
var rankingRecordManager = new RankingRecordManager();
var playerNameList = [
"김가람", "강가온", "고길", "한나라", "강나래",
"오나예", "박노아", "부노을", "한다은", "최두루",
"신두나", "최해솔", "김모든", "설보라", "민모든",
"이보람", "이빛길", "정새론", "한새얀", "채세련",
"태슬예", "진승아", "강시원", "김아롱", "박알찬",
"김다은", "황세련", "강원", "지소은", "남궁민"
];
var shuffleList = Phaser.ArrayUtils.shuffle(playerNameList);
for(var i = 0; i < 30; i++) {
var record = new RankingRecord(
i + 1, // rank
i + 1, // playerID
shuffleList[i], // playerName
this.getRndInteger(1000 - (i + 1) * 20, 1000 - (i + 1) * 10) // record
);
rankingRecordManager.push(record);
}
return rankingRecordManager;
},
getRecordToRankingServer: function() {
this.recordArray == [];
if(isExperiencePlayerAccount()) {
this.showRanking(this.getSampleRankingRecord());
return;
}
this.dbConnectManager.requestRanking(
this.getDateTimeType(),
sessionStorageManager.getMaestroID(),
this.date,
this.time,
(function(type, rankingRecordManager) {
this.showRanking(rankingRecordManager);
}).bind(this)
);
},
onClickRankingHour: function() {
this.timeType = Ranking.MODE_HOUR;
this.textTitle.text = sessionStorageManager.getPlayingAppKoreanName() + " - 수업시간 순위";
this.textTitle.addColor("#ff6666", 0);
this.printDateTime(this.dateTime);
this.getRecordToRankingServer();
this.setFirstPageIndex();
this.setBgColor(this.timeType);
},
onClickRankingDay: function() {
this.timeType = Ranking.MODE_DAY;
this.textTitle.text = sessionStorageManager.getPlayingAppKoreanName() + " - 오늘의 순위";
this.textTitle.addColor("#9999ff", 0);
this.printDateTime(this.dateTime);
this.getRecordToRankingServer();
this.setFirstPageIndex();
this.setBgColor(this.timeType);
},
onClickRankingMonth: function() {
this.timeType = Ranking.MODE_MONTH;
this.textTitle.text = sessionStorageManager.getPlayingAppKoreanName() + " - 이달의 순위";
this.textTitle.addColor("#99ff99", 0);
this.printDateTime(this.dateTime);
this.getRecordToRankingServer();
this.setFirstPageIndex();
this.setBgColor(this.timeType);
},
showRanking: function(rankingRecordManager) {
this.recordArray = [];
if(sessionStorageManager.getMaestroAccountType() == 101) {
this.recordArray = this.getDummyRankList();
this.printRanking();
return;
}
if(rankingRecordManager.getCount() == 0) {
this.setFirstPageIndex();
this.printRanking();
return;
}
var rankingListCount = rankingRecordManager.getCount();
for(var i = 0; i < rankingListCount; i++) {
var record = [];
// record[0] = jsonRankingList[i]['UserID'];
record[0] = rankingRecordManager.getPlayerIDAt(i); // playerID
record[1] = i + 1; // ranking
record[2] = rankingRecordManager.getPlayerNameAt(i);
record[3] = rankingRecordManager.getBestRecordAt(i);
// console.log("record : " + record[0] + ", " + record[1] + ", " + record[2]);
this.recordArray.push(record);
}
this.printDateTime(this.dateTime);
this.printRanking();
},
emptyRanking: function() {
for(var i = 0; i < Ranking.RANK_COUNT; i++) {
this.rankingTexts[i].reset();
}
},
printRanking: function() {
this.emptyRanking();
this.updateRankingNavigationButtons();
if(this.recordArray.length == 0)
return;
// timezone changed (ex: 2pm -> 3pm)
if(this.showingPageIndex * 20 > this.recordArray.length)
this.setFirstPageIndex();
// print
for(var i = 0; i < Ranking.RANK_COUNT; i++) {
var index = this.showingPageIndex * 20 + i;
var record = this.recordArray[index];
if(typeof record == "undefined")
break;
this.rankingTexts[i].setContents(record[0], record[1], record[2], record[3]);
}
this.updateRankingNavigationButtons();
},
updateRankingNavigationButtons: function() {
if(this.recordArray.length == 0) {
this.buttonPrevRanking.text.text = "X";
this.buttonNextRanking.text.text = "X";
return;
}
if(this.showingPageIndex > 0)
this.buttonPrevRanking.text.text = "<";
else
this.buttonPrevRanking.text.text = "X";
if((this.showingPageIndex + 1) * 20 < this.recordArray.length)
this.buttonNextRanking.text.text = ">";
else
this.buttonNextRanking.text.text = "X";
},
getDummyRankList: function() {
var dummyRankList = [
[ '1', 'test1', '600' ],
[ '2', 'test2', '500' ],
[ '3', 'test3', '450' ],
[ '4', 'test4', '400' ],
[ '5', 'test5', '350' ],
[ '6', 'test6', '300' ],
[ '7', 'test7', '250' ],
[ '8', 'test8', '200' ],
[ '9', 'test9', '150' ],
[ '10', 'test10', '100' ],
[ '11', 'test11', '90' ],
[ '12', 'test12', '80' ],
[ '13', 'test13', '70' ],
[ '14', 'test14', '60' ],
[ '15', 'test15', '50' ],
[ '16', 'test16', '45' ],
[ '17', 'test17', '40' ],
[ '18', 'test18', '35' ],
[ '19', 'test19', '30' ],
[ '20', 'test20', '25' ],
[ '21', 'test21', '20' ],
[ '22', 'test22', '15' ],
[ '23', 'test23', '10' ],
[ '24', 'test24', '9' ],
[ '25', 'test25', '8' ],
[ '26', 'test26', '7' ],
[ '27', 'test27', '6' ],
[ '28', 'test28', '5' ],
[ '29', 'test29', '4' ],
[ '30', 'test30', '3' ],
[ '31', 'test31', '2' ],
[ '32', 'test32', '1' ],
];
return dummyRankList;
},
getDateTimeNow: function() {
var now = new Date();
var hourTimeText = DateUtil.getYYYYMMDD(now) + "T" + DateUtil.getFullHours(now) + ":00:00";
this.dateTime = new Date(hourTimeText);
this.date = DateUtil.getYYYYMMDD(this.dateTime);
this.time = DateUtil.getHHMMSS(this.dateTime);
},
setDateTime: function(dateTime) {
this.date = DateUtil.getYYYYMMDD(dateTime);
this.time = DateUtil.getHHMMSS(dateTime);
},
increaseDateTime: function() {
switch(this.timeType) {
case Ranking.MODE_HOUR:
this.dateTime.setHours(this.dateTime.getHours() + 1);
break;
case Ranking.MODE_DAY:
this.dateTime.setDate(this.dateTime.getDate() + 1);
break;
case Ranking.MODE_MONTH:
this.dateTime.setMonth(this.dateTime.getMonth() + 1);
break;
}
this.setDateTime(this.dateTime);
this.printDateTime(this.dateTime);
this.getRecordToRankingServer();
},
decreaseDateTime: function() {
switch(this.timeType) {
case Ranking.MODE_HOUR:
this.dateTime.setHours(this.dateTime.getHours() - 1);
break;
case Ranking.MODE_DAY:
this.dateTime.setDate(this.dateTime.getDate() - 1);
break;
case Ranking.MODE_MONTH:
this.dateTime.setMonth(this.dateTime.getMonth() - 1);
break;
}
this.setDateTime(this.dateTime);
this.printDateTime(this.dateTime);
this.getRecordToRankingServer();
},
getDatetimeHour: function() {
return this.dateTime.getHours();
},
getDatetimeHourWith2Digits: function() {
return ("0" + this.dateTime.getHours()).slice(-2);
},
getYYYYMMDDHHText: function(dateTime) {
return DateUtil.getFullYear(dateTime) + "년 "
+ DateUtil.getFullMonth(dateTime) + "월 "
+ DateUtil.getFullDate(dateTime) + "일, "
+ DateUtil.getFullHours(dateTime) + "시";
},
getYYYYMMDDText: function(dateTime) {
return DateUtil.getFullYear(dateTime) + "년 "
+ DateUtil.getFullMonth(dateTime) + "월 "
+ DateUtil.getFullDate(dateTime) + "일";
},
getYYYYMMText: function(dateTime) {
return DateUtil.getFullYear(dateTime) + "년 "
+ DateUtil.getFullMonth(dateTime) + "월 ";
},
printDateTime: function(dateTime) {
// console.log(this.timeType);
// console.log((this.dateTime);
switch(this.timeType) {
case Ranking.MODE_HOUR:
this.textDateTime.text = this.getYYYYMMDDHHText(dateTime);
break;
case Ranking.MODE_DAY:
this.textDateTime.text = this.getYYYYMMDDText(dateTime);
break;
case Ranking.MODE_MONTH:
this.textDateTime.text = this.getYYYYMMText(dateTime);
break;
}
},
onClickPrevRanking: function() {
if(this.recordArray.length == 0)
return;
this.showingPageIndex--;
if(this.showingPageIndex < 0)
this.showingPageIndex = 0;
this.printRanking();
},
onClickNextRanking: function() {
if(this.recordArray.length == 0)
return;
if((this.showingPageIndex + 1) * 20 < this.recordArray.length)
this.showingPageIndex++;
this.printRanking();
},
setFirstPageIndex: function() {
this.showingPageIndex = 0;
},
setBgColor: function(timeType) {
switch(timeType) {
case Ranking.MODE_HOUR:
this.bgTimeline.tint = 0x5f4d4d;
break;
case Ranking.MODE_DAY:
this.bgTimeline.tint = 0x4d4d5f;
break;
case Ranking.MODE_MONTH:
this.bgTimeline.tint = 0x4d5f4d;
break;
}
},
}
Ranking.MODE_HOUR = "mode_hour";
Ranking.MODE_DAY = "mode_day";
Ranking.MODE_MONTH = "mode_month";
Ranking.REFRESH_TIME_SEC = 5;
Ranking.RANK_COUNT = 20;