Commit c885c2b6 authored by 18손재민's avatar 18손재민

시즌 10호 머지

parents 80e1e2f6 3fe7e321
var GameServer = GameServer || {};
GameServer.Phase = {READY: 0, START: 1, MAIN: 2, MUSIC: 3};
GameServer.Phase = {READY: 0, COUNT: -1, START: 1, MAIN: 2, MUSIC: 3};
GameServer.startCount = 2;
GameServer.currentPlayer = [];
......@@ -18,26 +18,29 @@ GameServer.findPlayer = function(playerId)
{
var idx = this.currentPlayer.findIndex(function(element)
{
return element.id === socket;
return element.id === playerId;
});
if (idx != -1) return this.currentPlayer[idx];
else
{
console.log('[ERR] wrong playerId to find');
console.log('[ERR] wrong playerId('+ playerId +') to find');
return null;
}
}
GameServer.nextRoomNumber = 0;
GameServer.makeRoom = function()
{
// 나중에 room 삭제시 생긴 null에 채워넣는식으로 만들것, 룸의 인덱스를 고정
var roomOption =
{
roomNum: GameServer.nextRoomNumber++,
maxPlayer: 5,
nextRank: 5,
maxPlayer: 100,
nextRank: 100,
currentPlayer: [],
aliveCount: 0,
currentSocket: [],
currentPhase: GameServer.Phase.READY,
endTime: 0,
rateArrangePoint: 300,
maxTypingPlayer: null,
......@@ -80,10 +83,26 @@ GameServer.enterRoom = function(roomIdx, playerData)
}
playerData.playingData = player;
playerData.currentRoom = room;
room.aliveCount++;
console.log('[' + playerData.id + '] entered to room #' + room.roomNum);
playerData.socketId.emit('enterRoom');
if (room.currentPlayer.length >= this.startCount) GameServer.startRoom(roomIdx);
room.endTime = Date.now() + 6000; // 테스트로 6초로 남겨둠
if (room.currentPlayer.length >= this.startCount)
{
if (room.currentPhase === this.Phase.READY) // start count
{
this.announceToRoom(room.roomNum, 'setCount', {isEnable: true, endTime: room.endTime});
}
else if (room.currentPhase === this.Phase.COUNT) // countinue count
{
playerData.socketId.emit('setCount', {isEnable: true, endTime: room.endTime});
}
}
else // stop count
{
this.announceToRoom(room.roomNum, 'setCount', {isEnable: false, endTime: 0});
}
return room;
}
GameServer.enterEmptyRoom = function(playerData)
......@@ -107,6 +126,8 @@ GameServer.startRoom = function(roomIdx)
{
let room = this.playingRoom[roomIdx];
room.currentPhase = this.Phase.START;
room.nextRank = room.currentPlayer.length;
room.aliveCount = room.currentPlayer.length;
room.maxTypingPlayer = room.currentPlayer[0];
room.minTypingPlayer = room.currentPlayer[0];
room.currentSocket.forEach(function(element)
......@@ -127,6 +148,39 @@ GameServer.startRoom = function(roomIdx)
this.announceToRoom(roomIdx, 'changePhase', this.Phase.START);
this.announceToRoom(roomIdx, 'startGame');
}
GameServer.playerDefeat = function(playerData)
{
playerData.playingData.isAlive = false;
playerData.playingData.rank = playerData.currentRoom.nextRank--;
playerData.isReceivable = false;
playerData.currentRoom.aliveCount--;
if (playerData.playingData.lastAttacks.length > 0)
{
playerData.playingData.lastAttack = playerData.playingData.lastAttacks[playerData.playingData.lastAttacks.length - 1];
if (Date.now() - playerData.playingData.lastAttack.time > 40000) playerData.playingData.lastAttack = null;
else
{
playerData.playingData.lastAttacks.forEach(function(element)
{
if (Date.now() - element.time < 40000 && element.wordGrade > playerData.playingData.lastAttack.wordGrade) playerData.playingData.lastAttack = element;
});
}
}
GameServer.announceToRoom(this.findRoomIndex(playerData.currentRoom.roomNum), 'defeat', playerData.playingData);
console.log('['+playerData.id+']'+ ' defeated, rank: ' + playerData.playingData.rank);
if (playerData.currentRoom.aliveCount === 1)
{
let winner = playerData.currentRoom.currentPlayer.find(function(element)
{
return element.isAlive;
});
GameServer.announceToRoom(this.findRoomIndex(playerData.currentRoom.roomNum), 'gameEnd', winner);
GameServer.announceToTarget(this.findRoomIndex(playerData.currentRoom.roomNum), winner.id, 'alert', 'gameWin');
console.log('['+winner.id+']' + ' winner! ' + winner.nickname);
}
}
GameServer.announceToRoom = function(roomIdx, _message, _data = null)
{
this.playingRoom[roomIdx].currentSocket.forEach(function(element)
......@@ -154,7 +208,10 @@ class Player
this.nickname = playerData.nickname;
this.isAlive = true;
this.rank = -1;
this.playerTyping = 0;
this.lastAttacks = []; // { attackerId, word, wordGrade, time }
this.lastAttack = null;
}
}
......
......@@ -2,18 +2,29 @@ var socket = io.connect();
// init account
socket.emit('idRequest');
socket.on('alert', function(msg) // string errorcode
{
let toAlert = 'null alert';
if (msg === 'errNicknameOverlaped') toAlert = '이미 사용중인 닉네임입니다.';
if (msg === 'gameWin') toAlert = '승리!';
alert(toAlert);
});
socket.on('setId', function(msg) // {str, num playerNum}
{
console.log(msg.str);
PlayerData.idNum = msg.num;
});
socket.on('errNicknameOverlaped', function()
{
alert('이미 사용중인 닉네임입니다.');
});
socket.on('enterRoom', function()
{
game.scene.remove('menuScene');
game.scene.start('roomScene');
});
socket.on('setCount', function(msg)
{
ScenesData.roomScene.isCounting = msg.isEnable;
ScenesData.roomScene.endTime = msg.endTime;
});
// init game
......@@ -25,7 +36,8 @@ socket.on('syncRoomData', function(msg) // {num roomNum, [] players}
RoomData.aliveCount = msg.players.length;
});
socket.on('startGame', function()
{
{
game.scene.remove('roomScene');
game.scene.start('gameScene');
});
......@@ -42,13 +54,29 @@ socket.on('setPlayerTypingRate', function(msg) // number playerTypingRate
});
socket.on('attacked', function(msg) // object attackData
{
WordSpace.generateWord.Attack(WordSpace.gameSceneForTest, msg.text, msg.grade, msg.attacker, msg.isStrong);
setTimeout(function()
{
WordSpace.generateWord.Attack(ScenesData.gameScene, msg.text, msg.grade, msg.attacker, msg.isStrong);
}, 4000);
});
socket.on('defeat', function(msg) // object player
{
RoomData.players[msg.index] = msg;
RoomData.aliveCount--;
console.log(RoomData.players[msg.index].nickname + ' defeated');
if (msg.lastAttack != null)
{
console.log(RoomData.players[msg.index].nickname + ' defeated by ' + msg.lastAttack.attacker + ', with ' + msg.lastAttack.word);
WordSpace.killLogForTest += ('\n' + msg.lastAttack.attacker + ' --' + msg.lastAttack.word + '-> ' + RoomData.players[msg.index].nickname);
}
else
{
console.log(RoomData.players[msg.index].nickname + ' defeated');
WordSpace.killLogForTest += ('\n--Suicide->' + RoomData.players[msg.index].nickname);
}
});
socket.on('gameEnd', function(msg) // object player
{
console.log(msg.nickname + ' Win!!!!!!');
});
socket.on('attackSucceed', function(msg)
......
var ScenesData = ScenesData || {};
var menuScene = new Phaser.Class(
{
Extends: Phaser.Scene,
......@@ -11,6 +13,7 @@ var menuScene = new Phaser.Class(
preload: function()
{
ScenesData.menuScene = this;
Input.inputField.loadImage(this);
BackGround.loadImage(this);
Audio.loadSound(this);
......@@ -24,6 +27,47 @@ var menuScene = new Phaser.Class(
}
});
var roomScene = new Phaser.Class(
{
Extends: Phaser.Scene,
initialize:
function roomScene ()
{
Phaser.Scene.call(this, {key: 'roomScene'});
},
preload: function()
{
ScenesData.roomScene = this;
},
create: function()
{
this.isCounting = false;
this.endTime = 0;
this.countText = this.add.text(640, 360, '사람들을 위해 대기중입니다...').setOrigin(0.5, 0.5).setColor('#000000');
},
update: function()
{
if (this.isCounting)
{
this.countText.setText((this.endTime - Date.now()) / 1000);
if (this.endTime - Date.now() < 0)
{
socket.emit('endCount');
this.isCounting = false;
}
}
else
{
this.countText.setText('사람들을 위해 대기중입니다...');
}
}
})
var gameScene = new Phaser.Class(
{
Extends: Phaser.Scene,
......@@ -37,6 +81,7 @@ var gameScene = new Phaser.Class(
preload: function()
{
ScenesData.gameScene = this;
BackGround.loadImage(this);
WordSpace.loadImage(this);
Input.inputField.loadImage(this);
......@@ -65,7 +110,7 @@ var gameScene = new Phaser.Class(
WordSpace.setPlayerTyping.initiate(this);
WordSpace.nameWordTextForTest = WordSpace.gameSceneForTest.add.text(50,400,'현재 가진 호패들 : 없음').setDepth(10).setColor('#000000');
WordSpace.nameWordTextForTest = ScenesData.gameScene.add.text(50,400,'현재 가진 호패들 : 없음').setDepth(10).setColor('#000000');
WordSpace.nameQueue.initiate();
RoomData.players.forEach(function(element)
{
......@@ -112,6 +157,7 @@ var gameScene = new Phaser.Class(
WordSpace.nameWordTextForTest.setText('현재 가진 호패들 : \n' + tempNames);
WordSpace.weightTextObjForTest.setText('뇌의 무게: (현재) '+WordSpace.totalWeight+' / '+ WordSpace.brainCapacity+' (전체)');
WordSpace.killLogTextForTest.setText(WordSpace.killLogForTest);
WordSpace.setPlayerTyping.add('');
}
});
\ No newline at end of file
......@@ -3,9 +3,10 @@ var WordSpace = WordSpace || {};
WordSpace.test = null;
// for test
WordSpace.gameSceneForTest = null;
WordSpace.weightTextObjForTest = null;
WordSpace.nameWordTextForTest = null;
WordSpace.killLogTextForTest = null;
WordSpace.killLogForTest = '';
WordSpace.nextWordCode = 0;
WordSpace.totalWeight = 0; //현재 단어 무게 총합
......@@ -73,7 +74,7 @@ WordSpace.gameOverCycle = new Cycle(gameOver);
//호패 생성 사이클
WordSpace.nameCycle = new Cycle(function()
{
WordSpace.generateWord.Name(WordSpace.gameSceneForTest, false, null);
WordSpace.generateWord.Name(ScenesData.gameScene, false, null);
});
//이건 뭐지
WordSpace.varAdjustCycle = new Cycle(function()
......@@ -147,8 +148,8 @@ WordSpace.AdjustVarByPhase = function(typingRate, phase)
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);
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.attackGauge =
......@@ -239,10 +240,8 @@ WordSpace.loadImage = function(scene)
scene.load.image('nameBgr' + i, 'assets/placeholder/name' + i + '.png');
}
WordSpace.gameSceneForTest = scene; // for test
WordSpace.weightTextObjForTest = scene.add.text(100, 75, '뇌의 무게: (현재) 0 / 100 (전체)').setDepth(10).setColor('#000000');
scene.load.image('test', 'assets/placeholder/attackalert1.png')
WordSpace.killLogTextForTest = scene.add.text(1100, 50, WordSpace.killLogForTest).setDepth(10).setColor('#000000').setAlign('right');
}
WordSpace.generateWord =
......@@ -302,7 +301,7 @@ WordSpace.setGameOverTimer = function()
if(this.brainCapacity < this.totalWeight && !this.isTimerOn)
{
this.isTimerOn = true;
WordSpace.gameOverCycle.resetCycle(WordSpace.gameSceneForTest, WordSpace.delay.GameOver, 0, false);
WordSpace.gameOverCycle.resetCycle(ScenesData.gameScene, WordSpace.delay.GameOver, 0, false);
}
}
......@@ -329,12 +328,12 @@ WordSpace.findWord = function(wordText)
if (weightest.wordWeight < element.wordWeight) weightest = element;
});
weightest.destroy();
WordSpace.nameCycle.resetCycle(WordSpace.gameSceneForTest, WordSpace.delay.NameSpawn, WordSpace.nameCycle.currentCycle.getElapsed() + WordSpace.NameSpawnReduce, true);
WordSpace.nameCycle.resetCycle(ScenesData.gameScene, WordSpace.delay.NameSpawn, WordSpace.nameCycle.currentCycle.getElapsed() + WordSpace.NameSpawnReduce, true);
while(WordSpace.totalWordNum < 5)
{
WordSpace.genWordByProb(WordSpace.gameSceneForTest);
WordSpace.wordCycle.resetCycle(WordSpace.gameSceneForTest, WordSpace.delay.WordSpawn, 0);
WordSpace.genWordByProb(ScenesData.gameScene);
WordSpace.wordCycle.resetCycle(ScenesData.gameScene, WordSpace.delay.WordSpawn, 0);
}
WordSpace.setPlayerTyping.add(wordText);
}
......@@ -417,10 +416,8 @@ WordSpace.attack = function(wordText, grade)
element.physicsObj.destroy();
element.wordObj.destroy();
});
//테스트용, 자기 자신에게 공격함
//WordSpace.generateWord.Attack(WordSpace.gameSceneForTest, wordText, grade, PlayerData, false);
WordSpace.generateWord.Name(WordSpace.gameSceneForTest, false, null);
WordSpace.generateWord.Name(WordSpace.gameSceneForTest, false, null);
WordSpace.generateWord.Name(ScenesData.gameScene, false, null);
WordSpace.generateWord.Name(ScenesData.gameScene, false, null);
WordSpace.nameGroup = [];
WordSpace.attackGauge.resetValue();
......
......@@ -14,7 +14,7 @@ var config = {
}
},
backgroundColor: Phaser.Display.Color.HexStringToColor('#F0CB85').color,//GetColor(245,208,138),
scene: [ menuScene, gameScene ]
scene: [ menuScene, roomScene, gameScene ]
};
var game = new Phaser.Game(config)
......
......@@ -46,7 +46,7 @@ io.on('connection', function(socket)
{
if (element.nickname === msg) isAlreadyHave = true;
});
if (isAlreadyHave) socket.emit('errNicknameOverlaped');
if (isAlreadyHave) socket.emit('alert' ,'errNicknameOverlaped');
else
{
socket.playerData.nickname = msg;
......@@ -72,19 +72,42 @@ io.on('connection', function(socket)
socket.emit('setPlayerTypingRate', playerTypingRate);
});
socket.on('endCount', function()
{
socket.playerData.currentRoom.aliveCount--;
if (socket.playerData.currentRoom.aliveCount === 0)
{
GameServer.startRoom(GameServer.findRoomIndex(socket.playerData.currentRoom.roomNum));
}
});
socket.on('attack', function(msg)
{
GameServer.announceToTarget(GameServer.findRoomIndex(msg.roomNum), msg.target, 'attacked', msg);
let target = GameServer.findPlayer(msg.target);
if (target != null)
{
let dataToPush =
{
attackerId: msg.attacker.idNum,
attacker: msg.attacker.nickname,
word: msg.text,
wordGrade: msg.grade,
time: Date.now()
}
if (target.playingData.lastAttacks.length < 5) target.playingData.lastAttacks.push(dataToPush);
else
{
target.playingData.lastAttacks.splice(0, 1);
target.playingData.lastAttacks.push(dataToPush);
}
}
});
socket.on('defeated', function()
{
socket.playerData.playingData.isAlive = false;
socket.playerData.playingData.rank = socket.playerData.currentRoom.nextRank--;
socket.playerData.isReceivable = false;
// 패배단어 체크
GameServer.announceToRoom(socket.playerData.currentRoom.roomNum, 'defeat', socket.playerData.playingData);
console.log('['+socket.playerData.id+']'+ ' defeated');
GameServer.playerDefeat(socket.playerData);
});
socket.on('defenseFailed', function(msg)
......@@ -95,7 +118,6 @@ io.on('connection', function(socket)
socket.on('disconnect', function(reason)
{
let data = socket.playerData;
console.log('['+ data.id +'] client disconnected, reason: ' + reason);
if (typeof data.id === undefined)
{
console.log('[ERROR] data.id is undefined');
......@@ -103,6 +125,7 @@ io.on('connection', function(socket)
}
else // data.id is not undefined
{
console.log('['+ data.id +'] client disconnected, reason: ' + reason);
let idxToDel = GameServer.currentPlayer.findIndex(function(element)
{
return element.id === data.id;
......@@ -118,13 +141,11 @@ io.on('connection', function(socket)
data.currentRoom.currentPlayer[data.playingData.index] = null;
data.currentRoom.currentSocket[data.playingData.index] = null;
}
else
else if (data.playingData.isAlive)
{
data.playingData.isAlive = false;
if (data.playingData.rank === -1) data.playingData.rank = data.currentRoom.nextRank--;
data.currentRoom.currentSocket[data.playingData.index].isReceivable = false;
GameServer.announceToRoom(GameServer.findRoomIndex(data.currentRoom.roomNum), 'userDisconnect', data.playingData);
GameServer.playerDefeat(socket.playerData);
}
GameServer.announceToRoom(GameServer.findRoomIndex(data.currentRoom.roomNum), 'userDisconnect', data.playingData);
}
}
console.log('['+ data.id +'] disconnect complete');
......
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