Commit 80a36517 authored by 18류지석's avatar 18류지석

Merge branch 'wordspace'

parents 150bcf6c 682e7530
var GameServer = GameServer || {};
GameServer.Phase = {READY: 0, START: 1, MAIN: 2, MUSIC: 3};
GameServer.startCount = 1;
GameServer.startCount = 3;
GameServer.currentPlayer = [];
GameServer.playingRoom = [];
......@@ -112,6 +112,14 @@ GameServer.announceToRoom = function(roomIdx, _message, _data = null)
element.socketId.emit(_message, _data);
});
}
GameServer.announceToTarget = function(roomIdx, targetNum, _message, _data = null)
{
let targetSocket = this.playingRoom[roomIdx].currentSocket.find(function(element)
{
return element.id === targetNum;
}).socketId;
targetSocket.emit(_message, _data);
}
// 데이터 동기화 함수 만들기
// 동기화할것: 유저리스트(id - nickname 쌍)
......
var socket = io.connect();
// init account
socket.emit('idRequest');
socket.on('setId', function(msg) // {str, num playerNum}
{
console.log(msg.str);
PlayerData.idNum = msg.num;
});
socket.on('setPlayerTypingRate', function(msg) // number playerTypingRate
{
WordSpace.PlayerTypingRate = msg;
console.log('rate: ' + msg);
});
// init game
socket.on('syncRoomData', function(msg) // {num roomNum, [] players}
{
console.log(msg);
RoomData.roomNum = msg.roomNum;
RoomData.players = msg.players;
RoomData.aliveCount = msg.players.length;
});
socket.on('startGame', function()
{
game.scene.start('gameScene');
});
// in game
socket.on('changePhase', function(msg) // number Phase
{
console.log('phase changed from ' + WordSpace.CurrentPhase + ' to ' + msg);
WordSpace.CurrentPhase = msg;
});
socket.on('setPlayerTypingRate', function(msg) // number playerTypingRate
{
WordSpace.PlayerTypingRate = msg;
//console.log('rate: ' + msg);
});
socket.on('attacked', function(msg) // object attackData
{
WordSpace.generateWord.Attack(WordSpace.gameSceneForTest, msg.text, msg.grade, msg.attacker, msg.isStrong);
});
// out game
socket.on('userDisconnect', function(msg) // {num index , num id, str nickname}
{
console.log(msg.index + ' / ' + msg.id + ' / ' + msg.nickname + ' disconnected');
RoomData.players[msg.index].isAlive = false;
RoomData.aliveCount--;
});
\ No newline at end of file
......@@ -60,6 +60,16 @@ var gameScene = new Phaser.Class(
WordSpace.setPlayerTyping.initiate(this);
WordSpace.nameWordTextForTest = WordSpace.gameSceneForTest.add.text(50,400,'현재 가진 호패들 : 없음').setDepth(10).setColor('#000000');
WordSpace.nameQueue.initiate();
RoomData.players.forEach(function(element)
{
if(element.nickname == PlayerData.nickname)
{
RoomData.myself = element;
return;
}
});
console.log(RoomData.myself);
},
update: function()
......@@ -71,7 +81,7 @@ var gameScene = new Phaser.Class(
let tempNames = '';
WordSpace.nameGroup.forEach(function(element)
{
tempNames += element.wordText + '\n';
tempNames += element.wordText + element.isStrong + '\n';
});
WordSpace.nameWordTextForTest.setText('현재 가진 호패들 : \n' + tempNames);
......
......@@ -114,19 +114,19 @@ class NormalWord extends WordObject
class AttackWord extends WordObject
{
constructor(text, _wordGrade, _attacker, isStrong)
constructor(text, _wordGrade, _playerData, isStrong)
{
super(text);
this.wordGrade = _wordGrade;
this.wordWeight = WordReader.getWordWeight(this.wordGrade);
if(WordReader.getWordTyping(_attacker) <= 9)
this.wordWeight += this.wordWeight * 0.2 * (WordReader.getWordTyping(PlayerData.nickname) - 9);
if(WordReader.getWordTyping(_playerData.nickname) <= 9)
this.wordWeight += this.wordWeight * 0.2 * (WordReader.getWordTyping(_playerData.nickname) - 9);
this.wordWeight *= isStrong ? 3 : 2;
this.attacker = _attacker;
this.attacker = _playerData;
//서버 사용하게 되면 PlayerTyping을 피격자의 것으로 바꿔야 함
this.counterTime = WordSpace.gameTimer.now + 1000 * (this.wordTyping <= (5 - _wordGrade) * 2.5 ? this.wordTyping * (WordSpace.playerTyping / 60) * 2 :
((5 - _wordGrade) * 2.5 + (this.wordTyping - (5 - _wordGrade) * 2.5) * 3) * (WordSpace.playerTyping / 60) * 2);
console.log('Attack text : ' + text + ', Attacker : ' + this.attacker + ', Weight : ' + this.wordWeight);
console.log('Attack text : ' + text + ', Attacker : ' + this.attacker.nickname + ', Weight : ' + this.wordWeight);
console.log('Counter time : ' + this.counterTime);
}
destroy()
......@@ -139,19 +139,22 @@ class AttackWord extends WordObject
case 3: WordSpace.attackGauge.add(0.5); break;
default: console.log('[ERR] wrong grade of word'); break;
}
if(WordSpace.gameTimer.now < this.counterTime) WordSpace.generateWord.Name(WordSpace.gameSceneForTest, true);
if(WordSpace.gameTimer.now < this.counterTime) WordSpace.nameGroup.push(new NameWord(this.attacker, true));
//강호패 넣기 구현해야됨
//WordSpace.generateWord.Name(WordSpace.gameSceneForTest, true);
super.destroy();
}
}
class NameWord extends WordObject
{
constructor(text, _isStrong = false)
constructor(player, _isStrong = false)
{
super(text);
super(player.nickname);
this.ownerId = player.id;
this.wordWeight = 2;
this.isStrong = _isStrong;
console.log('Name : ' + text + ', Strong : ' + this.isStrong + ', Weight : ' + this.wordWeight);
console.log('Name : ' + player.nickname + ', Strong : ' + this.isStrong + ', Weight : ' + this.wordWeight);
}
destroy()
{
......
var WordReader = WordReader || {};
//초성의 타수를 반환함
function firstSound(charText)
WordReader.firstSound = function(charText)
{
var r = parseInt(((charText.charCodeAt(0) - parseInt('0xac00',16)) /28) / 21);
//쌍자음일 경우
......@@ -10,7 +10,7 @@ function firstSound(charText)
}
//중성의 타수를 반환함
function middleSound(charText)
WordReader.middleSound = function(charText)
{
var r = parseInt(((charText.charCodeAt(0)- parseInt('0xac00',16)) / 28) % 21);
//'ㅒ' 또는 'ㅖ'일 경우
......@@ -21,7 +21,7 @@ function middleSound(charText)
}
//종성의 타수를 반환함
function lastSound(charText)
WordReader.lastSound = function(charText)
{
var r = parseInt((charText.charCodeAt(0) - parseInt('0xac00',16)) % 28);
//쌍자음일 경우
......@@ -40,7 +40,7 @@ WordReader.getWordTyping = function(stringText)
for(var i = 0; i < stringText.length; i++)
{
if(stringText.charCodeAt(i) < parseInt('0xac00',16) || stringText.charCodeAt(i) > parseInt('0xd7af',16)) return -1;
temp += parseFloat(firstSound(stringText.charAt(i))) + middleSound(stringText.charAt(i)) + lastSound(stringText.charAt(i));
temp += parseFloat(WordReader.firstSound(stringText.charAt(i))) + WordReader.middleSound(stringText.charAt(i)) + WordReader.lastSound(stringText.charAt(i));
}
return temp;
}
......
......@@ -120,7 +120,7 @@ WordSpace.AdjustVarByPhase = function(typingRate, phase)
else if(phase == WordSpace.Phase.START)
{
WordSpace.delay.WordSpawn = 3000;
WordSpace.delay.NameSpawn = 6000;
WordSpace.delay.NameSpawn = 15000;
WordSpace.NameSpawnReduce = 1000;
WordSpace.GradeProb[0] = 0.35;
WordSpace.GradeProb[1] = 1 - 0.4 * typingRate;
......@@ -129,20 +129,20 @@ WordSpace.AdjustVarByPhase = function(typingRate, phase)
else if(phase == WordSpace.Phase.MAIN)
{
WordSpace.delay.WordSpawn = 3000 - typingRate * 1000;
WordSpace.delay.NameSpawn = 6000;
WordSpace.delay.NameSpawn = 12000;
WordSpace.NameSpawnReduce = 1000;
WordSpace.GradeProb[0] = 0.4 - 0.4 * typingRate;
WordSpace.GradeProb[1] = 0.8 - 0.4 * typingRate;
WordSpace.GradeProb[2] = 1 - 0.2 * typingRate;
WordSpace.GradeProb[0] = 0.5 - 0.5 * typingRate;
WordSpace.GradeProb[1] = 1 - 0.5 * typingRate;
WordSpace.GradeProb[2] = 1 - 0.15 * typingRate;
}
else if(phase == WordSpace.Phase.MUSIC)
{
WordSpace.delay.WordSpawn = 1500;
WordSpace.delay.NameSpawn = 4000;
WordSpace.NameSpawnReduce = 500;
WordSpace.delay.NameSpawn = 8000;
WordSpace.NameSpawnReduce = 400;
WordSpace.GradeProb[0] = 0.2 - 0.2 * typingRate;
WordSpace.GradeProb[1] = 0.8 - 0.5 * typingRate;
WordSpace.GradeProb[2] = 0.9 - 0.2 * typingRate;
WordSpace.GradeProb[1] = 0.8 - 0.45 * typingRate;
WordSpace.GradeProb[2] = 0.9 - 0.15 * typingRate;
}
WordSpace.wordCycle.resetCycle(WordSpace.gameSceneForTest, WordSpace.delay.WordSpawn, WordSpace.wordCycle.currentCycle.getElapsed(), true);
WordSpace.nameCycle.resetCycle(WordSpace.gameSceneForTest, WordSpace.delay.NameSpawn, WordSpace.nameCycle.currentCycle.getElapsed(), true);
......@@ -252,8 +252,8 @@ WordSpace.generateWord =
},
Name: function(scene, isStrong, lenRate)
{
//To do
word = new NameWord(PlayerData.nickname, isStrong);
word = new NameWord(WordSpace.nameQueue.pop(), isStrong);
//word = new NameWord(RoomData.myself, false);
WordSpace.pushWord(scene, word, lenRate);
}
}
......@@ -276,6 +276,7 @@ function gameOver()
{
WordSpace.wordCycle.currentCycle.remove();
WordSpace.nameCycle.currentCycle.remove();
WordSpace.varAdjustCycle.currentCycle.remove();
//To Do
console.log('defeat');
}
......@@ -288,7 +289,6 @@ WordSpace.setGameOverTimer = function()
{
this.isTimerOn = true;
WordSpace.gameOverCycle.resetCycle(WordSpace.gameSceneForTest, WordSpace.delay.gameOver, 0, false);
console.log('Game over timer On');
}
}
......@@ -298,7 +298,6 @@ WordSpace.resetGameOverTimer = function()
{
this.isTimerOn = false;
WordSpace.gameOverCycle.currentCycle.paused = true;
console.log('Game over timer Off');
}
}
......@@ -334,9 +333,28 @@ WordSpace.findWord = function(wordText)
WordSpace.attackGauge.pauseCycle(true);
WordSpace.setPlayerTyping.add(wordText);
}
else
else // 오타 체크
{
// 오타 체크
let minDist = WordReader.getWordTyping(wordText) / 2 + 1, tempDist = 0;
let attackWords = [];
WordSpace.wordGroup.forEach(function(element)
{
if(element instanceof AttackWord)
{
tempDist = WordSpace.getEditDistance(wordText, element.wordText);
attackWords.push(element);
if(tempDist <= minDist) minDist = tempDist;
}
});
attackWords.forEach(function(element)
{
if(WordSpace.getEditDistance(wordText, element.wordText) == minDist)
{
//강호패 보내야 함
console.log('Attack word : ' + element.wordText + ' of ' + element.attacker.nickname + ' 오타임');
}
});
this.attackGauge.sub(2);
}
}
......@@ -364,25 +382,89 @@ WordSpace.attack = function(wordText, grade)
if (wordText != '')
{
console.log('attack ' + wordText + ', grade: ' + grade);
//호패에 따른 isStrong 구분 필요함
WordSpace.nameGroup.forEach(function(element)
{
WordSpace.generateWord.Attack(WordSpace.gameSceneForTest, wordText, grade, PlayerData.nickname, element.isStrong);
let attackData =
{
roomNum: RoomData.roomNum,
attacker: PlayerData,
target: element.ownerId,
text: wordText,
grade: grade,
isStrong: element.isStrong
}
socket.emit('attack', attackData);
});
//테스트용, 자기 자신에게 공격함
//WordSpace.generateWord.Attack(WordSpace.gameSceneForTest, wordText, grade, PlayerData, false);
WordSpace.nameGroup = [];
//WordSpace.generateWord(WordSpace.gameSceneForTest, wordText, grade, undefined, true); // for test
// 이부분에서 게이지에 따라 급수 결정
// 이걸 서버로 공격을 보내야 함
// 이부분은 서버 잘써야함
WordSpace.attackGauge.resetValue();
WordSpace.setPlayerTyping.add(wordText);
}
else
{
WordSpace.attackGauge.cutValue(0.3);
}
else WordSpace.attackGauge.cutValue(0.3);
Input.maxInput = 6;
Input.attackMode = false;
WordSpace.attackGauge.pauseCycle(false);
}
WordSpace.nameQueue =
{
queue: [],
shuffle: function()
{
let tempIdx, tempElement, tempLength;
let tempQueue = RoomData.players;
for(tempLength = tempQueue.length; tempLength; tempLength -= 1)
{
tempIdx = Math.floor(Math.random() * tempLength);
tempElement = tempQueue[tempLength - 1];
tempQueue[tempLength - 1] = tempQueue[tempIdx];
tempQueue[tempIdx] = tempElement;
}
tempQueue.forEach(function(element){
if(element.ownerId != PlayerData.idNum && element.isAlive)
WordSpace.nameQueue.queue.push(element);
});
},
pop: function()
{
let tempElement = WordSpace.nameQueue.queue.shift();
if(WordSpace.nameQueue.queue.length <= RoomData.aliveCount) this.shuffle();
return tempElement;
},
initiate: function()
{
this.shuffle();
this.shuffle();
}
}
WordSpace.getEditDistance = function(input, check) {
var inputWords = [], checkWords = []
for(let i = 0; i < input.length; i++)
{
inputWords.push(parseInt(((input[i].charCodeAt(0) - parseInt('0xac00',16)) /28) / 21) + parseInt('0x1100',16));
inputWords.push(parseInt(((input[i].charCodeAt(0)- parseInt('0xac00',16)) / 28) % 21) + parseInt('0x1161',16));
inputWords.push(parseInt((input[i].charCodeAt(0) - parseInt('0xac00',16)) % 28) + parseInt('0x11A8') -1);
}
for(let i = 0; i < check.length; i++)
{
checkWords.push(parseInt(((check[i].charCodeAt(0) - parseInt('0xac00',16)) /28) / 21) + parseInt('0x1100',16));
checkWords.push(parseInt(((check[i].charCodeAt(0)- parseInt('0xac00',16)) / 28) % 21) + parseInt('0x1161',16));
checkWords.push(parseInt((check[i].charCodeAt(0) - parseInt('0xac00',16)) % 28) + parseInt('0x11A8') -1);
}
var matrix = [];
var i, j;
for(i = 0; i <= checkWords.length; i++) // increment along the first column of each row
matrix[i] = [i];
for(j = 0; j <= inputWords.length; j++) // increment each column in the first row
matrix[0][j] = j;
for(i = 1; i <= checkWords.length; i++) // Fill in the rest of the matrix
for(j = 1; j <= inputWords.length; j++){
if(checkWords[i-1] == inputWords[j-1]) matrix[i][j] = matrix[i-1][j-1];
else matrix[i][j] = Math.min(matrix[i-1][j-1] + 1, // substitution
Math.min(matrix[i][j-1] + 1, // insertion
matrix[i-1][j] + 1)); // deletion
}
return matrix[checkWords.length][inputWords.length];
}
\ No newline at end of file
......@@ -25,4 +25,6 @@ PlayerData.nickname = '홍길동'; //플레이어 닉네임
var RoomData = RoomData || {};
RoomData.roomNum = -1;
RoomData.players = null;
\ No newline at end of file
RoomData.myself = null;
RoomData.players = null;
RoomData.aliveCount = -1;
\ No newline at end of file
......@@ -48,12 +48,23 @@ io.on('connection', function(socket)
socket.on('setPlayerTyping', function(msg) // number playerTyping
{
socket.playerData.playerTyping = msg;
//console.log(socket.playerData.currentRoom);
//console.log(socket.playerData.currentRoom.currentPlayer.length);
//let playerTypingRate = (msg - (socket.playerData.currentRoom.minTypingPlayer.playerTyping - socket.playerData.currentRoom.rateArrangePoint)) /
//(socket.playerData.currentRoom.maxTypingPlayer.playerTyping - socket.playerData.currentRoom.minTypingPlayer.playerTyping + socket.playerData.currentRoom.rateArrangePoint * 2);
//socket.emit('setPlayerTypingRate', playerTypingRate);
socket.playerData.playingData.playerTyping = msg;
if (socket.playerData.currentRoom.maxTypingPlayer.playerTyping < msg)
{
socket.playerData.currentRoom.maxTypingPlayer = socket.playerData.playingData;
}
if (socket.playerData.currentRoom.minTypingPlayer.playerTyping > msg)
{
socket.playerData.currentRoom.minTypingPlayer = socket.playerData.playingData;
}
let playerTypingRate = (msg - (socket.playerData.currentRoom.minTypingPlayer.playerTyping - socket.playerData.currentRoom.rateArrangePoint)) /
(socket.playerData.currentRoom.maxTypingPlayer.playerTyping - socket.playerData.currentRoom.minTypingPlayer.playerTyping + socket.playerData.currentRoom.rateArrangePoint * 2);
socket.emit('setPlayerTypingRate', playerTypingRate);
});
socket.on('attack', function(msg)
{
GameServer.announceToTarget(GameServer.findRoomIndex(msg.roomNum), msg.target, 'attacked', msg);
});
socket.on('disconnect', function(reason)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment