Commit 52234806 authored by 18신대성's avatar 18신대성

Merge branch 'server' into release

parents dfc0f826 14a0c0c2
...@@ -2,7 +2,7 @@ var GameServer = GameServer || {}; ...@@ -2,7 +2,7 @@ var GameServer = GameServer || {};
GameServer.serverNumber = -1; GameServer.serverNumber = -1;
GameServer.Phase = {READY: 0, COUNT: -1, START: 1, MAIN: 2, MUSIC: 3}; GameServer.Phase = {READY: 0, COUNT: -1, START: 1, MAIN: 2, MUSIC: 3, GAMEEND: 4};
GameServer.connectCount = 0; GameServer.connectCount = 0;
GameServer.disconnectCount = 0; GameServer.disconnectCount = 0;
...@@ -35,7 +35,9 @@ GameServer.enterEmptyRoom = function(playerSocket) ...@@ -35,7 +35,9 @@ GameServer.enterEmptyRoom = function(playerSocket)
let emptyRoomIndex = -1; let emptyRoomIndex = -1;
for (let i = 0; i < this.playingRoom.length; i++) for (let i = 0; i < this.playingRoom.length; i++)
{ {
if ((this.playingRoom[i].currentPhase === this.Phase.READY || this.playingRoom[i].currentPhase === this.Phase.COUNT) && this.playingRoom[i].maxPlayer > this.playingRoom[i].currentPlayer.length) if ((this.playingRoom[i].currentPhase === this.Phase.READY || this.playingRoom[i].currentPhase === this.Phase.COUNT)
&& this.playingRoom[i].maxPlayer > this.playingRoom[i].currentPlayer.length
&& this.playingRoom[i].checkHopae(playerSocket.playerData.nickname))
{ {
emptyRoomIndex = i; emptyRoomIndex = i;
break; break;
...@@ -80,7 +82,7 @@ class GameRoom ...@@ -80,7 +82,7 @@ class GameRoom
{ {
this.roomId = GameServer.getRoomNumber(); this.roomId = GameServer.getRoomNumber();
this.roomIndex = -1; this.roomIndex = -1;
this.startCount = 5; this.startCount = 2;
this.maxPlayer = 100; this.maxPlayer = 100;
this.nextRank = 100; this.nextRank = 100;
...@@ -116,6 +118,11 @@ class GameRoom ...@@ -116,6 +118,11 @@ class GameRoom
console.log('[LOG] new room #'+this.roomId+' made, roomCount: ' + GameServer.playingRoom.length); console.log('[LOG] new room #'+this.roomId+' made, roomCount: ' + GameServer.playingRoom.length);
} }
checkHopae(newHopae)
{
return !this.currentPlayer.includes((element) => element.nickname === newHopae);
}
enterRoom(playerSocket) enterRoom(playerSocket)
{ {
let playerInst = new Player(this, playerSocket.playerData); let playerInst = new Player(this, playerSocket.playerData);
...@@ -136,7 +143,7 @@ class GameRoom ...@@ -136,7 +143,7 @@ class GameRoom
{ {
if (this.currentPhase === GameServer.Phase.READY) if (this.currentPhase === GameServer.Phase.READY)
{ {
this.endTime = Date.now() + 1000; // 테스트용 10초 this.endTime = Date.now() + 10000; // 테스트용 10초
this.announceToRoom('setRoomCount', this.announceToRoom('setRoomCount',
{ {
isEnable: true, endTime: this.endTime, playerCount: this.currentPlayer.length, isEnable: true, endTime: this.endTime, playerCount: this.currentPlayer.length,
...@@ -172,11 +179,26 @@ class GameRoom ...@@ -172,11 +179,26 @@ class GameRoom
{ {
for (let j = i+1; j < this.currentPlayer.length; j++) for (let j = i+1; j < this.currentPlayer.length; j++)
{ {
this.currentPlayer[i].index--; this.currentPlayer[j].index--;
}
this.aliveCount--;
if (this.aliveCount < this.startCount)
{
this.announceToRoom('setRoomCount',
{
isEnable: false, endTime: 0, playerCount: this.currentPlayer.length,
isEnter: false, player: this.currentPlayer[i]
});
this.currentPhase = GameServer.Phase.READY;
this.refreshRoom();
} }
else this.announceToRoom('setRoomCount',
{
isEnable: true, endTime: this.endTime, playerCount: this.currentPlayer.length,
isEnter: false, player: this.currentPlayer[i]
});
this.currentPlayer.splice(i, 1); this.currentPlayer.splice(i, 1);
this.currentSocket.splice(i, 1); this.currentSocket.splice(i, 1);
this.aliveCount--;
return; return;
} }
} }
...@@ -184,6 +206,42 @@ class GameRoom ...@@ -184,6 +206,42 @@ class GameRoom
return; return;
} }
refreshRoom()
{
this.currentPhase = GameServer.Phase.READY;
this.aliveCount = this.currentPlayer.length;
if (this.startTimer != undefined)
{
clearTimeout(this.startTimer);
this.startTimer = undefined;
}
if (this.currentPhase != GameServer.Phase.GAMEEND)
{
this.announceToRoom('enterRoom');
this.announceToRoom('syncRoomScene', this.currentPlayer);
this.announceToRoom('setRoomCount', {
isEnable: false, endTime: 0, playerCount: this.currentPlayer.length,
isEnter: false, player: {id: -1}
});
console.error('[ROOM#' + this.roomId + '] room Refreshed');
}
else
{
this.startTime = 0;
this.currentPlayer = [];
this.aliveCount = 0;
this.currentSocket = [];
this.currentPhase = GameServer.Phase.READY;
this.phaseChanger = -1;
this.countEndTime = 0;
this.rateArrangePoint = 300;
this.maxTypingPlayer = null;
this.minTypingPlayer = null;
console.log('[ROOM#' + this.roomId + '] room Refreshed with End of Game');
}
}
startRoom() startRoom()
{ {
this.currentPhase = GameServer.Phase.START; this.currentPhase = GameServer.Phase.START;
...@@ -204,6 +262,7 @@ class GameRoom ...@@ -204,6 +262,7 @@ class GameRoom
this.announceToRoom('syncRoomData', toSync); this.announceToRoom('syncRoomData', toSync);
console.log('[ROOM#'+this.roomId+'] Game Start with ' + this.currentPlayer.length + ' players'); console.log('[ROOM#'+this.roomId+'] Game Start with ' + this.currentPlayer.length + ' players');
console.table(this.currentPlayer);
this.announceToRoom('startGame'); this.announceToRoom('startGame');
this.startTime = Date.now(); this.startTime = Date.now();
} }
...@@ -212,7 +271,7 @@ class GameRoom ...@@ -212,7 +271,7 @@ class GameRoom
{ {
if (this.currentPhase === GameServer.Phase.START) if (this.currentPhase === GameServer.Phase.START)
{ {
if (this.phaseChanger < 0 && checkTime - this.startTime > 6000) if (this.phaseChanger < 0 && checkTime - this.startTime > 1000)
{ {
this.currentPhase = GameServer.Phase.MAIN; this.currentPhase = GameServer.Phase.MAIN;
this.rateArrangePoint = 150; this.rateArrangePoint = 150;
...@@ -266,21 +325,27 @@ class GameRoom ...@@ -266,21 +325,27 @@ class GameRoom
} }
announceToRoom(_message, _data = null) announceToRoom(_message, _data = null)
{
if (this.currentPhase != GameServer.Phase.GAMEEND)
{ {
this.currentSocket.forEach(function(element) this.currentSocket.forEach(function(element)
{ {
element.emit(_message, _data); if(element.playerData.playingData.isInThisRoom) element.emit(_message, _data);
}); });
} }
}
announceToTarget(targetId, _message, _data = null) announceToTarget(targetId, _message, _data = null)
{
if (this.currentPhase != GameServer.Phase.GAMEEND)
{ {
let targetSocketIndex = this.currentSocket.findIndex(function(element) let targetSocketIndex = this.currentSocket.findIndex(function(element)
{ {
return element.playerData.id === targetId; return element.playerData.id === targetId;
}); });
//console.log('send to ' + targetSocketIndex + ', receivable? ' + this.currentSocket[targetSocketIndex].playerData.isReceivable); //console.log('send to ' + targetSocketIndex + ', receivable? ' + this.currentSocket[targetSocketIndex].playerData.isReceivable);
if (this.currentSocket[targetSocketIndex].playerData.isReceivable) this.currentSocket[targetSocketIndex].emit(_message, _data); if (targetSocketIndex != -1 && this.currentSocket[targetSocketIndex].playerData.isReceivable) this.currentSocket[targetSocketIndex].emit(_message, _data);
}
} }
} }
...@@ -294,8 +359,12 @@ class Player ...@@ -294,8 +359,12 @@ class Player
this.nickname = playerData.nickname; this.nickname = playerData.nickname;
this.playerImage = null; this.playerImage = null;
this.position = null; this.position = null;
this.killCount = 0;
this.earnedStrongHopae = 0;
this.attackSucceed = 0;
this.isAlive = true; this.isAlive = false;
this.isInThisRoom = true;
this.rank = -1; this.rank = -1;
this.playerTyping = 0; this.playerTyping = 0;
...@@ -311,9 +380,12 @@ class Player ...@@ -311,9 +380,12 @@ class Player
this.isAlive = false; this.isAlive = false;
this.rank = room.nextRank--; this.rank = room.nextRank--;
if (this.tabCheckTime != undefined) clearTimeout(this.tabCheckTime);
socket.playerData.isReceivable = false; socket.playerData.isReceivable = false;
room.aliveCount--; room.aliveCount--;
if (room.aliveCount > 0)
{
room.checkPhase(Date.now()); room.checkPhase(Date.now());
if (this.lastAttacks.length > 0) if (this.lastAttacks.length > 0)
...@@ -336,17 +408,20 @@ class Player ...@@ -336,17 +408,20 @@ class Player
room.announceToRoom('defeat', this); room.announceToRoom('defeat', this);
console.log('[' + this.id + '] defeated, rank: ' + this.rank + ', ' + room.aliveCount + ' player left'); console.log('[' + this.id + '] defeated, rank: ' + this.rank + ', ' + room.aliveCount + ' player left');
if (socket.playerData.currentRoom.aliveCount === 1) if (room.aliveCount === 1)
{ {
let winner = room.currentPlayer.find(function(element) let winner = room.currentPlayer.find(function(element)
{ {
return element.isAlive; return element.isAlive;
}); });
room.announceToRoom('gameEnd', winner); if (winner.tabCheckTime != undefined) clearTimeout(winner.tabCheckTime);
room.announceToRoom('gameEnd', winner.id);
room.announceToTarget(winner.id, 'alert', 'gameWin'); room.announceToTarget(winner.id, 'alert', 'gameWin');
room.currentPhase = GameServer.Phase.GAMEEND;
console.log('['+winner.id+']' + ' winner! ' + winner.nickname); console.log('['+winner.id+']' + ' winner! ' + winner.nickname);
} }
} }
}
} }
module.exports = GameServer; module.exports = GameServer;
\ No newline at end of file
...@@ -3,20 +3,30 @@ ...@@ -3,20 +3,30 @@
<head> <head>
<meta charset="utf-8"/> <meta charset="utf-8"/>
<script src="/socket.io/socket.io.js"></script> <script src="/socket.io/socket.io.js"></script>
<script src="js/phaser.js"></script> <script src="/js/phaser.js"></script>
<script src="js/ScenesData.js"></script> <script src="/js/ScenesData.js"></script>
<script src="js/Background.js"></script> <script src="/js/Background.js"></script>
<script src="js/Input.js"></script> <script src="/js/Input.js"></script>
<script src="js/WordSpace.js"></script> <script src="/js/WordSpace.js"></script>
<script src="js/GameCycle.js"></script> <script src="/js/GameCycle.js"></script>
<script src="js/WordObject.js"></script> <script src="/js/WordObject.js"></script>
<script src="js/WordReader.js"></script> <script src="/js/WordReader.js"></script>
<script src="js/CSVParsing.js"></script> <script src="/js/CSVParsing.js"></script>
<script src="js/SelectWord.js"></script> <script src="/js/SelectWord.js"></script>
<script src="js/BGMsound.js"></script> <script src="/js/BGMsound.js"></script>
<script src="js/Enums.js"></script> <script src="/js/Enums.js"></script>
<script src="js/ResourceLoader.js"></script> <script src="/js/ResourceLoader.js"></script>
<script src="js/UIObject.js"></script> <script src="/js/UIObject.js"></script>
<style media='screen' type='text/css'>
@font-face {
font-family: sejongFont;
src: url('assets/font/EBS주시경B.ttf');
font-weight:400;
font-weight:normal;
}
</style>
<div style="font-family:sejongFont; position:absolute; left:-1000px; visibility:hidden;">.</div>
<style> <style>
img { position: relative; width: 100%; height: 100%; z-index: 0;} img { position: relative; width: 100%; height: 100%; z-index: 0;}
...@@ -25,13 +35,13 @@ ...@@ -25,13 +35,13 @@
</head> </head>
<body> <body>
<div id="mainTitle"> <div id="mainTitle">
<img id="titleImg" src="assets/image/background/title.png" alt="title"> <img id="titleImg" src="/assets/image/background/title.png" alt="title">
<div id="dvLogin"> <div id="dvLogin">
<input id="userEmail" type="email" placeholder="email" style="width: 100%; height: 10%;"></br> <input id="userEmail" type="email" placeholder="email" style="width: 100%; height: 10%;"></br>
<input id="userPassword" type="password" placeholder="password" maxlength="17" style="width: 100%; height: 10%;"></br> <input id="userPassword" type="password" placeholder="password" maxlength="17" style="width: 100%; height: 10%;"></br>
<button id="joinBtn" style="width: 100%; height: 10%;">이메일로 가입하기</button></br> <button id="joinBtn" style="width: 100%; height: 10%;">이메일로 가입하기</button></br>
<button id="emailBtn" style="width: 100%; height: 10%;">이메일로 로그인</button></br> <button id="emailBtn" style="width: 100%; height: 10%;">이메일로 로그인</button></br>
<button id="googleBtn" style="width: 10%; height: 10%;"><img src="assets/title/googleBtn.png" style="object-fit: contain"></button></br> <button id="googleBtn" style="width: 10%; height: 10%;"><img src="/assets/title/googleBtn.png" style="object-fit: contain"></button></br>
</div> </div>
</div> </div>
...@@ -54,8 +64,8 @@ ...@@ -54,8 +64,8 @@
firebase.initializeApp(firebaseConfig); firebase.initializeApp(firebaseConfig);
</script> </script>
<script src="js/Client.js"></script> <script src="/js/Client.js"></script>
<script src="js/Main.js"></script> <script src="/js/main.js"></script>
<script src="js/FirebaseClient.js"></script> <script src="/js/FirebaseClient.js"></script>
</body> </body>
</html> </html>
\ No newline at end of file
...@@ -3,7 +3,7 @@ var Audio = Audio || {} ...@@ -3,7 +3,7 @@ var Audio = Audio || {}
var bgm; var bgm;
Audio.loadSound = function(scene) Audio.loadSound = function(scene)
{ {
scene.load.audio('login', 'assets/sound/login.ogg'); scene.load.audio('login', 'assets/sound/newLogin.ogg');
scene.load.audio('startGame', 'assets/sound/startGame.ogg'); scene.load.audio('startGame', 'assets/sound/startGame.ogg');
scene.load.audio('attack', 'assets/sound/attackShort.ogg'); scene.load.audio('attack', 'assets/sound/attackShort.ogg');
scene.load.audio('inRoom', 'assets/sound/roomBGM.ogg'); scene.load.audio('inRoom', 'assets/sound/roomBGM.ogg');
......
...@@ -13,17 +13,17 @@ BackGround.otherCharacters = []; ...@@ -13,17 +13,17 @@ BackGround.otherCharacters = [];
BackGround.drawCharacter = function(scene) BackGround.drawCharacter = function(scene)
{ {
RoomData.myself.playerImage = scene.add.sprite(game.config.width / 2, game.config.height * 41 / 48, 'pyeongminWrite').setScale(0.45).setDepth(2); RoomData.myself.playerImage = scene.add.sprite(game.config.width / 2, game.config.height * 41 / 48, 'pyeongminWrite').setScale(0.45).setDepth(5);
RoomData.myself.position = new Phaser.Math.Vector2(RoomData.myself.playerImage.x, RoomData.myself.playerImage.y); RoomData.myself.position = new Phaser.Math.Vector2(RoomData.myself.playerImage.x, RoomData.myself.playerImage.y);
BackGround.characterPos = BackGround.characterPos.sort(function(){return 0.5-Math.random()}); BackGround.characterPos = BackGround.characterPos.sort(function(){return 0.5-Math.random()});
RoomData.players.forEach(function(element){ RoomData.players.forEach(function(element){
if(element.id != RoomData.myself.id) if(element.id != RoomData.myself.id)
{ {
element.position = BackGround.characterPos.pop(); element.position = BackGround.characterPos.pop();
element.playerImage = scene.add.sprite(element.position.x, element.position.y, 'pyeongminWrite').setScale(0.315).setDepth(1); element.playerImage = scene.add.sprite(element.position.x, element.position.y, 'pyeongminWrite').setScale(0.315).setDepth(5);
element.playerImage.flipX = element.position.x < game.config.width / 2 ? true : false; element.playerImage.flipX = element.position.x < game.config.width / 2 ? true : false;
element.nicknameText = scene.add.text(element.position.x, element.position.y - 90, element.nickname) element.nicknameText = scene.add.text(element.position.x, element.position.y - 90, element.nickname)
.setOrigin(0.5,0.5).setColor('#000000').setPadding(0.5,0.5,0.5,0.5).setDepth(1); .setOrigin(0.5,0.5).setColor('#000000').setPadding(0.5,0.5,0.5,0.5).setDepth(5.1);
6 } 6 }
}); });
} }
...@@ -32,7 +32,7 @@ BackGround.gameBackground = null; ...@@ -32,7 +32,7 @@ BackGround.gameBackground = null;
BackGround.drawBrain = function(scene) BackGround.drawBrain = function(scene)
{ {
BackGround.gameBackground = scene.add.sprite(game.config.width / 2, game.config.height / 2, 'gameBackground').setDisplaySize(game.config.width, game.config.height).setDepth(1); BackGround.gameBackground = scene.add.sprite(game.config.width / 2, game.config.height / 2, 'gameBackground').setDisplaySize(game.config.width, game.config.height).setDepth(3.1);
} }
BackGround.drawBackground = function(scene) BackGround.drawBackground = function(scene)
...@@ -42,10 +42,10 @@ BackGround.drawBackground = function(scene) ...@@ -42,10 +42,10 @@ BackGround.drawBackground = function(scene)
BackGround.drawMenu = function(scene) BackGround.drawMenu = function(scene)
{ {
scene.add.sprite(game.config.width / 2, game.config.height / 2, 'menuBackground').setDisplaySize(game.config.width, game.config.height).setDepth(1); scene.add.sprite(game.config.width / 2, game.config.height / 2, 'menuBackground').setDisplaySize(game.config.width, game.config.height).setDepth(3);
} }
BackGround.drawRoom = function(scene) BackGround.drawRoom = function(scene)
{ {
scene.add.sprite(game.config.width / 2, game.config.height / 2, 'roomBackground').setDisplaySize(game.config.width, game.config.height).setDepth(1); scene.add.sprite(game.config.width / 2, game.config.height / 2, 'roomBackground').setDisplaySize(game.config.width, game.config.height).setDepth(5.2);
} }
\ No newline at end of file
...@@ -21,7 +21,7 @@ socket.on('alert', function(msg) // string errorcode ...@@ -21,7 +21,7 @@ socket.on('alert', function(msg) // string errorcode
{ {
//toAlert = '승리!'; //toAlert = '승리!';
ScenesData.gameScene.add.text(game.config.width / 2, game.config.height / 2, '승리!!!!', {fontSize: '30pt'}) ScenesData.gameScene.add.text(game.config.width / 2, game.config.height / 2, '승리!!!!', {fontSize: '30pt'})
.setPadding(5,5,5,5).setOrigin(0.5, 0.5).setDepth(11) .setPadding(5,5,5,5).setOrigin(0.5, 0.5).setDepth(9.9)
.setColor('#000000').setBackgroundColor('#ffffff'); .setColor('#000000').setBackgroundColor('#ffffff');
gameOver(); gameOver();
...@@ -41,6 +41,11 @@ socket.on('enterRoom', function() ...@@ -41,6 +41,11 @@ socket.on('enterRoom', function()
fbClient.updateUserData('recentHopae', PlayerData.currentHopae); fbClient.updateUserData('recentHopae', PlayerData.currentHopae);
Audio.killSound(ScenesData.menuScene, 'login'); Audio.killSound(ScenesData.menuScene, 'login');
ScenesData.changeScene('roomScene'); ScenesData.changeScene('roomScene');
if (ScenesData.endCountTimer != undefined)
{
clearTimeout(ScenesData.endCountTimer);
ScenesData.endCountTimer = undefined;
}
}); });
socket.on('syncRoomScene', function(msg) socket.on('syncRoomScene', function(msg)
{ {
...@@ -52,8 +57,8 @@ socket.on('syncRoomScene', function(msg) ...@@ -52,8 +57,8 @@ socket.on('syncRoomScene', function(msg)
let randY = Math.random() * 380 + 100; let randY = Math.random() * 380 + 100;
var playerSet = var playerSet =
{ {
sprite: ScenesData.roomScene.add.sprite(randX, randY, 'playerStand').setOrigin(0.5, 0.5).setScale(0.2, 0.2), sprite: ScenesData.roomScene.add.sprite(randX, randY, 'playerStand').setOrigin(0.5, 0.5).setScale(0.2, 0.2).setDepth(5),
nickname: ScenesData.roomScene.add.text(randX-10, randY-60, msg[i].nickname).setOrigin(0.5,0.5).setColor('#000000').setPadding(0.5,0.5,0.5,0.5), nickname: ScenesData.roomScene.add.text(randX-10, randY-60, msg[i].nickname).setOrigin(0.5,0.5).setColor('#000000').setPadding(0.5,0.5,0.5,0.5).setDepth(5.1),
id: msg[i].id id: msg[i].id
} }
ScenesData.roomScene.players.push(playerSet); ScenesData.roomScene.players.push(playerSet);
...@@ -74,8 +79,8 @@ socket.on('setRoomCount', function(msg) ...@@ -74,8 +79,8 @@ socket.on('setRoomCount', function(msg)
let randY = Math.random() * 380 + 100; let randY = Math.random() * 380 + 100;
var playerSet = var playerSet =
{ {
sprite: ScenesData.roomScene.add.sprite(randX, randY, 'playerStand').setOrigin(0.5, 0.5).setScale(0.2, 0.2), sprite: ScenesData.roomScene.add.sprite(randX, randY, 'playerStand').setOrigin(0.5, 0.5).setScale(0.2, 0.2).setDepth(5),
nickname: ScenesData.roomScene.add.text(randX-10, randY-60, msg.player.nickname).setOrigin(0.5,0.5).setColor('#000000').setPadding(0.5,0.5,0.5,0.5), nickname: ScenesData.roomScene.add.text(randX-10, randY-60, msg.player.nickname).setOrigin(0.5,0.5).setColor('#000000').setPadding(0.5,0.5,0.5,0.5).setDepth(5.1),
id: msg.player.id id: msg.player.id
} }
ScenesData.roomScene.players.push(playerSet); ScenesData.roomScene.players.push(playerSet);
...@@ -119,26 +124,12 @@ socket.on('startGame', function() ...@@ -119,26 +124,12 @@ socket.on('startGame', function()
// in game // in game
socket.on('changePhase', function(msg) // number Phase socket.on('changePhase', function(msg) // number Phase
{ {
console.log('phase changed from ' + WordSpace.CurrentPhase + ' to ' + msg); WordSpace.changePhase(msg);
WordSpace.CurrentPhase = msg;
WordSpace.pauseCycle(true);
// 여기서 종이 드르륵 열면됨
let phaseChangeBgr = ScenesData.gameScene.add.sprite(game.config.width / 2, game.config.height / 2, 'phaseChangeBgr').setOrigin(0.5, 0.5).setDepth(10);
ScenesData.gameScene.scene.pause('gameScene');
setTimeout(function()
{
ScenesData.gameScene.scene.resume('gameScene');
// 여기서 종이 닫으면됨
phaseChangeBgr.destroy();
Audio.playSound(ScenesData.gameScene, 'startGame');
WordSpace.pauseCycle(false);
//console.log('start again');
}, 5000);
}); });
socket.on('setPlayerTypingRate', function(msg) // number playerTypingRate socket.on('setPlayerTypingRate', function(msg) // number playerTypingRate
{ {
WordSpace.PlayerTypingRate = msg; WordSpace.playerTypingRate = msg;
WordSpace.adjustVarByPhase();
//console.log('rate: ' + msg); //console.log('rate: ' + msg);
}); });
socket.on('writeWord', function(msg) // number playerId socket.on('writeWord', function(msg) // number playerId
...@@ -162,7 +153,6 @@ socket.on('someoneAttacked', function(msg) // {Id attackerId, Id victimId} ...@@ -162,7 +153,6 @@ socket.on('someoneAttacked', function(msg) // {Id attackerId, Id victimId}
}); });
socket.on('attacked', function(msg) // object attackData socket.on('attacked', function(msg) // object attackData
{ {
//console.log('attacked by ' + msg.attacker.nickname);
let attackedEvent = new Cycle(function() let attackedEvent = new Cycle(function()
{ {
if(!WordSpace.isInvincible) if(!WordSpace.isInvincible)
...@@ -178,6 +168,35 @@ socket.on('attacked', function(msg) // object attackData ...@@ -178,6 +168,35 @@ socket.on('attacked', function(msg) // object attackData
WordSpace.attackedEvents.push(attackedEvent); WordSpace.attackedEvents.push(attackedEvent);
//console.log(timeout); //console.log(timeout);
}); });
socket.on('someoneItemStart', function(msg)
{
let itemPlayer = RoomData.findPlayer(msg.id);
let size = msg.id == RoomData.myself.id ? 1 : 0.7;
let xOffset = msg.id != RoomData.myself.id && itemPlayer.position.x < game.config.width / 2 ? -1 : 1;
switch(msg.itemType)
{
case Enums.item.invincible:
itemPlayer.invincibleMark = ScenesData.gameScene.add.sprite(itemPlayer.position.x + 20 * size * xOffset, itemPlayer.position.y - 50 * size, 'attackPaper')
.setDepth(5.3).setOrigin(0.5, 0.5).setScale(size);
break;
default:
console.log('Improper item type.');
break;
}
});
socket.on('someoneItemEnd', function(msg)
{
let itemPlayer = RoomData.findPlayer(msg.id);
switch(msg.itemType)
{
case Enums.item.invincible:
itemPlayer.invincibleMark.destroy();
break;
default:
console.log('Improper item type.');
break;
}
});
socket.on('defeat', function(msg) // object player socket.on('defeat', function(msg) // object player
{ {
...@@ -189,20 +208,60 @@ socket.on('defeat', function(msg) // object player ...@@ -189,20 +208,60 @@ socket.on('defeat', function(msg) // object player
RoomData.players[msg.index].position = position; RoomData.players[msg.index].position = position;
RoomData.players[msg.index].nicknameText = nicknameText; RoomData.players[msg.index].nicknameText = nicknameText;
let victim = RoomData.findPlayer(msg.id);
RoomData.aliveCount--; RoomData.aliveCount--;
console.log(msg.id); victim.playerImage.play(WordSpace.pyeongminAnims[Enums.characterAnim.gameOver]);
console.log(RoomData.findPlayer(msg.id));
RoomData.findPlayer(msg.id).playerImage.play(WordSpace.pyeongminAnims[Enums.characterAnim.gameOver]);
if (msg.lastAttack != null) if (msg.lastAttack != null)
{ {
let lastAttacker = RoomData.findPlayer(msg.lastAttack.attackerId).nickname; let lastAttacker = RoomData.findPlayer(msg.lastAttack.attackerId);
console.log(RoomData.findPlayer(msg.id).nickname + ' defeated by ' + lastAttacker + ', with ' + msg.lastAttack.word); let attackWord = msg.lastAttack.word;
WordSpace.killLogForTest += ('\n' + lastAttacker + ' --' + msg.lastAttack.word + '-> ' + RoomData.findPlayer(msg.id).nickname); console.log(victim.nickname + ' defeated by ' + lastAttacker.nickname + ', with ' + msg.lastAttack.word);
if(msg.lastAttack.attackerId == RoomData.myself.id) if(WordSpace.lastAttackGroup.length != 0)
{ {
var keys = Object.keys(Enums.item); WordSpace.lastAttackGroup.forEach(function(element){
WordSpace.generateWord.Item(ScenesData.gameScene, Enums.item[keys[keys.length * Math.random() << 0]]); element.destroy();
let itemBag = ScenesData.gameScene.add.sprite(RoomData.myself.position.x, RoomData.myself.position.y, 'itemBag').setScale(0).setDepth(5); })
}
let attackerLabel = UIObject.createLabel(ScenesData.gameScene, game.config.width / 2 - 400, 0, 10.2, 'nameBgr' + lastAttacker.nickname.length, 2,
'center', lastAttacker.nickname, 50, '#ffffff', 0.45, 0.5);
let wordLabel = UIObject.createLabel(ScenesData.gameScene, game.config.width / 2, 0, 10.2, 'wordBgr' + msg.lastAttack.wordGrade + '_' + attackWord.length, 2,
'center', attackWord, 50, '#000000', 0.45, 0.5);
let victimLabel = UIObject.createLabel(ScenesData.gameScene, game.config.width / 2 + 400, 0, 10.2, 'nameBgr' + victim.nickname.length, 2,
'center', victim.nickname, 50, '#ffffff', 0.45, 0.5);
let explosionEffect = ScenesData.gameScene.add.sprite(game.config.width / 2, 0, 'wordBreak').setScale(1).setDepth(10.2);
explosionEffect.play('wordBreakAnim');
explosionEffect.anims.setRepeat(-1);
WordSpace.lastAttackGroup.push(attackerLabel);
WordSpace.lastAttackGroup.push(wordLabel);
WordSpace.lastAttackGroup.push(victimLabel);
WordSpace.lastAttackGroup.push(explosionEffect);
ScenesData.gameScene.tweens.add({
targets: [attackerLabel, wordLabel, victimLabel, explosionEffect],
y: 100,
ese: 'Linear',
duration: 500,
repeat: 0,
onComplete: function () {
setTimeout(function() {
ScenesData.gameScene.tweens.add({
targets: [attackerLabel, wordLabel, victimLabel, explosionEffect],
y: -100,
ease: 'Linear', // 'Cubic', 'Elastic', 'Bounce', 'Back'
duration: 500,
repeat: 0, // -1: infinity
yoyo: false });
}, 1000);
},
})
let itemBag = ScenesData.gameScene.add.sprite(lastAttacker.position.x, lastAttacker.position.y,
'itemBag').setScale(0).setDepth(5.3);
ScenesData.gameScene.tweens.add({ ScenesData.gameScene.tweens.add({
targets: itemBag, targets: itemBag,
scaleX: 1, scaleX: 1,
...@@ -212,8 +271,6 @@ socket.on('defeat', function(msg) // object player ...@@ -212,8 +271,6 @@ socket.on('defeat', function(msg) // object player
repeat: 0, // -1: infinity repeat: 0, // -1: infinity
yoyo: false, yoyo: false,
onComplete: function () { onComplete: function () {
setTimeout(function() { setTimeout(function() {
ScenesData.gameScene.tweens.add({ ScenesData.gameScene.tweens.add({
targets: itemBag, targets: itemBag,
...@@ -221,29 +278,93 @@ socket.on('defeat', function(msg) // object player ...@@ -221,29 +278,93 @@ socket.on('defeat', function(msg) // object player
scaleY: 0, scaleY: 0,
ease: 'Linear', // 'Cubic', 'Elastic', 'Bounce', 'Back' ease: 'Linear', // 'Cubic', 'Elastic', 'Bounce', 'Back'
duration: 500, duration: 500,
repeat: 0, // -1: infinity repeat: 0,
yoyo: false }); onComplete: function()
}, 1500); {
attackerLabel.destroy();
wordLabel.destroy();
}, victimLabel.destroy();
onCompleteScope: ScenesData.gameScene explosionEffect.destroy();
}
});
}, 1000);
}
}); });
setTimeout(function() { setTimeout(function() {
itemBag.destroy(); itemBag.destroy();
}, 3000); }, 3000);
if(msg.lastAttack.attackerId == RoomData.myself.id)
{
var keys = Object.keys(Enums.item);
WordSpace.generateWord.Item(ScenesData.gameScene, Enums.item[keys[keys.length * Math.random() << 0]]);
RoomData.myself.killCount++;
} }
} }
else else
{ {
console.log(RoomData.findPlayer(msg.id).nickname + ' defeated'); console.log(victim.nickname + ' defeated');
WordSpace.killLogForTest += ('\n--Suicide->' + RoomData.findPlayer(msg.id).nickname); if(WordSpace.lastAttackGroup.length != 0)
{
WordSpace.lastAttackGroup.forEach(function(element){
element.destroy();
})
}
let victimLabel = UIObject.createLabel(ScenesData.gameScene, game.config.width / 2, 0, 10.2, 'nameBgr' + victim.nickname.length, 2, 'center', victim.nickname, 50, '#ffffff', 0.45, 0.5);
let explosionEffect = ScenesData.gameScene.add.sprite(game.config.width / 2, 0, 'wordBreak').setScale(1).setDepth(10.2);
explosionEffect.play('wordBreakAnim');
explosionEffect.anims.setRepeat(-1);
explosionEffect.anims.setRepeat(-1);
WordSpace.lastAttackGroup.push(victimLabel);
WordSpace.lastAttackGroup.push(explosionEffect);
ScenesData.gameScene.tweens.add({
targets: [victimLabel, explosionEffect],
y: 100,
ese: 'Linear',
duration: 500,
repeat: 0,
onComplete: function () {
setTimeout(function() {
ScenesData.gameScene.tweens.add({
targets: [victimLabel, explosionEffect],
y: -100,
ease: 'Linear', // 'Cubic', 'Elastic', 'Bounce', 'Back'
duration: 500,
repeat: 0,
onComplete: function()
{
victimLabel.destroy();
explosionEffect.destroy();
}
});
}, 1000);
}
})
}
if(msg.id == RoomData.myself.id)
{
RoomData.myself = RoomData.players[msg.index];
setTimeout(() => {
gameEndMenu(true);
}, 2000);
} }
}); });
socket.on('gameEnd', function(msg) // object player socket.on('gameEnd', function(msg) // number winnerId
{ {
console.log(msg.nickname + ' Win!!!!!!'); const winner = RoomData.findPlayer(msg);
console.log(winner.nickname + ' Win!!!!!!');
if(msg == RoomData.myself.id)
{
RoomData.myself.rank = 1;
setTimeout(() => {
gameEndMenu(true);
}, 2000);
}
}); });
socket.on('attackSucceed', function(msg) socket.on('attackSucceed', function(msg)
{ {
//console.log('client'); //console.log('client');
...@@ -252,6 +373,7 @@ socket.on('attackSucceed', function(msg) ...@@ -252,6 +373,7 @@ socket.on('attackSucceed', function(msg)
tempWord.physicsObj.setPosition(victimPos.x, victimPos.y); tempWord.physicsObj.setPosition(victimPos.x, victimPos.y);
tempWord.wordObj.setPosition(tempWord.physicsObj.x, tempWord.physicsObj.y); tempWord.wordObj.setPosition(tempWord.physicsObj.x, tempWord.physicsObj.y);
tempWord.destroy(); tempWord.destroy();
RoomData.myself.attackSucceed += 1;
}); });
// out game // out game
...@@ -261,3 +383,86 @@ socket.on('userDisconnect', function(msg) // {num index , num id, str nickname} ...@@ -261,3 +383,86 @@ socket.on('userDisconnect', function(msg) // {num index , num id, str nickname}
RoomData.players[msg.index] = msg; RoomData.players[msg.index] = msg;
RoomData.aliveCount--; RoomData.aliveCount--;
}); });
var gameEndMenu = function(isWin)
{
WordSpace.isGameOver = true;
ScenesData.gameScene.warningImage.destroy();
ScenesData.gameScene.warningTween.remove();
let earnedMoney = 0;
if(isWin) earnedMoney += 20;
earnedMoney += RoomData.myself.killCount * 3;
earnedMoney += parseInt(WordSpace.playerTypingRate / 10);
earnedMoney += Math.max(20, Math.pow(RoomData.myself.attackSucceed, 2));
earnedMoney += parseInt(20 * (1 - (RoomData.myself.rank - 1) / (RoomData.players.length - 1)));
Input.inputField.text.destroy();
var temp = function(){
socket.emit('exitFromRoom', RoomData.myself.id);
fbClient.updateUserData('killCount', RoomData.myself.killCount);
fbClient.updateUserData('money', earnedMoney);
ScenesData.changeScene('menuScene');
}
ScenesData.gameScene.backToMenuDialog = ScenesData.gameScene.rexUI.add.dialog({
x: game.config.width / 2,
y: game.config.height / 2,
background: ScenesData.gameScene.add.sprite(game.config.width / 2, game.config.height / 2, 'panel').setOrigin(0.5, 0.5),
content: ScenesData.gameScene.rexUI.add.dialog({
x: game.config.width / 2,
y: game.config.height / 2,
choices: [
UIObject.createLabel(ScenesData.gameScene, game.config.width / 2 - 100, game.config.height / 2 - 100, 10.2, 'playerStand', 0.7, 'center'),
UIObject.createLabel(ScenesData.gameScene, game.config.width / 2 + 120, game.config.height / 2 - 150, 10.2,
'button', 1, 'center', '등수 : ' + RoomData.myself.rank + '', 30).layout(),
UIObject.createLabel(ScenesData.gameScene, game.config.width / 2 + 120, game.config.height / 2 - 50, 10.2,
'button', 1, 'center', '킬 수 : ' + RoomData.myself.killCount + '', 30).layout(),
UIObject.createLabel(ScenesData.gameScene, game.config.width / 2 + 120, game.config.height / 2 + 50, 10.2,
'button', 1, 'center', '획득 강호패 : ' + RoomData.myself.earnedStrongHopae + '', 30).layout(),
UIObject.createLabel(ScenesData.gameScene, game.config.width / 2 + 120, game.config.height / 2 + 150, 10.2,
'button', 1, 'center', '획득 골드 : ' + earnedMoney + '', 30).layout()
],
align: {
choices: 'center' // 'center'|'left'|'right'
}
}),
actions: [
UIObject.createLabel(ScenesData.gameScene, game.config.width / 2 - 120, game.config.height / 2 + 300, 10.2, 'button', 1, 'center', '나가기').layout(),
UIObject.createLabel(ScenesData.gameScene, game.config.width / 2 + 120, game.config.height / 2 + 300, 10.2, 'button', 1, 'center', '관전하기').layout()
],
space: {
action: 10,
left: 20,
right: 20,
top: 20,
bottom: 20,
},
align: {
actions: 'center' // 'center'|'left'|'right'
}
}).setDepth(10.2);
ScenesData.gameScene.backToMenuDialog
.on('button.click', function (button, groupName, index) {
if(index == 0) temp();
else
{
ScenesData.gameScene.backToMenuDialog.setVisible(false);
ScenesData.gameScene.backToMenuBtn = UIObject.createButton(ScenesData.gameScene, UIObject.createLabel(ScenesData.gameScene, 100, 900, 10.2, 'pyeongminThrow', 0.5, 'center'), 1, 0, 2, temp);
}
}, ScenesData.gameScene)
.on('button.over', function (button, groupName, index) {
//console.log('button over');
})
.on('button.out', function (button, groupName, index) {
//console.log('button out');
});
}
\ No newline at end of file
...@@ -2,6 +2,7 @@ function FirebaseClient() ...@@ -2,6 +2,7 @@ function FirebaseClient()
{ {
this.init(); this.init();
this.initEvent(); this.initEvent();
this.isGameStarted = false;
} }
FirebaseClient.prototype.init = function() FirebaseClient.prototype.init = function()
...@@ -69,6 +70,7 @@ FirebaseClient.prototype.setLogin = function() ...@@ -69,6 +70,7 @@ FirebaseClient.prototype.setLogin = function()
.then(function() .then(function()
{ {
game = new Phaser.Game(config); game = new Phaser.Game(config);
fbClient.isGameStarted = true;
}); });
document.getElementById('mainTitle').style.display = 'none'; document.getElementById('mainTitle').style.display = 'none';
...@@ -77,7 +79,10 @@ FirebaseClient.prototype.setLogin = function() ...@@ -77,7 +79,10 @@ FirebaseClient.prototype.setLogin = function()
FirebaseClient.prototype.setLogOut = function() FirebaseClient.prototype.setLogOut = function()
{ {
if (game != null) game.destroy(true);
this.isGameStarted = false;
document.getElementById('mainTitle').style.display = 'block';
document.getElementById('titleImg').style.display = 'block';
} }
FirebaseClient.prototype.onEmailBtnClick = function() FirebaseClient.prototype.onEmailBtnClick = function()
...@@ -225,6 +230,9 @@ FirebaseClient.prototype.updateUserData = function(key, valueChanged, replace = ...@@ -225,6 +230,9 @@ FirebaseClient.prototype.updateUserData = function(key, valueChanged, replace =
if (beforeData.item != null) beforeData.item.push(valueChanged); if (beforeData.item != null) beforeData.item.push(valueChanged);
else beforeData.item = [valueChanged]; else beforeData.item = [valueChanged];
break; break;
case 'killCount':
beforeData.killCount = replace ? (valueChanged) : (beforeData.killCount + valueChanged);
break;
default: default:
console.log('[ERROR] database has no key for ' + key); console.log('[ERROR] database has no key for ' + key);
break; break;
...@@ -236,9 +244,21 @@ FirebaseClient.prototype.updateUserData = function(key, valueChanged, replace = ...@@ -236,9 +244,21 @@ FirebaseClient.prototype.updateUserData = function(key, valueChanged, replace =
document.addEventListener('DOMContentLoaded', function() document.addEventListener('DOMContentLoaded', function()
{ {
window.fbClient = new FirebaseClient(); window.fbClient = new FirebaseClient();
document.onkeydown = function(e)
{
if (!fbClient.isGameStarted && e.keyCode === 13)
{
fbClient.onEmailBtnClick();
}
}
console.log('done load'); console.log('done load');
}); });
document.onkeydown = function(e)
{
if (fbClient.isGameStarted && e.keyCode === 27) fbClient.logOut();
}
class UserData class UserData
{ {
constructor() constructor()
...@@ -246,13 +266,11 @@ class UserData ...@@ -246,13 +266,11 @@ class UserData
this.userName = prompt("유저의 이름을 입력해주세요."); this.userName = prompt("유저의 이름을 입력해주세요.");
this.exp = 0; this.exp = 0;
this.rank = -1; this.rank = -1;
this.hopae = this.hopae = [];
[
{name: prompt("첫번째 호패의 닉네임을 입력해주세요.\n(반드시 한글만 사용해주세요 띄어쓰기도 금지)"), type: 'wood'}
];
this.recentHopae = null; this.recentHopae = null;
this.title = []; this.title = [];
this.money = 0; this.money = 0;
this.item = []; this.item = [];
this.killCount = 0;
} }
} }
\ No newline at end of file
...@@ -2,7 +2,6 @@ WordSpace.startCycle = function(scene) ...@@ -2,7 +2,6 @@ WordSpace.startCycle = function(scene)
{ {
WordSpace.wordCycle.resetCycle(scene, 3000, 0, true); WordSpace.wordCycle.resetCycle(scene, 3000, 0, true);
WordSpace.nameCycle.resetCycle(scene, 3000, 0, true); WordSpace.nameCycle.resetCycle(scene, 3000, 0, true);
WordSpace.varAdjustCycle.resetCycle(scene, 100, 0, true);
WordSpace.playerTypingCycle.resetCycle(scene, 500, 500, true); WordSpace.playerTypingCycle.resetCycle(scene, 500, 500, true);
} }
...@@ -10,7 +9,6 @@ WordSpace.pauseCycle = function(isPause) ...@@ -10,7 +9,6 @@ WordSpace.pauseCycle = function(isPause)
{ {
WordSpace.wordCycle.currentCycle.paused = isPause; WordSpace.wordCycle.currentCycle.paused = isPause;
WordSpace.nameCycle.currentCycle.paused = isPause; WordSpace.nameCycle.currentCycle.paused = isPause;
WordSpace.varAdjustCycle.currentCycle.paused = isPause;
WordSpace.attackGauge.pauseCycle(isPause); WordSpace.attackGauge.pauseCycle(isPause);
WordSpace.playerTypingCycle.currentCycle.paused = isPause; WordSpace.playerTypingCycle.currentCycle.paused = isPause;
WordSpace.attackedEvents.forEach(function(element) {element.currentCycle.paused = isPause}); WordSpace.attackedEvents.forEach(function(element) {element.currentCycle.paused = isPause});
...@@ -39,32 +37,3 @@ class Cycle //앞으로 cycle은 이 클래스를 사용해서 구현할 것 ...@@ -39,32 +37,3 @@ class Cycle //앞으로 cycle은 이 클래스를 사용해서 구현할 것
else this.currentCycle = scene.time.addEvent(option); else this.currentCycle = scene.time.addEvent(option);
} }
} }
\ No newline at end of file
//단어 생성 사이클
WordSpace.wordCycle = new Cycle(function()
{
WordSpace.genWordByProb(this);
});
//게임 오버 사이클
WordSpace.gameOverCycle = new Cycle(gameOver);
//호패 생성 사이클
WordSpace.nameCycle = new Cycle(function()
{
WordSpace.generateWord.Name(ScenesData.gameScene, false, null);
});
//이건 뭐지
WordSpace.varAdjustCycle = new Cycle(function()
{
//나중에는 메세지 분석해서 Phase랑 playerTypingRate 받겠지만 일단 이렇게 해둠
//WordSpace.GetPhase();
//WordSpace.GetPlayerTypingRate();
WordSpace.AdjustVarByPhase(WordSpace.playerTypingRate, WordSpace.CurrentPhase);
});
// playerTypingRate 갱신용 사이클
WordSpace.playerTypingCycle = new Cycle(function()
{
socket.emit('setPlayerTyping', {playerTyping: WordSpace.playerTyping, isWord: WordSpace.setPlayerTyping.writeWord, isAttackMode: Input.attackMode} );
WordSpace.setPlayerTyping.writeWord = false;
});
// 공격받을때의 일회용 이벤트들
WordSpace.attackedEvents = [];
\ No newline at end of file
...@@ -21,7 +21,7 @@ Input.attackOption = { ...@@ -21,7 +21,7 @@ Input.attackOption = {
Input.gameSceneEnterReaction = function() Input.gameSceneEnterReaction = function()
{ {
if (!Input.isEntered) if (RoomData.myself.isAlive && !Input.isEntered)
{ {
if (Input.attackMode) WordSpace.attack(Input.removeConVow(Input.finalInput), Input.attackOption.wordGrade); if (Input.attackMode) WordSpace.attack(Input.removeConVow(Input.finalInput), Input.attackOption.wordGrade);
else WordSpace.findWord(Input.finalInput); else WordSpace.findWord(Input.finalInput);
...@@ -384,7 +384,7 @@ Input.inputField = ...@@ -384,7 +384,7 @@ Input.inputField =
Input.pushInput = function(inputKey) Input.pushInput = function(inputKey)
{ {
if (this.justPressed != inputKey) if ((ScenesData.currentScene != 'gameScene' || RoomData.myself.isAlive) && this.justPressed != inputKey)
{ {
this.justPressed = inputKey; this.justPressed = inputKey;
let output; let output;
......
...@@ -2,7 +2,7 @@ var ResourceLoader = ResourceLoader || {}; ...@@ -2,7 +2,7 @@ var ResourceLoader = ResourceLoader || {};
ResourceLoader.loadBackGround = function(scene) ResourceLoader.loadBackGround = function(scene)
{ {
scene.load.image('brain', 'assets/image/background/brain.png'); scene.load.image('weightWarning', 'assets/image/background/weightWarning.png');
scene.load.image('baseBackground', 'assets/image/background/yellowBack.png'); scene.load.image('baseBackground', 'assets/image/background/yellowBack.png');
scene.load.image('gameBackground', 'assets/image/background/background_brain.png'); scene.load.image('gameBackground', 'assets/image/background/background_brain.png');
scene.load.image('menuBackground', 'assets/placeholder/menuBackground.png'); scene.load.image('menuBackground', 'assets/placeholder/menuBackground.png');
...@@ -42,7 +42,9 @@ ResourceLoader.loadImage = function(scene) ...@@ -42,7 +42,9 @@ ResourceLoader.loadImage = function(scene)
scene.load.image('pyeongminStand', 'assets/image/character/pyeongmin/pyeong_stand.png'); scene.load.image('pyeongminStand', 'assets/image/character/pyeongmin/pyeong_stand.png');
scene.load.spritesheet('wordBreak', 'assets/image/word/wordbreak.png', { frameWidth: 180, frameHeight: 180 }); scene.load.spritesheet('wordBreak', 'assets/image/word/wordbreak.png', { frameWidth: 180, frameHeight: 180 });
scene.load.image('phaseChangeBgr', 'assets/placeholder/phaseChange.png'); scene.load.spritesheet('phase1', 'assets/image/etc/scroll/startPhase/startPhase.png', { frameWidth: 280, frameHeight: 920 });
scene.load.spritesheet('phase2', 'assets/image/etc/scroll/bonPhase/bonPhase.png', { frameWidth: 280, frameHeight: 920 });
scene.load.spritesheet('phase3', 'assets/image/etc/scroll/poongPhase/poongPhase.png', { frameWidth: 280, frameHeight: 920 });
scene.load.image('attackPaper', 'assets/image/etc/paper_crumbled.png'); scene.load.image('attackPaper', 'assets/image/etc/paper_crumbled.png');
scene.load.image('panel', 'assets/placeholder/panel.png'); scene.load.image('panel', 'assets/placeholder/panel.png');
scene.load.image('button', 'assets/placeholder/button.png'); scene.load.image('button', 'assets/placeholder/button.png');
...@@ -55,56 +57,66 @@ ResourceLoader.loadAnimation = function(scene) ...@@ -55,56 +57,66 @@ ResourceLoader.loadAnimation = function(scene)
key: 'wordBreakAnim', key: 'wordBreakAnim',
frames: scene.anims.generateFrameNumbers('wordBreak'), frames: scene.anims.generateFrameNumbers('wordBreak'),
frameRate: 10, frameRate: 10,
repeat: 0, repeat: 0
hideOnComplete: false });
scene.anims.create({
key: 'phase1Anim',
frames: scene.anims.generateFrameNumbers('phase1'),
frameRate: 20,
repeat: 0
});
scene.anims.create({
key: 'phase2Anim',
frames: scene.anims.generateFrameNumbers('phase2'),
frameRate: 20,
repeat: 0
});
scene.anims.create({
key: 'phase3Anim',
frames: scene.anims.generateFrameNumbers('phase3'),
frameRate: 20,
repeat: 0
}); });
WordSpace.pyeongminAnims[Enums.characterAnim.sit] = scene.anims.create({ WordSpace.pyeongminAnims[Enums.characterAnim.sit] = scene.anims.create({
key: 'pyeongminSitAnim', key: 'pyeongminSitAnim',
frames: scene.anims.generateFrameNumbers('pyeongminSit'), frames: scene.anims.generateFrameNumbers('pyeongminSit'),
frameRate: 10, frameRate: 10,
repeat: 0, repeat: 0
hideOnComplete: false
}); });
WordSpace.pyeongminAnims[Enums.characterAnim.write] = scene.anims.create({ WordSpace.pyeongminAnims[Enums.characterAnim.write] = scene.anims.create({
key: 'pyeongminWriteAnim', key: 'pyeongminWriteAnim',
frames: scene.anims.generateFrameNumbers('pyeongminWrite'), frames: scene.anims.generateFrameNumbers('pyeongminWrite'),
frameRate: 10, frameRate: 10,
repeat: 0, repeat: 0
hideOnComplete: false
}); });
WordSpace.pyeongminAnims[Enums.characterAnim.notBurning] = scene.anims.create({ WordSpace.pyeongminAnims[Enums.characterAnim.notBurning] = scene.anims.create({
key: 'pyeongminnotBurningAnim', key: 'pyeongminnotBurningAnim',
frames: scene.anims.generateFrameNumbers('pyeongminWrite'), frames: scene.anims.generateFrameNumbers('pyeongminWrite'),
frameRate: 10, frameRate: 10,
repeat: -1, repeat: -1
hideOnComplete: false
}); });
WordSpace.pyeongminAnims[Enums.characterAnim.smallBurning] = scene.anims.create({ WordSpace.pyeongminAnims[Enums.characterAnim.smallBurning] = scene.anims.create({
key: 'pyeongminsmallBurningAnim', key: 'pyeongminsmallBurningAnim',
frames: scene.anims.generateFrameNumbers('pyeongminBurningSmall'), frames: scene.anims.generateFrameNumbers('pyeongminBurningSmall'),
frameRate: 10, frameRate: 10,
repeat: -1, repeat: -1
hideOnComplete: false
}); });
WordSpace.pyeongminAnims[Enums.characterAnim.bigBurning] = scene.anims.create({ WordSpace.pyeongminAnims[Enums.characterAnim.bigBurning] = scene.anims.create({
key: 'pyeongminbigBurningAnim', key: 'pyeongminbigBurningAnim',
frames: scene.anims.generateFrameNumbers('pyeongminBurningBig'), frames: scene.anims.generateFrameNumbers('pyeongminBurningBig'),
frameRate: 10, frameRate: 10,
repeat: -1, repeat: -1
hideOnComplete: false
}); });
WordSpace.pyeongminAnims[Enums.characterAnim.throw] = scene.anims.create({ WordSpace.pyeongminAnims[Enums.characterAnim.throw] = scene.anims.create({
key: 'pyeongminThrowAnim', key: 'pyeongminThrowAnim',
frames: scene.anims.generateFrameNumbers('pyeongminThrow'), frames: scene.anims.generateFrameNumbers('pyeongminThrow'),
frameRate: 10, frameRate: 10,
repeat: 0, repeat: 0
hideOnComplete: false
}); });
WordSpace.pyeongminAnims[Enums.characterAnim.gameOver] = scene.anims.create({ WordSpace.pyeongminAnims[Enums.characterAnim.gameOver] = scene.anims.create({
key: 'pyeongminGameOverAnim', key: 'pyeongminGameOverAnim',
frames: scene.anims.generateFrameNumbers('pyeongminGameOver'), frames: scene.anims.generateFrameNumbers('pyeongminGameOver'),
frameRate: 10, frameRate: 10,
repeat: 0, repeat: 0
hideOnComplete: false
}); });
} }
\ No newline at end of file
...@@ -36,11 +36,17 @@ var menuScene = new Phaser.Class( ...@@ -36,11 +36,17 @@ var menuScene = new Phaser.Class(
{ {
BackGround.drawBackground(this); BackGround.drawBackground(this);
Audio.loopSound(this, 'login'); Audio.loopSound(this, 'login');
if(PlayerData.userData.hopae === undefined || PlayerData.userData.hopae.length == 0)
{
PlayerData.userData.money += 1;
ScenesData.changeScene('hopaeScene');
return;
}
PlayerData.currentHopae = (PlayerData.userData.recentHopae == null) ? PlayerData.userData.hopae[0] : PlayerData.userData.recentHopae; PlayerData.currentHopae = (PlayerData.userData.recentHopae == null) ? PlayerData.userData.hopae[0] : PlayerData.userData.recentHopae;
PlayerData.nickname = PlayerData.currentHopae.name; PlayerData.nickname = PlayerData.currentHopae.name;
this.userName = this.add.text(100, 100, '내 이름 : ' + PlayerData.userData.userName).setOrigin(0, 0.5).setColor('#000000').setDepth(10).setPadding(5,5,5,5).setFontSize(40); this.userName = this.add.text(100, 100, '내 이름 : ' + PlayerData.userData.userName).setOrigin(0, 0.5).setColor('#000000').setDepth(9.9).setPadding(5,5,5,5).setFontSize(40);
this.money = this.add.text(100, 200, '소지 엽전 : ' + PlayerData.userData.money).setOrigin(0, 0.5).setColor('#000000').setDepth(10).setPadding(5,5,5,5).setFontSize(40); this.money = this.add.text(100, 200, '소지 엽전 : ' + PlayerData.userData.money).setOrigin(0, 0.5).setColor('#000000').setDepth(9.9).setPadding(5,5,5,5).setFontSize(40);
this.organizeHopae = function() this.organizeHopae = function()
{ {
...@@ -62,7 +68,7 @@ var menuScene = new Phaser.Class( ...@@ -62,7 +68,7 @@ var menuScene = new Phaser.Class(
this.hopaeMenuObject = []; this.hopaeMenuObject = [];
for(let i = 0; i < this.myHopae.length; i++) for(let i = 0; i < this.myHopae.length; i++)
{ {
let temp = UIObject.createButton(this, UIObject.createLabel(this, 100, 300, 10, let temp = UIObject.createButton(this, UIObject.createLabel(this, 100, 300, 5,
'nameBgr' + ScenesData.menuScene.myHopae[i].name.length, 1, 'left', ScenesData.menuScene.myHopae[i].name, 25, '#ffffff', 0.45, 0.5), 0, 0, 0, 'nameBgr' + ScenesData.menuScene.myHopae[i].name.length, 1, 'left', ScenesData.menuScene.myHopae[i].name, 25, '#ffffff', 0.45, 0.5), 0, 0, 0,
function() function()
{ {
...@@ -95,7 +101,7 @@ var menuScene = new Phaser.Class( ...@@ -95,7 +101,7 @@ var menuScene = new Phaser.Class(
this.createCurrentHopae = function() this.createCurrentHopae = function()
{ {
this.currentHopaeBtn = UIObject.createButton(this, UIObject.createLabel(this, 100, 300, 10, this.currentHopaeBtn = UIObject.createButton(this, UIObject.createLabel(this, 100, 300, 5,
'nameBgr' + PlayerData.nickname.length, 1, 'left', PlayerData.nickname, 25, '#ffffff', 0.45, 0.5), 0, 0, 0, 'nameBgr' + PlayerData.nickname.length, 1, 'left', PlayerData.nickname, 25, '#ffffff', 0.45, 0.5), 0, 0, 0,
function() function()
{ {
...@@ -116,7 +122,7 @@ var menuScene = new Phaser.Class( ...@@ -116,7 +122,7 @@ var menuScene = new Phaser.Class(
background: this.add.sprite(game.config.width / 2, game.config.height / 2, 'panel').setOrigin(0.5, 0.5), background: this.add.sprite(game.config.width / 2, game.config.height / 2, 'panel').setOrigin(0.5, 0.5),
content: this.add.text(0, 0, '대기실에 참가하시겠습니까?', { content: this.add.text(0, 0, '대기실에 참가하시겠습니까?', {
font: '50pt 궁서' font: '50pt sejongFont'
}), }),
actions: [ actions: [
...@@ -141,7 +147,7 @@ var menuScene = new Phaser.Class( ...@@ -141,7 +147,7 @@ var menuScene = new Phaser.Class(
expand: { expand: {
content: false, // Content is a pure text object content: false, // Content is a pure text object
} }
}).layout().setDepth(10).setVisible(false); }).layout().setDepth(11).setVisible(false);
this.roomEnterDialog this.roomEnterDialog
.on('button.click', function (button, groupName, index) { .on('button.click', function (button, groupName, index) {
...@@ -215,15 +221,19 @@ var hopaeScene = new Phaser.Class( ...@@ -215,15 +221,19 @@ var hopaeScene = new Phaser.Class(
Input.inputField.generate(this, function(){}, Input.inputField.generate(this, function(){},
UIObject.createLabel(this, game.config.width / 2, game.config.height / 2, 10, 'nameBgr6', 2, 'center', '', 50, '#ffffff').getElement('text').setOrigin(0.45,0.5), true); UIObject.createLabel(this, game.config.width / 2, game.config.height / 2, 10, 'nameBgr6', 2, 'center', '', 50, '#ffffff').getElement('text').setOrigin(0.45,0.5), true);
UIObject.createLabel(this, game.config.width / 2, game.config.height / 2 - 200, 2, 'panel', 1, 'center',
'호패는 오직 한글만 입력이 가능합니다.\n띄어쓰기도 사용할 수 없습니다.', 50, '#000000').layout();
this.checkDialog = this.rexUI.add.dialog({ this.checkDialog = this.rexUI.add.dialog({
x: game.config.width / 2, x: game.config.width / 2,
y: game.config.height / 2, y: game.config.height / 2,
background: this.add.sprite(game.config.width / 2, game.config.height / 2, 'panel').setOrigin(0.5, 0.5), background: this.add.sprite(game.config.width / 2, game.config.height / 2, 'panel').setOrigin(0.5, 0.5),
content: this.add.text(0, 0, '이 이름으로 하시겠습니까?\n변경에는 엽전이 소모됩니다.', { content: this.add.text(0, 0, '이 이름으로 하시겠습니까?' + (PlayerData.userData.hopae.length == 0 ? '\n(최초 호패는 비용이 들지 않습니다.)' : '\n변경에는 엽전이 소모됩니다.'), {
font: '50pt 궁서', font: '50pt sejongFont',
color: '#000000' color: '#000000',
align: 'center'
}), }),
actions: [ actions: [
...@@ -232,7 +242,6 @@ var hopaeScene = new Phaser.Class( ...@@ -232,7 +242,6 @@ var hopaeScene = new Phaser.Class(
], ],
space: { space: {
title: 25,
content: 25, content: 25,
action: 100, action: 100,
...@@ -249,7 +258,7 @@ var hopaeScene = new Phaser.Class( ...@@ -249,7 +258,7 @@ var hopaeScene = new Phaser.Class(
expand: { expand: {
content: false, // Content is a pure text object content: false, // Content is a pure text object
} }
}).layout().setDepth(10).setVisible(false); }).layout().setDepth(11).setVisible(false);
this.checkDialog this.checkDialog
.on('button.click', function (button, groupName, index) { .on('button.click', function (button, groupName, index) {
...@@ -286,7 +295,7 @@ var hopaeScene = new Phaser.Class( ...@@ -286,7 +295,7 @@ var hopaeScene = new Phaser.Class(
.on('button.out', function (button, groupName, index) { .on('button.out', function (button, groupName, index) {
//console.log('button out'); //console.log('button out');
}); });
this.warningText = UIObject.createLabel(this, game.config.width / 2, game.config.height / 2 - 100, 2, 'panel', 1, 'center', this.warningText = UIObject.createLabel(this, game.config.width / 2, game.config.height / 2 - 100, 5, 'panel', 1, 'center',
'이름 타수가 많아 플레이에 패널티가 있을 수 있습니다', 40, '#000000').setVisible(false).layout(); '이름 타수가 많아 플레이에 패널티가 있을 수 있습니다', 40, '#000000').setVisible(false).layout();
this.checkBtn = UIObject.createButton(this, UIObject.createLabel(this, game.config.width / 2, 900, 5, 'pyeongminWrite', 0.5, 'center'), 1, 0, 2, this.checkBtn = UIObject.createButton(this, UIObject.createLabel(this, game.config.width / 2, 900, 5, 'pyeongminWrite', 0.5, 'center'), 1, 0, 2,
...@@ -298,13 +307,15 @@ var hopaeScene = new Phaser.Class( ...@@ -298,13 +307,15 @@ var hopaeScene = new Phaser.Class(
ScenesData.hopaeScene.checkDialog.setVisible(true).popUp(200); ScenesData.hopaeScene.checkDialog.setVisible(true).popUp(200);
} }
}) })
if(!(PlayerData.userData.hopae === undefined || PlayerData.userData.hopae.length == 0))
{
this.backBtn = UIObject.createButton(this, UIObject.createLabel(this, 100, 900, 5, 'pyeongminWrite', 0.5, 'center'), 1, 0, 2, this.backBtn = UIObject.createButton(this, UIObject.createLabel(this, 100, 900, 5, 'pyeongminWrite', 0.5, 'center'), 1, 0, 2,
function() function()
{ {
ScenesData.changeScene('menuScene'); ScenesData.changeScene('menuScene');
}); });
} }
}
}); });
var roomScene = new Phaser.Class( var roomScene = new Phaser.Class(
...@@ -336,24 +347,23 @@ var roomScene = new Phaser.Class( ...@@ -336,24 +347,23 @@ var roomScene = new Phaser.Class(
this.isCountEnd = false; this.isCountEnd = false;
this.endTime = 0; this.endTime = 0;
this.peopleCount = 1; this.peopleCount = 1;
this.countText = this.add.text(game.config.width / 2, game.config.height / 2, '사람들을 위해 대기중입니다...').setOrigin(0.5, 0.5).setColor('#000000').setBackgroundColor('#ffffff').setDepth(10).setPadding(5,5,5,5); this.countText = this.add.text(game.config.width / 2, game.config.height / 2, '사람들을 위해 대기중입니다...').setOrigin(0.5, 0.5).setColor('#000000').setBackgroundColor('#ffffff').setDepth(9.9).setPadding(5,5,5,5);
this.peopleText = this.add.text(game.config.width / 2, game.config.height / 9, '1 / 10').setOrigin(0.5, 0.5).setColor('#000000').setBackgroundColor('#ffffff').setDepth(10); this.peopleText = this.add.text(game.config.width / 2, game.config.height / 9, '1 / 10').setOrigin(0.5, 0.5).setColor('#000000').setBackgroundColor('#ffffff').setDepth(9.9);
}, },
update: function() update: function()
{ {
this.peopleText.setText(this.peopleCount + ' / 10'); this.peopleText.setText(this.peopleCount + ' / 10');
if (this.isCounting) if (this.isCounting && !this.isCountEnd)
{ {
this.countText.setText(((this.endTime - Date.now()) / 1000).toFixed(1)); this.countText.setText(((this.endTime - Date.now()) / 1000).toFixed(1));
if (this.endTime < Date.now()) if (this.endTime != 0 && this.endTime < Date.now())
{ {
//console.log('end Count'); //console.log('end Count');
setTimeout(() => { ScenesData.endCountTimer = setTimeout(() => {
socket.emit('endCount'); socket.emit('endCount');
}, (Phaser.Math.Distance.Between(0, 0, game.config.width / 2, game.config.height * 10 / 9) * 10)); }, (Phaser.Math.Distance.Between(0, 0, game.config.width / 2, game.config.height * 10 / 9) * 3));
this.isCounting = false;
this.isCountEnd = true; this.isCountEnd = true;
this.players.forEach(function(element){ this.players.forEach(function(element){
element.follower = { t: 0, vec: new Phaser.Math.Vector2() }; element.follower = { t: 0, vec: new Phaser.Math.Vector2() };
...@@ -372,6 +382,8 @@ var roomScene = new Phaser.Class( ...@@ -372,6 +382,8 @@ var roomScene = new Phaser.Class(
} }
} }
else if (this.isCountEnd) else if (this.isCountEnd)
{
if (this.isCounting)
{ {
this.players.forEach(function(element){ this.players.forEach(function(element){
element.path.getPoint(element.follower.t, element.follower.vec); element.path.getPoint(element.follower.t, element.follower.vec);
...@@ -381,6 +393,13 @@ var roomScene = new Phaser.Class( ...@@ -381,6 +393,13 @@ var roomScene = new Phaser.Class(
this.countText.setText('잠시만 기다려주세요...'); this.countText.setText('잠시만 기다려주세요...');
} }
else else
{
this.countText.setText('이동 도중 사람이 퇴실했습니다...\n잠시만 기다려주세요...');
clearTimeout(ScenesData.endCountTimer);
ScenesData.endCountTimer = undefined;
}
}
else
{ {
this.countText.setText('사람들을 위해 대기중입니다...'); this.countText.setText('사람들을 위해 대기중입니다...');
} }
...@@ -411,8 +430,7 @@ var gameScene = new Phaser.Class( ...@@ -411,8 +430,7 @@ var gameScene = new Phaser.Class(
url: 'https://raw.githubusercontent.com/rexrainbow/phaser3-rex-notes/master/plugins/dist/rexbuttonplugin.min.js', url: 'https://raw.githubusercontent.com/rexrainbow/phaser3-rex-notes/master/plugins/dist/rexbuttonplugin.min.js',
sceneKey: 'button' sceneKey: 'button'
}); });
WordSpace.weightTextObjForTest = this.add.text(game.config.width * 5 / 64, game.config.height * 5 / 48, '뇌의 무게: (현재) 0 / ' + this.brainCapacity + ' (전체)').setDepth(10).setColor('#000000'); WordSpace.resetGame();
WordSpace.killLogTextForTest = this.add.text(game.config.width * 25 / 32, game.config.height * 5 / 72, WordSpace.killLogForTest).setDepth(10).setColor('#000000').setAlign('right');
}, },
create: function() create: function()
...@@ -425,6 +443,7 @@ var gameScene = new Phaser.Class( ...@@ -425,6 +443,7 @@ var gameScene = new Phaser.Class(
BackGround.drawBrain(this); BackGround.drawBrain(this);
BackGround.drawCharacter(this); BackGround.drawCharacter(this);
Audio.playSound(this, 'startGame'); Audio.playSound(this, 'startGame');
WordSpace.attackPaperGroup = this.physics.add.group();
WordSpace.wordPhysicsGroup = this.physics.add.group(); WordSpace.wordPhysicsGroup = this.physics.add.group();
Input.inputField.generate(this, Input.gameSceneEnterReaction, Input.inputField.generate(this, Input.gameSceneEnterReaction,
...@@ -438,13 +457,26 @@ var gameScene = new Phaser.Class( ...@@ -438,13 +457,26 @@ var gameScene = new Phaser.Class(
WordSpace.setPlayerTyping.initiate(this); WordSpace.setPlayerTyping.initiate(this);
WordSpace.nameWordTextForTest = this.add.text(50,400,'현재 가진 호패들 : 없음').setDepth(10).setColor('#000000');
WordSpace.nameQueue.initiate(); WordSpace.nameQueue.initiate();
//WordSpace.attackGauge.add(11);
this.warningImage = this.add.sprite(game.config.width / 2, game.config.height / 2, 'weightWarning').setDisplaySize(game.config.width, game.config.height).setDepth(0.1).setAlpha(0)
this.warningTween = this.tweens.add({
targets: this.warningImage,
alpha: 1,
duration: 500,
ease: 'Linear',
yoyo: true,
repeat: -1
});
this.warningTween.timeScale = 0;
WordSpace.changePhase(WordSpace.Phase.START);
}, },
update: function() update: function()
{
if(ScenesData.currentScene == ScenesData.gameScene && WordSpace.gameTimer != null)
{ {
WordSpace.deltaTime = this.sys.game.loop.delta; WordSpace.deltaTime = this.sys.game.loop.delta;
WordSpace.wordForcedGroup.forEach(function(element) WordSpace.wordForcedGroup.forEach(function(element)
...@@ -455,20 +487,20 @@ var gameScene = new Phaser.Class( ...@@ -455,20 +487,20 @@ var gameScene = new Phaser.Class(
{ {
element.attract(); element.attract();
}) })
WordSpace.attackPaperGroup.forEach(function(element){ WordSpace.attackPaperGroup.getChildren().forEach(function(element){
element.moveObject(element); element.moveObject(element);
}); });
let tempNames = '';
WordSpace.nameGroup.forEach(function(element)
{
//테스트용
tempNames += element.wordText + (element.isStrong?' [강]':'') + '\n';
});
WordSpace.nameWordTextForTest.setText('현재 가진 호패들 : \n' + tempNames);
WordSpace.weightTextObjForTest.setText('뇌의 무게: (현재) '+WordSpace.totalWeight+' / '+ WordSpace.brainCapacity+' (전체)');
WordSpace.killLogTextForTest.setText(WordSpace.killLogForTest);
WordSpace.setPlayerTyping.add(''); WordSpace.setPlayerTyping.add('');
if(!WordSpace.isGameOver)
{
if(WordSpace.totalWeight < 180) this.warningTween.timeScale = 0;
else if(WordSpace.totalWeight < 190) this.warningTween.timeScale = 0.3;
else if(WordSpace.totalWeight < 200) this.warningTween.timeScale = 0.6;
else if(WordSpace.isTimerOn) this.warningTween.timeScale = 0.6 + WordSpace.gameOverCycle.currentCycle.getElapsed() / WordSpace.delay.GameOver * 3;
}
}
} }
}); });
......
...@@ -10,7 +10,8 @@ UIObject.createLabel = function (scene, x, y, depth, image, size, align, text = ...@@ -10,7 +10,8 @@ UIObject.createLabel = function (scene, x, y, depth, image, size, align, text =
background: scene.add.sprite(x, y, image).setScale(size).setOrigin(0.5, 0.5).setDepth(depth), background: scene.add.sprite(x, y, image).setScale(size).setOrigin(0.5, 0.5).setDepth(depth),
text: scene.add.text(x, y, text, { text: scene.add.text(x, y, text, {
font: textSize + 'pt 궁서' font: textSize + 'pt sejongFont',
align: 'center'
}).setDepth(depth).setOrigin(textOriginX, textOriginY).setColor(textColor), }).setDepth(depth).setOrigin(textOriginX, textOriginY).setColor(textColor),
space: { space: {
......
...@@ -20,7 +20,7 @@ class WordObject ...@@ -20,7 +20,7 @@ class WordObject
var random = WordSpace.getSpawnPoint(lenRate); var random = WordSpace.getSpawnPoint(lenRate);
this.physicsObj = scene.physics.add.sprite(random.x, random.y, spriteName).setMass(this.wordWeight * 10).setScale(this.scale) this.physicsObj = scene.physics.add.sprite(random.x, random.y, spriteName).setMass(this.wordWeight * 10).setScale(this.scale)
.setFrictionX(0).setFrictionY(0).setBounce(0.5); .setFrictionX(0).setFrictionY(0).setBounce(0.5).setDepth(1);
this.physicsObj.wordCollider = null; this.physicsObj.wordCollider = null;
let dist = Phaser.Math.Distance.Between(this.physicsObj.x, this.physicsObj.y, WordSpace.gravityPoint.x, WordSpace.gravityPoint.y); let dist = Phaser.Math.Distance.Between(this.physicsObj.x, this.physicsObj.y, WordSpace.gravityPoint.x, WordSpace.gravityPoint.y);
let angle = Phaser.Math.Angle.Between(this.physicsObj.x, this.physicsObj.y, WordSpace.gravityPoint.x, WordSpace.gravityPoint.y); let angle = Phaser.Math.Angle.Between(this.physicsObj.x, this.physicsObj.y, WordSpace.gravityPoint.x, WordSpace.gravityPoint.y);
...@@ -31,11 +31,10 @@ class WordObject ...@@ -31,11 +31,10 @@ class WordObject
this.wordObj = scene.add.text(random.x, random.y, this.wordText, this.wordObj = scene.add.text(random.x, random.y, this.wordText,
{ {
fontSize: (this.scale * this.fontScale) +'pt', font: (this.scale * this.fontScale) +'pt sejongFont',
fontFamily: '"궁서", 궁서체, serif',
//fontStyle: (this.wordWeight > 5 ? 'bold' : '') //fontStyle: (this.wordWeight > 5 ? 'bold' : '')
}); });
this.wordObj.setColor(textColor).setOrigin(0.5,0.5); this.wordObj.setColor(textColor).setOrigin(0.5,0.5).setDepth(1);
this.createdTime = WordSpace.gameTimer.now; this.createdTime = WordSpace.gameTimer.now;
WordSpace.totalWeight += this.wordWeight; WordSpace.totalWeight += this.wordWeight;
WordSpace.totalWordNum += 1; WordSpace.totalWordNum += 1;
...@@ -54,7 +53,7 @@ class WordObject ...@@ -54,7 +53,7 @@ class WordObject
const forceIdx = WordSpace.wordForcedGroup.findIndex(function(item) {return this.isEqualObject(item.generationCode)}, this); const forceIdx = WordSpace.wordForcedGroup.findIndex(function(item) {return this.isEqualObject(item.generationCode)}, this);
if (forceIdx > -1) WordSpace.wordForcedGroup.splice(forceIdx, 1); if (forceIdx > -1) WordSpace.wordForcedGroup.splice(forceIdx, 1);
WordSpace.wordPhysicsGroup.remove(this.physicsObj); WordSpace.wordPhysicsGroup.remove(this.physicsObj);
let breakAnim = ScenesData.gameScene.add.sprite(this.physicsObj.x, this.physicsObj.y, 'wordBreak').setScale(0.5).setDepth(3).play('wordBreakAnim'); let breakAnim = ScenesData.gameScene.add.sprite(this.physicsObj.x, this.physicsObj.y, 'wordBreak').setScale(0.5).setDepth(1.1).play('wordBreakAnim');
setTimeout(function() { setTimeout(function() {
breakAnim.destroy(); breakAnim.destroy();
}, 200); }, 200);
...@@ -210,6 +209,7 @@ class AttackWord extends WordObject ...@@ -210,6 +209,7 @@ class AttackWord extends WordObject
attackerId: RoomData.myself.id, attackerId: RoomData.myself.id,
victimId: this.attacker.id, victimId: this.attacker.id,
text: this.wordText, text: this.wordText,
multiple: 1,
grade: Math.min(3, this.wordGrade + 1), grade: Math.min(3, this.wordGrade + 1),
attackOption: { attackOption: {
isStrong: false, isStrong: false,
...@@ -236,6 +236,7 @@ class NameWord extends WordObject ...@@ -236,6 +236,7 @@ class NameWord extends WordObject
this.wordWeight = 2; this.wordWeight = 2;
this.isStrong = _isStrong; this.isStrong = _isStrong;
this.isActive = true; this.isActive = true;
if(_isStrong) RoomData.myself.earnedStrongHopae++;
//console.log('Name : ' + player.nickname + ', Strong : ' + this.isStrong + ', Weight : ' + this.wordWeight); //console.log('Name : ' + player.nickname + ', Strong : ' + this.isStrong + ', Weight : ' + this.wordWeight);
} }
instantiate(scene, lenRate) instantiate(scene, lenRate)
...@@ -259,8 +260,7 @@ class NameWord extends WordObject ...@@ -259,8 +260,7 @@ class NameWord extends WordObject
{ {
this.physicsObj.setScale(this.follower.t < 0.2 ? 0.2 : this.follower.t * this.scale); this.physicsObj.setScale(this.follower.t < 0.2 ? 0.2 : this.follower.t * this.scale);
this.wordObj.setFont({ this.wordObj.setFont({
fontSize: (this.follower.t < 0.2 ? 0.05 : this.follower.t * this.scale * this.fontScale) +'pt', font: (this.follower.t < 0.2 ? 0.05 : this.follower.t * this.scale * this.fontScale) +'pt sejongFont',
fontFamily: '"궁서", 궁서체, serif',
fontStyle: (this.wordWeight > 5 ? 'bold' : '') fontStyle: (this.wordWeight > 5 ? 'bold' : '')
}); });
} }
...@@ -283,8 +283,8 @@ class NameWord extends WordObject ...@@ -283,8 +283,8 @@ class NameWord extends WordObject
if(!this.isStrong) WordSpace.attackGauge.add(this.wordTyping * 0.1); if(!this.isStrong) WordSpace.attackGauge.add(this.wordTyping * 0.1);
WordSpace.nameGroup.push(this); WordSpace.nameGroup.push(this);
this.isActive = false; this.isActive = false;
this.physicsObj.setVelocity(0, 0).setDepth(20); this.physicsObj.setVelocity(0, 0).setDepth(10.2);
this.wordObj.setPosition(this.physicsObj.x, this.physicsObj.y).setDepth(20); this.wordObj.setPosition(this.physicsObj.x, this.physicsObj.y).setDepth(10.2);
this.follower = { t: 0, vec: new Phaser.Math.Vector2() }; this.follower = { t: 0, vec: new Phaser.Math.Vector2() };
this.path = new Phaser.Curves.Spline([ this.path = new Phaser.Curves.Spline([
this.physicsObj.x, this.physicsObj.y, this.physicsObj.x, this.physicsObj.y,
...@@ -361,8 +361,10 @@ class ItemWord extends WordObject ...@@ -361,8 +361,10 @@ class ItemWord extends WordObject
{ {
case Enums.item.invincible: case Enums.item.invincible:
WordSpace.isInvincible = true; WordSpace.isInvincible = true;
socket.emit('itemStart', {id: RoomData.myself.id, itemType: Enums.item.invincible});
setTimeout(() => { setTimeout(() => {
WordSpace.isInvincible = false; WordSpace.isInvincible = false;
socket.emit('itemEnd', {id: RoomData.myself.id, itemType: Enums.item.invincible});
}, 5000); }, 5000);
break; break;
case Enums.item.nameList: case Enums.item.nameList:
......
var WordSpace = WordSpace || {}; var WordSpace = WordSpace || {};
// for test
WordSpace.weightTextObjForTest = null;
WordSpace.nameWordTextForTest = null; WordSpace.nameWordTextForTest = null;
WordSpace.killLogTextForTest = null;
WordSpace.killLogForTest = '';
WordSpace.nextWordCode = 0; WordSpace.nextWordCode = 0;
WordSpace.totalWeight = 0; //현재 단어 무게 총합 WordSpace.totalWeight = 0; //현재 단어 무게 총합
WordSpace.totalWordNum = 0; WordSpace.totalWordNum = 0;
WordSpace.brainCapacity = 200; //수용 가능한 단어 무게 최대치 WordSpace.brainCapacity = 200; //수용 가능한 단어 무게 최대치
WordSpace.gameTimer = null; //현재 게임 플레이 시간 타이머 WordSpace.gameTimer = null; //현재 게임 플레이 시간 타이머
WordSpace.isGameOver = false;
WordSpace.isTimerOn = false; WordSpace.isTimerOn = false;
WordSpace.isInvincible = false; WordSpace.isInvincible = false;
WordSpace.pyeongminAnims = []; WordSpace.pyeongminAnims = [];
WordSpace.wordGroup = []; WordSpace.wordGroup = [];
WordSpace.nameGroup = []; WordSpace.nameGroup = [];
WordSpace.attackPaperGroup = []; WordSpace.attackPaperGroup = null;
WordSpace.wordForcedGroup = []; WordSpace.wordForcedGroup = [];
WordSpace.wordPhysicsGroup = null; WordSpace.wordPhysicsGroup = null;
WordSpace.lastAttackGroup = [];
WordSpace.GradeProb = [0.35, 0.6, 0.8]; WordSpace.GradeProb = [0.35, 0.6, 0.8];
WordSpace.Phase = {READY: 0, START: 1, MAIN: 2, MUSIC: 3}; WordSpace.Phase = {READY: 0, START: 1, MAIN: 2, MUSIC: 3};
...@@ -65,34 +63,34 @@ WordSpace.spaceInitiate = function(scene) ...@@ -65,34 +63,34 @@ WordSpace.spaceInitiate = function(scene)
}); });
} }
WordSpace.AdjustVarByPhase = function(typingRate, phase) WordSpace.adjustVarByPhase = function()
{ {
if(phase == WordSpace.Phase.START) if(WordSpace.CurrentPhase == WordSpace.Phase.START)
{ {
WordSpace.delay.WordSpawn = 3000; WordSpace.delay.WordSpawn = 3000;
WordSpace.delay.NameSpawn = 15000; WordSpace.delay.NameSpawn = 15000;
WordSpace.NameSpawnReduce = 1000; WordSpace.NameSpawnReduce = 1000;
WordSpace.GradeProb[0] = 0.35; WordSpace.GradeProb[0] = 0.35;
WordSpace.GradeProb[1] = 1 - 0.4 * typingRate; WordSpace.GradeProb[1] = 1 - 0.4 * WordSpace.playerTypingRate;
WordSpace.GradeProb[2] = 1; WordSpace.GradeProb[2] = 1;
} }
else if(phase == WordSpace.Phase.MAIN) else if(WordSpace.CurrentPhase == WordSpace.Phase.MAIN)
{ {
WordSpace.delay.WordSpawn = 3000 - typingRate * 1000; WordSpace.delay.WordSpawn = 3000 - WordSpace.playerTypingRate * 1000;
WordSpace.delay.NameSpawn = 12000; WordSpace.delay.NameSpawn = 12000;
WordSpace.NameSpawnReduce = 1000; WordSpace.NameSpawnReduce = 1000;
WordSpace.GradeProb[0] = 0.5 - 0.5 * typingRate; WordSpace.GradeProb[0] = 0.5 - 0.5 * WordSpace.playerTypingRate;
WordSpace.GradeProb[1] = 1 - 0.5 * typingRate; WordSpace.GradeProb[1] = 1 - 0.5 * WordSpace.playerTypingRate;
WordSpace.GradeProb[2] = 1 - 0.15 * typingRate; WordSpace.GradeProb[2] = 1 - 0.15 * WordSpace.playerTypingRate;
} }
else if(phase == WordSpace.Phase.MUSIC) else if(WordSpace.CurrentPhase == WordSpace.Phase.MUSIC)
{ {
WordSpace.delay.WordSpawn = 1500; WordSpace.delay.WordSpawn = 1500;
WordSpace.delay.NameSpawn = 8000; WordSpace.delay.NameSpawn = 8000;
WordSpace.NameSpawnReduce = 400; WordSpace.NameSpawnReduce = 400;
WordSpace.GradeProb[0] = 0.2 - 0.2 * typingRate; WordSpace.GradeProb[0] = 0.2 - 0.2 * WordSpace.playerTypingRate;
WordSpace.GradeProb[1] = 0.8 - 0.45 * typingRate; WordSpace.GradeProb[1] = 0.8 - 0.45 * WordSpace.playerTypingRate;
WordSpace.GradeProb[2] = 0.9 - 0.15 * typingRate; WordSpace.GradeProb[2] = 0.9 - 0.15 * WordSpace.playerTypingRate;
} }
WordSpace.wordCycle.resetCycle(ScenesData.gameScene, WordSpace.delay.WordSpawn, WordSpace.wordCycle.currentCycle.getElapsed(), true); WordSpace.wordCycle.resetCycle(ScenesData.gameScene, WordSpace.delay.WordSpawn, WordSpace.wordCycle.currentCycle.getElapsed(), true);
WordSpace.nameCycle.resetCycle(ScenesData.gameScene, WordSpace.delay.NameSpawn, WordSpace.nameCycle.currentCycle.getElapsed(), true); WordSpace.nameCycle.resetCycle(ScenesData.gameScene, WordSpace.delay.NameSpawn, WordSpace.nameCycle.currentCycle.getElapsed(), true);
...@@ -112,7 +110,7 @@ WordSpace.attackGauge = ...@@ -112,7 +110,7 @@ WordSpace.attackGauge =
generate: function(scene) generate: function(scene)
{ {
//console.log("created"); //console.log("created");
this.rectUI = scene.add.rectangle(game.config.width / 2, game.config.height * 5 / 6, 0, game.config.height * 11 / 720).setDepth(11); this.rectUI = scene.add.rectangle(game.config.width / 2, game.config.height * 5 / 6, 0, game.config.height * 11 / 720).setDepth(10.1);
}, },
add: function(plus) add: function(plus)
{ {
...@@ -143,7 +141,7 @@ WordSpace.attackGauge = ...@@ -143,7 +141,7 @@ WordSpace.attackGauge =
}; };
this.currentCycle = scene.time.addEvent(option); this.currentCycle = scene.time.addEvent(option);
this.text = scene.add.text(100,100,'게이지: ' + this.value.toFixed(1)).setDepth(10).setColor('#000000'); this.text = scene.add.text(100,100,'게이지: ' + this.value.toFixed(1)).setDepth(9.9).setColor('#000000');
//this.rectUI.setColor(this.gradeColor[0]); //this.rectUI.setColor(this.gradeColor[0]);
}, },
pauseCycle: function(bool) {this.currentCycle.paused = bool;}, pauseCycle: function(bool) {this.currentCycle.paused = bool;},
...@@ -222,10 +220,6 @@ function gameOver() ...@@ -222,10 +220,6 @@ function gameOver()
socket.emit('defeated'); socket.emit('defeated');
console.log('defeat'); console.log('defeat');
ScenesData.gameScene.add.text(game.config.width / 2, game.config.height / 2, '패배', {fontSize: '30pt'})
.setPadding(5,5,5,5).setOrigin(0.5, 0.5).setDepth(10)
.setColor('#000000').setBackgroundColor('#ffffff');
//alert('defeat');
} }
//게임 오버 판정을 위한 타이머 //게임 오버 판정을 위한 타이머
...@@ -347,7 +341,12 @@ WordSpace.setPlayerTyping = ...@@ -347,7 +341,12 @@ WordSpace.setPlayerTyping =
}, },
initiate: function(scene) initiate: function(scene)
{ {
this.text = scene.add.text(100,200,'현재 타수 : ' + WordSpace.playerTyping.toFixed(1)).setDepth(10).setColor('#000000'); this.text = scene.add.text(100,200,'현재 타수 : ' + WordSpace.playerTyping.toFixed(1)).setDepth(9.9).setColor('#000000');
},
reset: function()
{
this.totalTyping = 0;
this.writeWord = false;
} }
} }
...@@ -416,14 +415,17 @@ WordSpace.attack = function(wordText, grade) ...@@ -416,14 +415,17 @@ WordSpace.attack = function(wordText, grade)
WordSpace.makeAttackPaper = function(scene, attackFrom, attackTo, multiple) WordSpace.makeAttackPaper = function(scene, attackFrom, attackTo, multiple)
{ {
var attackPaper = scene.add.sprite(attackFrom.x, attackFrom.y, 'attackPaper').setScale(0.5 * multiple).setDepth(3); let size = attackTo == RoomData.myself.position ? 1 : 0.7;
let xOffset = attackTo != RoomData.myself.position && attackTo.x < game.config.width / 2 ? -1 : 1;
var attackPaper = scene.add.sprite(attackFrom.x, attackFrom.y, 'attackPaper').setScale(0.5 * multiple).setDepth(5.2);
attackPaper.mask = new Phaser.Display.Masks.BitmapMask(scene, BackGround.gameBackground); attackPaper.mask = new Phaser.Display.Masks.BitmapMask(scene, BackGround.gameBackground);
attackPaper.throwTarget = attackTo; attackPaper.throwTarget = attackTo;
attackPaper.follower = { t: 0, vec: new Phaser.Math.Vector2() }; attackPaper.follower = { t: 0, vec: new Phaser.Math.Vector2() };
attackPaper.path = new Phaser.Curves.Spline([ attackPaper.path = new Phaser.Curves.Spline([
attackFrom.x, attackFrom.y, attackFrom.x, attackFrom.y,
(attackFrom.x + attackPaper.throwTarget.x) / 2, Math.min(attackFrom.y, attackPaper.throwTarget.y) - 100, (attackFrom.x + attackPaper.throwTarget.x) / 2, Math.min(attackFrom.y, attackPaper.throwTarget.y) - 100,
attackPaper.throwTarget.x, attackPaper.throwTarget.y - 10 attackPaper.throwTarget.x + 20 * size * xOffset, attackPaper.throwTarget.y - 50 * size
]); ]);
scene.tweens.add({ scene.tweens.add({
targets: attackPaper.follower, targets: attackPaper.follower,
...@@ -432,8 +434,7 @@ WordSpace.makeAttackPaper = function(scene, attackFrom, attackTo, multiple) ...@@ -432,8 +434,7 @@ WordSpace.makeAttackPaper = function(scene, attackFrom, attackTo, multiple)
duration: 4000, duration: 4000,
repeat: 0, repeat: 0,
onComplete: function() { onComplete: function() {
attackPaper.destroy(); WordSpace.attackPaperGroup.remove(attackPaper, true);
WordSpace.attackPaperGroup = [];
} }
}); });
attackPaper.moveObject = function(obj) attackPaper.moveObject = function(obj)
...@@ -442,7 +443,7 @@ WordSpace.makeAttackPaper = function(scene, attackFrom, attackTo, multiple) ...@@ -442,7 +443,7 @@ WordSpace.makeAttackPaper = function(scene, attackFrom, attackTo, multiple)
obj.setPosition(obj.follower.vec.x, obj.follower.vec.y); obj.setPosition(obj.follower.vec.x, obj.follower.vec.y);
obj.angle = 720 * obj.follower.t; obj.angle = 720 * obj.follower.t;
} }
WordSpace.attackPaperGroup.push(attackPaper); WordSpace.attackPaperGroup.add(attackPaper);
} }
WordSpace.nameQueue = WordSpace.nameQueue =
...@@ -487,3 +488,70 @@ WordSpace.nameQueue = ...@@ -487,3 +488,70 @@ WordSpace.nameQueue =
this.shuffle(); this.shuffle();
} }
} }
WordSpace.changePhase = function(newPhase)
{
console.log('phase changed from ' + WordSpace.CurrentPhase + ' to ' + newPhase);
WordSpace.CurrentPhase = newPhase;
//WordSpace.pauseCycle(true);
// 여기서 종이 드르륵 열면됨
let phaseChangeBgr = ScenesData.gameScene.add.sprite(game.config.width / 2, game.config.height / 2, 'phase' + newPhase).setOrigin(0.5, 0.5).setDepth(9.9).play('phase' + newPhase + 'Anim');
//ScenesData.gameScene.scene.pause('gameScene');
setTimeout(function()
{
//ScenesData.gameScene.scene.resume('gameScene');
// 여기서 종이 닫으면됨
phaseChangeBgr.anims.playReverse('phase' + newPhase + 'Anim');
phaseChangeBgr.on('animationcomplete', function(currentAnim, currentFrame, sprite){sprite.destroy()});
Audio.playSound(ScenesData.gameScene, 'startGame');
//WordSpace.pauseCycle(false);
//console.log('start again');
}, 5000);
}
WordSpace.resetGame = function()
{
WordSpace.nextWordCode = 0;
WordSpace.totalWeight = 0; //현재 단어 무게 총합
WordSpace.totalWordNum = 0;
WordSpace.brainCapacity = 200; //수용 가능한 단어 무게 최대치
WordSpace.gameTimer = null; //현재 게임 플레이 시간 타이머
WordSpace.isGameOver = false;
WordSpace.isTimerOn = false;
WordSpace.isInvincible = false;
WordSpace.pyeongminAnims = [];
WordSpace.wordGroup = [];
WordSpace.nameGroup = [];
WordSpace.attackPaperGroup = null;
WordSpace.wordForcedGroup = [];
WordSpace.wordPhysicsGroup = null;
WordSpace.nameQueue.queue = [];
WordSpace.setPlayerTyping.reset();
WordSpace.isTimerOn = false;
WordSpace.attackGauge.resetValue();
WordSpace.CurrentPhase = WordSpace.Phase.START;
WordSpace.playerTyping = 0;
WordSpace.playerTypingRate = 0;
//단어 생성 사이클
WordSpace.wordCycle = new Cycle(function()
{
WordSpace.genWordByProb(this);
});
//게임 오버 사이클
WordSpace.gameOverCycle = new Cycle(gameOver);
//호패 생성 사이클
WordSpace.nameCycle = new Cycle(function()
{
WordSpace.generateWord.Name(ScenesData.gameScene, false, null);
});
// playerTypingRate 갱신용 사이클
WordSpace.playerTypingCycle = new Cycle(function()
{
socket.emit('setPlayerTyping', {playerTyping: WordSpace.playerTyping, isWord: WordSpace.setPlayerTyping.writeWord, isAttackMode: Input.attackMode} );
WordSpace.setPlayerTyping.writeWord = false;
});
// 공격받을때의 일회용 이벤트들
WordSpace.attackedEvents = [];
}
\ No newline at end of file
var config = { var config = {
type: Phaser.AUTO, type: Phaser.CANVAS,
width: 1920, width: 1920,
height: 1080, height: 1080,
scale: { scale: {
......
...@@ -16,7 +16,7 @@ app.get('/', function(req, res) { ...@@ -16,7 +16,7 @@ app.get('/', function(req, res) {
server.listen(80, function() { server.listen(80, function() {
console.log('[SERVER] Listening on port ' + server.address().port); console.log('[SERVER] Listening on port ' + server.address().port);
GameServer.serverNumber = Math.floor(Math.random() * 1000 + 1); GameServer.serverNumber = Math.floor(Math.random() * 1000 + 1);
console.log('[SERVER] server number is ${GameServer.serverNumber}'); console.log('[SERVER] server number is ' + GameServer.serverNumber);
}); });
...@@ -47,57 +47,100 @@ io.on('connection', function(socket) ...@@ -47,57 +47,100 @@ io.on('connection', function(socket)
{ {
if(msg.length < 1) socket.emit('alert' ,'errNicknameEmpty'); if(msg.length < 1) socket.emit('alert' ,'errNicknameEmpty');
else else
{
let isAlreadyHave = false;
GameServer.currentPlayer.forEach(function(element)
{
if (element.playerData.nickname === msg) isAlreadyHave = true;
});
if (isAlreadyHave) socket.emit('alert' ,'errNicknameOverlaped');
else
{ {
socket.playerData.nickname = msg; socket.playerData.nickname = msg;
console.log('['+socket.playerData.id+'] nickname set to ' + msg); console.log('['+socket.playerData.id+'] nickname set to ' + msg);
GameServer.enterEmptyRoom(socket); GameServer.enterEmptyRoom(socket);
} }
} });
socket.on('exitFromRoom', function(msg){
GameServer.findPlayerSocket(msg).playerData.playingData.isInThisRoom = false;
}); });
socket.on('setPlayerTyping', function(msg) // number playerTyping socket.on('setPlayerTyping', function(msg) // number playerTyping
{ {
try try
{ {
socket.playerData.playingData.playerTyping = msg.playerTyping; let player = socket.playerData.playingData;
if (socket.playerData.currentRoom.maxTypingPlayer.playerTyping < msg.playerTyping) let room = socket.playerData.currentRoom;
player.playerTyping = msg.playerTyping;
if (room.maxTypingPlayer.playerTyping < msg.playerTyping)
{ {
socket.playerData.currentRoom.maxTypingPlayer = socket.playerData.playingData; room.maxTypingPlayer = player;
} }
if (socket.playerData.currentRoom.minTypingPlayer.playerTyping > msg.playerTyping) if (room.minTypingPlayer.playerTyping > msg.playerTyping)
{ {
socket.playerData.currentRoom.minTypingPlayer = socket.playerData.playingData; room.minTypingPlayer = player;
} }
let playerTypingRate = (msg.playerTyping - (socket.playerData.currentRoom.minTypingPlayer.playerTyping - socket.playerData.currentRoom.rateArrangePoint)) / let playerTypingRate = (msg.playerTyping - (room.minTypingPlayer.playerTyping - room.rateArrangePoint)) /
(socket.playerData.currentRoom.maxTypingPlayer.playerTyping - socket.playerData.currentRoom.minTypingPlayer.playerTyping + socket.playerData.currentRoom.rateArrangePoint * 2); (room.maxTypingPlayer.playerTyping - room.minTypingPlayer.playerTyping + room.rateArrangePoint * 2);
socket.emit('setPlayerTypingRate', playerTypingRate); socket.emit('setPlayerTypingRate', playerTypingRate);
if (msg.isWord) if (msg.isWord)
{ {
socket.playerData.currentRoom.announceToRoom('writeWord', socket.playerData.id); room.announceToRoom('writeWord', player.id);
} }
if (msg.isAttackMode) if (msg.isAttackMode)
{ {
socket.playerData.currentRoom.announceToRoom('attackMode', socket.playerData.id); room.announceToRoom('attackMode', player.id);
} }
if (player.tabCheckTime != undefined)
{
clearTimeout(player.tabCheckTime);
player.tabCheckTime = setTimeout(function()
{
if (room.currentPhase != GameServer.Phase.GAMEEND) player.defeat();
}, 1000);
}
else player.tabCheckTime = setTimeout(function()
{
if (room.currentPhase != GameServer.Phase.GAMEEND) player.defeat();
}, 1000);
}
catch (e) {
console.error('[ERR] error catched on setPlayerTyping (' + e + ')');
socket.disconnect();
} }
catch (e) {console.error('[ERR] error catched on setPlayerTyping')}
}); });
socket.on('endCount', function() socket.on('endCount', function()
{ {
socket.playerData.currentRoom.aliveCount--; socket.playerData.currentRoom.aliveCount--;
if (socket.playerData.currentRoom.aliveCount === 0) //console.log('counted, ' + socket.playerData.currentRoom.aliveCount);
socket.playerData.playingData.isAlive = true;
if (socket.playerData.currentRoom.aliveCount === 0 && socket.playerData.currentRoom.currentPlayer.length >= socket.playerData.currentRoom.startCount)
{ {
socket.playerData.currentRoom.startRoom(); socket.playerData.currentRoom.startRoom();
clearTimeout(socket.playerData.currentRoom.startTimer);
}
if (socket.playerData.currentRoom.startTimer === undefined)
{
const room = socket.playerData.currentRoom;
room.startTimer = setTimeout(function()
{
let deads = room.currentPlayer.filter(element => !element.isAlive);
if (room.aliveCount != 0 && room.currentPlayer.length - deads.length >= room.startCount)
{
console.error('[ROOM#'+room.roomId+'] FORCE START!!!');
room.startRoom();
deads.forEach(function(element)
{
element.defeat();
});
clearTimeout(room.startTimer);
}
else if (deads.length > 0)
{
deads.forEach(function(element)
{
room.currentSocket[element.index].disconnect();
room.exitRoom(element.id);
});
room.refreshRoom();
}
}, 2000);
} }
}); });
...@@ -144,22 +187,37 @@ io.on('connection', function(socket) ...@@ -144,22 +187,37 @@ io.on('connection', function(socket)
if (wrongCountIndex !== -1) socket.playerData.playingData.lastAttacks[wrongCountIndex].wrongCount++; if (wrongCountIndex !== -1) socket.playerData.playingData.lastAttacks[wrongCountIndex].wrongCount++;
}); });
socket.on('itemStart', function(msg) //playerID, item
{
socket.playerData.currentRoom.announceToRoom('someoneItemStart', msg);
});
socket.on('itemEnd', function(msg) //playerID, item
{
socket.playerData.currentRoom.announceToRoom('someoneItemEnd', msg);
});
socket.on('disconnect', function(reason) socket.on('disconnect', function(reason)
{ {
GameServer.disconnectCount++; GameServer.disconnectCount++;
let data = socket.playerData; let data = socket.playerData;
if (typeof data === undefined) if (data === undefined)
{ {
console.error('[ERROR] data is undefined'); console.error('[ERROR] data is undefined');
console.table(GameServer.currentPlayer); console.table(GameServer.currentPlayer);
GameServer.disconnectCount--;
} }
else // data.id is not undefined else // data.id is not undefined
{ {
disconnectUser(data, reason); disconnectUser(data, reason);
} }
const connectDiff = GameServer.connectCount - GameServer.disconnectCount; const connectDiff = GameServer.connectCount - GameServer.disconnectCount;
const playerCount = GameServer.currentPlayer.length const playerCount = GameServer.currentPlayer.length;
if (connectDiff != playerCount)
{
console.log({ connectDiff, playerCount }); console.log({ connectDiff, playerCount });
console.table(GameServer.currentPlayer);
}
socket.disconnect();
}); });
}); });
...@@ -178,20 +236,6 @@ var disconnectUser = function(data, reason) ...@@ -178,20 +236,6 @@ var disconnectUser = function(data, reason)
if (data.currentRoom.currentPhase === GameServer.Phase.READY || data.currentRoom.currentPhase === GameServer.Phase.COUNT) if (data.currentRoom.currentPhase === GameServer.Phase.READY || data.currentRoom.currentPhase === GameServer.Phase.COUNT)
{ {
data.currentRoom.exitRoom(data.id); data.currentRoom.exitRoom(data.id);
if (data.currentRoom.aliveCount < data.currentRoom.startCount)
{
data.currentRoom.announceToRoom('setRoomCount',
{
isEnable: false, endTime: 0, playerCount: data.currentRoom.currentPlayer.length,
isEnter: false, player: data.playingData
});
data.currentRoom.currentPhase = GameServer.Phase.READY;
}
else data.currentRoom.announceToRoom('setRoomCount',
{
isEnable: true, endTime: data.currentRoom.endTime, playerCount: data.currentRoom.currentPlayer.length,
isEnter: false, player: data.playingData
});
} }
else if (data.playingData.isAlive) else if (data.playingData.isAlive)
{ {
......
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