Π‘Π΅ΡΠ²Π΅Ρ Π½Π° node.js Π΄Π»Ρ ΠΏΠΎΡΠ°Π³ΠΎΠ²ΡΡ ΠΈΠ³Ρ.
npm install v6-game-server
var Server = require('v6-game-server',
// Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ
conf = {},
// ΠΈΠ³ΡΠΎΠ²ΠΎΠΉ Π΄Π²ΠΈΠΆΠΎΠΊ
engine = {},
// ΡΠ΅ΡΠ²Π΅Ρ
server = new Server(conf, engine);
server.start();
ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ° Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ
{
game: 'default', // ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ, Π°Π»ΠΈΠ°Ρ ΠΈΠ³ΡΡ ΠΈ Π±Π΄
port: 8080, // ΠΏΠΎΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π²Π΅Π± ΡΠΎΠΊΠ΅ΡΠ°
pingTimeout:100000, // ΡΠ°ΠΉΠΌΠ°ΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π² ΠΌΡ
pingInterval:10000, // ΠΈΠ½ΡΠ΅ΡΠ²Π°Π» ΠΏΠΈΠ½Π³Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ° Π² ΠΌΡ
closeOldConnection: true, // Π·Π°ΠΊΡΡΠ²Π°ΡΡ ΡΡΠ°ΡΠΎΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, ΠΏΡΠΈ ΠΎΡΠΊΡΡΡΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ
loseOnLeave: false, // Π·Π°ΡΡΠΈΡΡΠ²Π°ΡΡ ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡΠΈ ΡΠ°Π·ΡΡΠ²Π΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ
reconnectOldGame: true, // Π·Π°Π³ΡΡΠΆΠ°ΡΡ ΠΈΠ³ΡΡ ΠΊΠ»ΠΈΠ½Π΅ΡΠ°, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΡΠΎΠΈΠ·ΠΎΡΠ΅Π» ΡΠ°Π·ΡΡΠ²
spectateEnable: true, // ΡΠ°Π·ΡΠ΅ΡΠΈΡΡ ΠΏΡΠΎΡΠΌΠΎΡΡ ΠΈΠ³Ρ
logLevel:3, // ΡΡΠΎΠ²Π΅Π½Ρ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ Π»ΠΎΠ³Π°, 0 - Π±Π΅Π· Π»ΠΎΠ³Π°, 1 - ΡΠΎΠ»ΡΠΊΠΎ ΠΎΡΠΈΠ±ΠΊΠΈ
turnTime: 100, // Π²ΡΠ΅ΠΌΡ Π½Π° Ρ
ΠΎΠ΄ ΠΈΠ³ΡΠΎΠΊΠ° Π² ΡΠ΅ΠΊΡΠ½Π΄Π°Ρ
timeMode: 'reset_every_switch', // ΡΠ΅ΠΆΠΈΠΌΡ ΡΠ°ΠΉΠΌΠ΅ΡΠ°:
// 'reset_every_turn' ΡΠ±ΡΠ°ΡΡΠ²Π°ΡΡ ΠΏΠΎΡΠ»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ
ΠΎΠ΄Π°
// 'reset_every_switch' ΡΠ±ΡΠ°ΡΡΠ²Π°ΡΡ ΠΏΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄Π° Ρ
ΠΎΠ΄Π°
// 'dont_reset' Π½Π΅ ΡΠ±ΡΠ°ΡΡΠ²Π°ΡΡ ΡΠ°ΠΉΠΌΠ΅Ρ, Π²ΡΠ΅ΠΌΡ Π½Π° Π²ΡΡ ΠΏΠ°ΡΡΠΈΡ
// 'common' Ρ ΠΈΠ³ΡΠΎΠΊΠΎΠ² ΠΎΠ±ΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ Π½Π° Ρ
ΠΎΠ΄
timeStartMode: 'after_switch', // ΠΊΠΎΠ³Π΄Π° Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΡΠ°ΠΉΠΌΠ΅Ρ
// 'after_turn' ΠΏΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Ρ
ΠΎΠ΄Π°
// 'after_switch' ΠΏΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄Π° Ρ
ΠΎΠ΄Π°
// 'after_round_start' ΡΡΠ°Π·Ρ ΠΏΠΎΡΠ»Π΅ Π½Π°ΡΠ°Π»Π° ΡΠ°ΡΠ½Π΄Π°
addTime: 0, // ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠΈΠ»ΠΈΡΠ΅ΠΊΡΠ½Π΄ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΠΊ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π½Π° Ρ
ΠΎΠ΄ ΠΈΠ³ΡΠΎΠΊΠ° ΠΏΠΎΡΠ»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π΅Π³ΠΎ Ρ
ΠΎΠ΄Π°
maxTimeouts: 1, // ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Π½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ ΠΏΡΠΎΠΏΡΡΠΊΠΎΠ² Ρ
ΠΎΠ΄Π° ΠΈΠ³ΡΠΎΠΊΠ° ΠΏΠΎΠ΄ΡΡΠ΄ Π΄ΠΎ ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΡ
clearTimeouts: true, // ΠΎΠ±Π½ΡΠ»ΡΡΡ ΡΠΈΡΠ»ΠΎ ΠΏΡΠΎΠΏΡΡΠΊΠΎΠ² ΠΈΠ³ΡΠΎΠΊΠ° ΠΏΠΎΡΠ»Π΅ Π΅Π³ΠΎ Ρ
ΠΎΠ΄Π°
maxOfflineTimeouts: 1, // ΡΠΈΡΠ»ΠΎ ΠΏΡΠΎΠΏΡΡΠΊΠΎΠ² ΠΎΡΠΊΠ»ΡΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠ³ΡΠΎΠΊΠ° ΠΏΠΎΠ΄ΡΡΠ΄ Π΄ΠΎ ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΡ
minTurns: 0, // ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ ΡΠΈΡΠ»ΠΎ Ρ
ΠΎΠ΄ΠΎΠ² (ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΎΠ² Ρ
ΠΎΠ΄Π°) Π΄Π»Ρ ΡΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΡ ΠΈΠ³ΡΡ
takeBacks: 0, // ΡΠΈΡΠ»ΠΎ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Π½ΡΡ
ΠΈΠ³ΡΠΎΠΊΡ Ρ
ΠΎΠ΄ΠΎΠ² Π½Π°Π·Π°Π΄
loadRanksInRating: false, // Π·Π°Π³ΡΡΠΆΠ°ΡΡ Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΠ°Π½Π³ΠΈ ΠΏΡΠΈ ΠΎΡΠΊΡΡΡΠΈΠΈ ΡΠ°Π±Π»ΠΈΡΡ ΡΠ΅ΠΉΡΠΈΠ½Π³Π°
ratingUpdateInterval: 1000, // ΠΈΠ½ΡΠ΅ΡΠ²Π°Π» ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΡΠ°Π½Π³ΠΎΠ² Π² ΡΠΏΠΈΡΠΊΠ΅ ΠΈΠ³ΡΠΎΠΊΠΎΠ²
penalties: false, // Π·Π°Π³ΡΡΠΆΠ°ΡΡ ΡΡΠ°ΡΡΡ ΠΈΠ³ΡΠΎΠΊΠΎΠ²
mode: 'debug', // Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 'develop' ΡΡΡΠ°Π²Π½ΠΎΠ²ΠΈΡ ΡΠ΅ΠΆΠΈΠΌ Π±Π΅Π· ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π±Π΄
gameModes: ['default'], // ΠΈΠ³ΡΠΎΠ²ΡΠ΅ ΡΠ΅ΠΆΠΈΠΌΡ, ΡΠΎ ΡΠ²ΠΎΠΈΠΌ ΡΠ΅ΠΉΡΠΈΠ½Π³ΠΎΠΌ ΠΈ ΠΈΡΡΠΎΡΠΈΠ΅ΠΉ, ΠΈΠΌΠ΅Π½Π° Π±Π΅Π· ΠΏΡΠΎΠ±Π΅Π»ΠΎΠ²
modesAlias:{default:'default'}, // ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌΡΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΡ Π°Π»ΠΈΠ°ΡΡ ΡΠ΅ΠΆΠΈΠΌΠΎΠ²
enableIpGames: false, // ΡΠ°Π·ΡΠ΅ΡΠ°Π΅Ρ ΠΈΠ³ΡΡ Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ip
minUnfocusedTurns: 0, // ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ Ρ
ΠΎΠ΄ΠΎΠ² Ρ ΠΏΠΎΡΠ΅ΡΠ΅ΠΉ ΡΠΎΠΊΡΡΠ° Π΄Π»Ρ Π·Π°ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ ΠΏΠΎΠ±Π΅Π΄Ρ ΠΊΠ°ΠΊ ΡΠΈΡΠ΅ΡΡΠΊΠΎΠΉ
// 0 - Π½Π΅ ΡΡΠΈΡΠ°ΡΡ
minPerUnfocusedTurns: 0.9, // ΡΠΎΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ ΡΠΈΡΠ»Π° Ρ
ΠΎΠ΄ΠΎΠ² Ρ ΠΏΠΎΡΠ΅ΡΠ΅ΠΉ ΡΠΎΠΊΡΡΠ° Π΄Π»Ρ Π·Π°ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ ΠΏΠΎΠ±Π΅Π΄Ρ ΠΊΠ°ΠΊ ΡΠΈΡΠ΅ΡΡΠΊΠΎΠΉ
adminList: [], // ΡΠΏΠΈΡΠΎΠΊ userId Π°Π΄ΠΌΠΈΠ½ΠΎΠ²
adminPass: '', // ΠΏΠ°ΡΠΎΠ»Ρ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΉ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠ°
mongo:{ // Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ mongodb
host: '127.0.0.1',
port: '27017'
},
redis:{ // Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ redis
host: '127.0.0.1',
port: '6379'
},
https: true, // Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ https
httpsKey: '/path../serv.key',
httpsCert: '/path../serv.crt',
httpsCa: ['/path../sub.class1.server.ca.pem', '/path../ca.pem'],
}
ΠΡΠΈΠΌΠ΅ΡΡ Π½Π°ΡΡΡΠΎΠ΅ΠΊ:
- ΠΎΠ±ΡΡΠ½Π°Ρ ΠΈΠ³ΡΠ°, Π²ΡΠ΅ΠΌΡ Π½Π° Ρ
ΠΎΠ΄ 30 ΡΠ΅ΠΊΡΠ½Π΄, ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΎΠΏΡΡΠΊ Ρ
ΠΎΠ΄Π°,
Π²ΡΠ΅ΠΌΡ ΠΈΠ³ΡΠΎΠΊΠ° ΠΎΠ±Π½ΡΠ»ΡΠ΅ΡΡΡ ΠΏΠΎΡΠ»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ
ΠΎΠ΄Π°, ΡΠ°ΠΉΠΌΠ΅Ρ ΡΡΠ°ΡΡΡΠ΅Ρ ΠΏΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Ρ
ΠΎΠ΄Π°
{
turnTime: 30,
maxTimeouts: 2,
timeMode: 'reset_every_turn',
timeStartMode: 'after_turn',
}
- Π±Π»ΠΈΡ, Π²ΡΠ΅ΠΌΡ Π½Π° ΠΏΠ°ΡΡΠΈΡ 60 ΡΠ΅ΠΊΡΠ½Π΄, Π²ΡΠ΅ΠΌΡ ΠΈΠ³ΡΠΎΠΊΠ° Π½Π΅ ΠΎΠ±Π½ΡΠ»ΡΠ΅ΡΡΡ,
ΠΏΠΎΡΠ»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π΅Π³ΠΎ Ρ
ΠΎΠ΄Π° ΠΊ Π΅Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π½Π° Ρ
ΠΎΠ΄ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΡΡΡ 1 ΡΠ΅ΠΊΡΠ½Π΄Π°,
ΡΠ°ΠΉΠΌΠ΅Ρ ΡΡΠ°ΡΡΡΠ΅Ρ ΠΏΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄Π° Ρ
ΠΎΠ΄Π° ΠΊ Π΄ΡΡΠ³ΠΎΠΌΡ ΠΈΠ³ΡΠΎΠΊΡ,
ΠΏΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΠΏΡΠΎΠΏΡΡΠΊΠ° Ρ
ΠΎΠ΄Π° Π΅ΠΌΡ Π·Π°ΡΡΠΈΡΡΠ²Π°Π΅ΡΡΡ ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
{
turnTime: 60,
maxTimeouts: 1,
timeMode: 'dont_reset',
timeStartMode: 'after_switch',
addTime: 1000
}
- ΠΈΠ³ΡΠ° Ρ ΠΎΠ±ΡΠΈΠΌ Π²ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ Π½Π° Ρ
ΠΎΠ΄, ΠΏΠΎ ΡΠΈΠΏΡ "ΠΊΡΠΎ Π±ΡΡΡΡΠ΅Π΅",
ΡΠ°ΠΉΠΌΠ΅Ρ ΡΡΡΠ°ΡΡΡΠ΅Ρ ΡΡΠ°Π·Ρ ΠΏΠΎΡΠ»Π΅ Π½Π°ΡΠ°Π»Π° ΡΠ°ΡΠ½Π΄Π°,
ΠΏΠΎ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΠΈ ΡΠ°ΡΠ° ΡΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΡΠ°ΠΉΠΌΠ°ΡΡ ΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΅ΡΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΈΠ³ΡΡ
{
turnTime: 3600,
maxTimeouts: 2,
timeMode: 'common',
timeStartMode: 'after_round_start',
}
ΠΠ΅ΡΠΎΠ΄Ρ ΠΈΠ³ΡΠΎΠ²ΠΎΠ³ΠΎ Π΄Π²ΠΈΠΆΠΊΠ°
{
/**
* Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π² ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ°Π·
* ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ
* ΡΠ΅ΠΉΡΠΈΠ½Π³ΠΈ, ΠΎΡΠΊΠΈ, ΠΈ Ρ.Π΄.
*/
initUserData: function(mode, modeData){
return modeData;
},
/**
* Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΠ΅ΡΠ΅Π΄ Π½Π°ΡΠ°Π»ΠΎΠΌ ΠΈΠ³ΡΠΎΠ²ΠΎΠ³ΠΎ ΡΠ°ΡΠ½Π΄Π°
* Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π½ Π²ΡΠ΅ΠΌ ΠΈΠ³ΡΠΎΠΊΠ°ΠΌ Π² Π½Π°ΡΠ°Π»Π΅ ΡΠ°ΡΠ½Π΄Π°
* ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΠΉ ΠΈΠ³ΡΠΎΠΊΠΎΠΌ Π² ΠΏΡΠΈΠ³Π»Π°ΡΠ΅Π½ΠΈΠΈ
*/
initGame: function (room) {
return {
inviteData: room.inviteData
}
},
/**
* Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π² Π½Π°ΡΠ°Π»Π΅ ΡΠ°ΡΠ½Π΄Π°
* Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΈΠ³ΡΠΎΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ Ρ
ΠΎΠ΄ΠΈΡΡ ΠΏΠ΅ΡΠ²ΡΠΌ
* ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΏΠ΅ΡΠ²ΡΠΌ Ρ
ΠΎΠ΄ΠΈΡ ΡΠΎΠ·Π΄Π°ΡΠ΅Π»Ρ ΠΊΠΎΠΌΠ½Π°ΡΡ,
* Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΡΠ°ΡΠ½Π΄Π΅ Ρ
ΠΎΠ΄ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΡ ΠΊ Π΄ΡΡΠ³ΠΎΠΌΡ ΠΈΠ³ΡΠΎΠΊΡ
*/
setFirst: function (room) {
if (!room.game.first) return room.owner;
return room.getOpponent(room.game.first)
},
/**
* Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ Ρ
ΠΎΠ΄ ΠΈΠ»ΠΈ ΠΏΡΠΎΠΏΡΡΠΊ Ρ
ΠΎΠ΄Π° ΠΈΠ³ΡΠΎΠΊΠ°
* Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π½ Π²ΡΠ΅ΠΌ ΠΈΠ³ΡΠΎΠΊΠ°ΠΌ ΠΈ Π·Π°ΠΏΠΈΡΠ°Π½ Π² ΠΈΡΡΠΎΡΠΈΡ
* Π΅ΡΠ»ΠΈ Π²Π΅ΡΠ½ΡΡΡ false || null || undefined Ρ
ΠΎΠ΄ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΈΠ·Π½Π°Π½ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠΌ
* Π² ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠΎΠΏΡΡΠΊΠ° Ρ
ΠΎΠ΄Π°, turn = {action: 'timeout'}
* Π΅ΡΠ»ΠΈ Π²Π΅ΡΠ½ΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ Ρ ΠΏΠΎΠ»Π΅ΠΌ action = 'timeout'
* ΠΎΠ½ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΈΠ½ΡΡ ΠΊΠ°ΠΊ ΡΠΎΠ±ΡΡΠΈΠ΅ ΠΏΡΠΎΠΏΡΡΠΊ Ρ
ΠΎΠ΄Π°, ΠΈΠ½Π°ΡΠ΅ ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΡΠΉ Ρ
ΠΎΠ΄
* type {'turn'|'timeout'} - Ρ
ΠΎΠ΄ ΠΈΠ³ΡΠΎΠΊΠ° ΠΈΠ»ΠΈ ΡΠ°ΠΉΠΌΠ°ΡΡ
*/
doTurn: function(room, user, turn, type){
if (type == 'timeout'){
// this is user timeout
}
return turn;
},
/**
* Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ Ρ
ΠΎΠ΄ ΠΈΠ³ΡΠΎΠΊΠ° ΠΈΠ»ΠΈ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ±ΡΡΠΈΡ ΠΏΡΠΎΠΏΡΡΠΊΠ° Ρ
ΠΎΠ΄Π°
* Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠΉ ΠΈΠ³ΡΠΎΠΊ Π±ΡΠ΄Π΅Ρ Ρ
ΠΎΠ΄ΠΈΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ
* Π΅ΡΠ»ΠΈ Π²Π΅ΡΠ½ΡΡΡ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΠΈΠ³ΡΠΎΠΊΠ°, ΡΠ΅ΠΉ Π±ΡΠ» Ρ
ΠΎΠ΄, Ρ
ΠΎΠ΄ ΠΎΡΡΠ°Π½Π΅ΡΡΡ Π·Π° Π½ΠΈΠΌ
* type {'turn'|'timeout'} - Ρ
ΠΎΠ΄ ΠΈΠ³ΡΠΎΠΊΠ° ΠΈΠ»ΠΈ ΡΠ°ΠΉΠΌΠ°ΡΡ
*/
switchPlayer: function(room, user, turn, type){
if (type == 'timeout'){
// this is user timeout
}
return room.getOpponent(user);
},
/**
* Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΠΎΡΠ»Π΅ ΠΎΡΠΏΡΠ°Π²ΠΊΠ΅ ΠΈΠ³ΡΠΎΠΊΠΎΠΌ ΡΠΎΠ±ΡΡΠΈΡ
* Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π½ Π·Π°Π΄Π°Π½Π½ΡΠΌ ΠΈΠ³ΡΠΎΠΊΠ°ΠΌ, ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ Π²ΠΈΠ΄Π°:
* { event, target, user } || [Array], Π³Π΄Π΅
* event - ΠΎΠ±ΡΠ΅ΠΊΡ Ρ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΌ ΠΏΠΎΠ»Π΅ΠΌ type
* target - ΡΠ΅Π»Ρ Π΄Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΡΠΎΠ±ΡΡΠΈΡ null || Room || User
* ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠΌ Ρ ΡΠ°Π·Π½ΡΠΌΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ ΡΠΎΠ±ΡΡΠΈΠΉ ΠΈ ΡΠ΅Π»ΡΠΌΠΈ
*/
userEvent: function(room, user, event){
return {
event: event,
target: room,
user: user.userId
}
},
/**
* Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Π² Π½Π°ΡΠ°Π»Π΅ ΡΠ°ΡΠ½Π΄Π° ΠΈ ΠΏΠΎΡΠ»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ
ΠΎΠ΄Π° ΠΈΠ³ΡΠΎΠΊΠ°
* Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π½ Π·Π°Π΄Π°Π½Π½ΡΠΌ ΠΈΠ³ΡΠΎΠΊΠ°ΠΌ, ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ Π²ΠΈΠ΄Π°:
* { event, target, user } || [Array], Π³Π΄Π΅
* event - ΠΎΠ±ΡΠ΅ΠΊΡ Ρ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΌ ΠΏΠΎΠ»Π΅ΠΌ type
* target - ΡΠ΅Π»Ρ Π΄Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΡΠΎΠ±ΡΡΠΈΡ null || Room || User
* ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠΌ Ρ ΡΠ°Π·Π½ΡΠΌΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ ΡΠΎΠ±ΡΡΠΈΠΉ ΠΈ ΡΠ΅Π»ΡΠΌΠΈ
*/
gameEvent: function(room, user, turn, roundStart){
return null;
},
/**
* Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ Ρ
ΠΎΠ΄ ΠΈ ΡΠΎΠ±ΡΡΠΈΠ΅, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΠ΅ ΡΠ°ΡΠ½Π΄Π°
* Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π½ Π²ΡΠ΅ΠΌ ΠΈΠ³ΡΠΎΠΊΠ°ΠΌ
* ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π²ΠΈΠ΄Π° {winner : user}, Π³Π΄Π΅
* user - User (ΠΈΠ³ΡΠΎΠΊ ΠΏΠΎΠ±Π΅Π΄ΠΈΡΠ΅Π»Ρ ) || null (Π½ΠΈΡΡΡ)
* Π΅ΡΠ»ΠΈ Π²Π΅ΡΠ½ΡΡΡ false - ΡΠ°ΡΠ½Π΄ Π΅ΡΠ΅ Π½Π΅ ΠΎΠΊΠΎΠ½ΡΠ΅Π½
* Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ 'action' ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ Π½Π° Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅,
* ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΌΡ Π·Π°Π²Π΅ΡΡΠΈΠ»Π°ΡΡ ΠΈΠ³ΡΠ°, ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ 'game_over'
* Π΅ΡΠ»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π½Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½, ΡΠΎ ΠΈΠ³ΡΠ° Π·Π°Π²Π΅ΡΠΈΡΡΡ ΠΏΠΎ
* ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΌΡ ΡΠΈΡΠ»Ρ ΠΎΡΠ»Π°ΠΉΠ½ ΡΠ°ΠΉΠΌΠ°ΡΡΠΎΠ²
* Π΅ΡΠ»ΠΈ Π½Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½Ρ ΠΎΠ±Π°, Π·Π°Π²Π΅ΡΡΠΈΡΡΡ ΠΏΠΎΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΡΠΎΠΏΡΡΡΠΈΠ²ΡΠ΅Π³ΠΎ
* Π΅ΡΠ»ΠΈ Π½Π΅ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΏΡΠΎΠΏΡΡΠΊΠ°ΡΡ Ρ
ΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΠΎ
* type {'turn'|'event','timeout'} - Ρ
ΠΎΠ΄, ΡΠΎΠ±ΡΡΠΈΠ΅ ΠΈΠ»ΠΈ ΡΠ°ΠΉΠΌΠ°ΡΡ
*/
getGameResult: function(room, user, turn, type){
switch (type){
case 'timeout':
if (type == 'timeout'){
// if user have max timeouts, other win
if (room.data[user.userId].timeouts == room.maxTimeouts){
return {
winner: room.getOpponent(user),
action: 'timeout'
};
} else return false;
}
break;
case 'event':
if (turn.type){
return false;
}
break;
case 'turn':
switch (turn.result){
case 0: // win other player
return {
winner: room.getOpponent(user)
};
break;
case 1: // win current player
return {
winner: user
};
break;
case 2: // draw
return {
winner: null
};
break;
default: // game isn't end
return false;
}
break;
}
},
/**
* Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΠΎ ΠΎΠΊΠΎΠ½ΡΠ°Π½ΠΈΡ ΡΠ°ΡΠ½Π΄Π°
* Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΎΡΠΊΠΎΠ² ΠΈΠ³ΡΠΎΠΊΠΎΠ²
* room.players[0][room.mode].['score'] = new_score
*/
getUsersScores: function(room, result){
// Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ
for (var i = 0; i < room.players.length; i++){
if (room.players[i] == result.winner)
room.players[i][room.mode].score += 10;
else room.players[i][room.mode].score -= 10;
}
return result;
},
/**
* Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΠΎΡΠ»Π΅ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ
* ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΠΏΠΎΠ΄Π»ΠΈΠ½Π½ΠΎΡΡ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ
*/
checkSign: function(user){
return (user.userId && user.userName && user.sign);
}
/**
* Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΏΠΎ Π²ΡΠ·ΠΎΠ²Ρ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠ°
* @param admin
* @param type
* @param data
*/
adminAction: function(admin, type, data){
}
};
Room
{
owner: User, // ΡΠΎΠ·Π΄Π°ΡΠ΅Π»Ρ
players: Array, // ΠΌΠ°ΡΡΠΈΠ² Ρ ΠΈΠ³ΡΠΎΠΊΠ°ΠΌΠΈ
spectators: Array, // ΠΌΠ°ΡΡΠΈΠ² Π·ΡΠΈΡΠ΅Π»Π΅ΠΉ
inviteData: Object // ΠΎΠ±ΡΠ΅ΠΊΡ ΠΏΡΠΈΠ³Π»Π°ΡΠ΅Π½ΠΈΡ
mode: String // ΡΠ΅ΠΆΠΈΠΌ
games: Int; // ΡΡΠ³ΡΠ°Π½ΠΎ ΡΠ°ΡΠ½Π΄ΠΎΠ²
turnTime: Int; // Π²ΡΠ΅ΠΌΡ Π½Π° Ρ
ΠΎΠ΄
game: {
state: String // ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΈΠ³ΡΡ: waiting, playing, end
current: User, // ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΈΠ³ΡΠΎΠΊ
first: User, // ΠΈΠ³ΡΠΎΠΊ, ΡΠ΅ΠΉ Ρ
ΠΎΠ΄ ΠΏΠ΅ΡΠ²ΡΠΉ, ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ engine.setFirst
history: Array, // ΠΌΠ°ΡΡΠΈΠ² Ρ ΠΈΡΠΎΡΠΈΠ΅ΠΉ Ρ
ΠΎΠ΄ΠΎΠ² ΠΈ ΡΠΎΠ±ΡΡΠΈΠΉ
shistory: String// ΠΌΠ°ΡΡΠΈΠ² Ρ ΠΈΡΡΠΎΡΠΈΠ΅ΠΉ, ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½Π½ΡΠΉ Π² ΡΡΡΠΎΠΊΡ
turnStartTime: UTC // Π΄Π°ΡΠ° Π½Π°ΡΠ°Π»Π° Ρ
ΠΎΠ΄Π° ΠΈΠ³ΡΠΎΠΊΠ°
},
data: Object, // ΠΌΠ°ΡΡΠΈΠ² ΠΊΠ»ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π³Π΄Π΅ ΠΊΠ»ΡΡΠΈ - userId
// Π΄Π»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ³ΡΠΎΠΊΠ°
getOpponent: Function(user: User) // Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΎΠΏΠ΅ΡΠ½ΠΈΠΊΠ° ΠΈΠ³ΡΠΎΠΊΠ°
setUserTurnTime: Function(time: ms) // ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π²ΡΠ΅ΠΌΡ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Ρ
ΠΎΠ΄
}
User
{
userId: String, // ΠΈΠ΄Π΅ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΈΠ³ΡΠΎΠΊΠ°
userName: String // ΠΈΠΌΡ
sign: String // ΠΏΠΎΠ΄ΠΏΠΈΡΡ
currentRoom: Room // ΡΠ΅ΠΊΡΡΠ°Ρ ΠΊΠΎΠΌΠ½Π°ΡΠ° (ΠΈΠ³ΡΠ°Π΅Ρ ΠΈΠ»ΠΈ Π·ΡΠΈΡΠ΅Π»Ρ)
}