Skip to content

levserk/v6-game-server

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

10 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

V6-Game-Server

Π‘Π΅Ρ€Π²Π΅Ρ€ Π½Π° 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	// тСкущая ΠΊΠΎΠΌΠ½Π°Ρ‚Π° (ΠΈΠ³Ρ€Π°Π΅Ρ‚ ΠΈΠ»ΠΈ Π·Ρ€ΠΈΡ‚Π΅Π»ΡŒ)
	}

About

nodejs game server

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published