0.12.381 • Published 2 years ago

v6-game-server v0.12.381

Weekly downloads
3,240
License
-
Repository
github
Last release
2 years ago

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;
		},
		
		/**
         * вызывается после отмены хода, для изменения игрового 
         * состояния в комнате
         */
        doTakeBack: function(room, user){
            return null;
        },

		/**
		 * вызывается после авторизации пользователя
		 * проверяет подлинноть подписи
		 */
		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	// текущая комната (играет или зритель)
	}
0.12.381

2 years ago

0.12.380

2 years ago

0.12.378

2 years ago

0.12.377

2 years ago

0.12.379

2 years ago

0.12.376

2 years ago

0.12.375

2 years ago

0.12.374

2 years ago

0.12.373

2 years ago

0.12.370

2 years ago

0.12.372

2 years ago

0.12.371

2 years ago

0.12.369

2 years ago

0.12.367

2 years ago

0.12.366

2 years ago

0.12.368

2 years ago

0.12.365

2 years ago

0.12.364

2 years ago

0.12.363

2 years ago

0.12.362

2 years ago

0.12.361

2 years ago

0.12.360

2 years ago

0.12.359

3 years ago

0.12.356

3 years ago

0.12.355

3 years ago

0.12.358

3 years ago

0.12.357

3 years ago

0.12.352

3 years ago

0.12.351

3 years ago

0.12.354

3 years ago

0.12.353

3 years ago

0.12.350

3 years ago

0.12.347

3 years ago

0.12.346

3 years ago

0.12.349

3 years ago

0.12.348

3 years ago

0.12.34

3 years ago

0.12.345

3 years ago

0.12.33

3 years ago

0.12.32

3 years ago

0.12.30

3 years ago

0.12.31

3 years ago

0.12.29

3 years ago

0.12.28

3 years ago

0.12.16

3 years ago

0.12.17

3 years ago

0.12.18

3 years ago

0.12.19

3 years ago

0.12.15

3 years ago

0.12.20

3 years ago

0.12.21

3 years ago

0.12.22

3 years ago

0.12.27

3 years ago

0.12.23

3 years ago

0.12.24

3 years ago

0.12.25

3 years ago

0.12.26

3 years ago

0.12.14

3 years ago

0.12.10

3 years ago

0.12.11

3 years ago

0.12.12

3 years ago

0.12.13

3 years ago

0.12.8

3 years ago

0.12.9

3 years ago

0.12.7

3 years ago

0.12.0

3 years ago

0.12.1

3 years ago

0.12.2

3 years ago

0.12.3

3 years ago

0.12.4

3 years ago

0.12.5

3 years ago

0.12.6

3 years ago

0.11.348

3 years ago

0.11.349

3 years ago

0.11.351

3 years ago

0.11.350

3 years ago

0.11.352

3 years ago

0.11.326

3 years ago

0.11.329

3 years ago

0.11.328

3 years ago

0.11.327

3 years ago

0.11.333

3 years ago

0.11.332

3 years ago

0.11.331

3 years ago

0.11.330

3 years ago

0.11.337

3 years ago

0.11.336

3 years ago

0.11.334

3 years ago

0.11.339

3 years ago

0.11.338

3 years ago

0.11.340

3 years ago

0.11.344

3 years ago

0.11.343

3 years ago

0.11.342

3 years ago

0.11.341

3 years ago

0.11.347

3 years ago

0.11.346

3 years ago

0.11.345

3 years ago

0.11.325

3 years ago

0.11.324

3 years ago

0.11.323

3 years ago

0.11.322

3 years ago

0.11.321

3 years ago

0.11.315

3 years ago

0.11.314

3 years ago

0.11.319

3 years ago

0.11.318

3 years ago

0.11.317

3 years ago

0.11.316

3 years ago

0.11.320

3 years ago

0.11.313

3 years ago

0.11.312

3 years ago

0.11.311

3 years ago

0.11.308

3 years ago

0.11.309

3 years ago

0.11.310

3 years ago

0.11.307

3 years ago

0.11.306

3 years ago

0.11.305

3 years ago

0.11.304

3 years ago

0.11.303

3 years ago

0.11.302

3 years ago

0.11.300

3 years ago

0.11.301

3 years ago

0.11.299

3 years ago

0.11.298

3 years ago

0.11.297

3 years ago

0.11.292

3 years ago

0.11.296

3 years ago

0.11.295

3 years ago

0.11.294

3 years ago

0.11.293

3 years ago

0.11.291

4 years ago

0.11.290

4 years ago

0.11.289

4 years ago

0.11.288

4 years ago

0.11.287

4 years ago

0.11.285

4 years ago

0.11.286

4 years ago

0.11.284

4 years ago

0.11.283

4 years ago

0.11.282

4 years ago

0.11.281

4 years ago

0.11.280

4 years ago

0.11.278

4 years ago

0.11.277

4 years ago

0.11.279

4 years ago

0.11.274

4 years ago

0.11.276

4 years ago

0.11.275

4 years ago

0.11.273

4 years ago

0.11.272

4 years ago

0.11.270

4 years ago

0.11.271

4 years ago

0.11.269

4 years ago

0.11.268

4 years ago

0.11.267

4 years ago

0.11.266

4 years ago

0.11.265

4 years ago

0.11.264

4 years ago

0.11.263

4 years ago

0.11.262

4 years ago

0.11.261

4 years ago

0.11.260

4 years ago

0.11.259

4 years ago

0.11.258

4 years ago

0.11.257

4 years ago

0.11.256

4 years ago

0.11.255

4 years ago

0.11.254

4 years ago

0.11.253

4 years ago

0.11.252

4 years ago

0.11.251

4 years ago

0.11.250

4 years ago

0.11.249

4 years ago

0.11.248

4 years ago

0.11.247

4 years ago

0.11.246

4 years ago

0.11.245

4 years ago

0.11.239

4 years ago

0.11.241

4 years ago

0.11.240

4 years ago

0.11.244

4 years ago

0.11.243

4 years ago

0.11.238

4 years ago

0.11.237

4 years ago

0.11.236

4 years ago

0.11.235

4 years ago

0.11.233

4 years ago

0.11.232

4 years ago

0.11.231

4 years ago

0.11.229

4 years ago

0.11.228

4 years ago

0.11.227

4 years ago

0.11.226

4 years ago

0.11.225

4 years ago

0.11.224

4 years ago

0.11.223

4 years ago

0.11.222

4 years ago

0.11.221

4 years ago

0.11.220

4 years ago

0.11.219

4 years ago

0.11.209

4 years ago

0.11.208

4 years ago

0.11.207

4 years ago

0.11.212

4 years ago

0.11.211

4 years ago

0.11.210

4 years ago

0.11.216

4 years ago

0.11.215

4 years ago

0.11.214

4 years ago

0.11.213

4 years ago

0.11.218

4 years ago

0.11.217

4 years ago

0.11.206

4 years ago

0.11.205

4 years ago

0.11.204

4 years ago

0.11.203

4 years ago

0.11.202

4 years ago

0.11.201

4 years ago

0.11.200

4 years ago

0.11.197

4 years ago

0.11.196

4 years ago

0.11.195

4 years ago

0.11.194

4 years ago

0.11.193

4 years ago

0.11.192

4 years ago

0.11.191

4 years ago

0.11.189

4 years ago

0.11.190

4 years ago

0.11.188

4 years ago

0.11.187

4 years ago

0.11.186

4 years ago

0.11.185

4 years ago

0.11.184

4 years ago

0.11.182

4 years ago

0.11.183

4 years ago

0.11.181

4 years ago

0.11.180

4 years ago

0.11.179

4 years ago

0.11.178

4 years ago

0.11.177

4 years ago

0.11.176

4 years ago

0.11.175

4 years ago

0.11.174

4 years ago

0.11.173

4 years ago

0.11.172

4 years ago

0.11.171

4 years ago

0.11.161

4 years ago

0.11.170-alpha.6

4 years ago

0.11.170-alpha.5

4 years ago

0.11.170-alpha.4

4 years ago

0.11.170-alpha.9

4 years ago

0.11.170-alpha.8

4 years ago

0.11.170-alpha.7

4 years ago

0.11.160-alpha.3

4 years ago

0.11.160-alpha.2

4 years ago

0.11.160-alpha.1

4 years ago

0.11.159

4 years ago

0.11.158

4 years ago

0.11.157

4 years ago

0.11.156

4 years ago

0.11.155

4 years ago

0.11.154

5 years ago

0.11.153-alpha.3

5 years ago

0.11.153-alpha.2

5 years ago

0.11.153-alpha.1

5 years ago

0.11.152

5 years ago

0.11.151

5 years ago

0.11.150

5 years ago

0.11.149

5 years ago

0.11.148

5 years ago

0.11.147

5 years ago

0.11.146

5 years ago

0.11.145

5 years ago

0.11.144

5 years ago

0.11.143

5 years ago

0.11.142

5 years ago

0.11.141

5 years ago

0.11.140

5 years ago

0.11.139

5 years ago

0.11.138

5 years ago

0.11.137

5 years ago

0.11.136

5 years ago

0.11.135

5 years ago

0.11.134

5 years ago

0.11.134-alpha.9

5 years ago

0.11.134-alpha.8

5 years ago

0.11.134-alpha.7

5 years ago

0.11.134-alpha.6

5 years ago

0.11.134-alpha.5

5 years ago

0.11.134-alpha.4

5 years ago

0.11.134-alpha.3

5 years ago

0.11.134-alpha.2

5 years ago

0.11.134-alpha.1

5 years ago

0.11.133

5 years ago

0.11.132

5 years ago

0.11.131

5 years ago

0.11.130

5 years ago

0.11.129

5 years ago

0.11.128

5 years ago

0.11.127

5 years ago

0.11.126

5 years ago

0.11.125

5 years ago

0.11.124

5 years ago

0.11.123

5 years ago

0.11.121

5 years ago

0.11.120

5 years ago

0.11.119

5 years ago

0.11.118

5 years ago

0.11.117

5 years ago

0.11.116

5 years ago

0.11.115

5 years ago

0.11.114

5 years ago

0.11.113

5 years ago

0.11.112

5 years ago

0.11.111

5 years ago

0.11.110

5 years ago

0.11.109

5 years ago

0.11.108

5 years ago

0.11.107

5 years ago

0.11.106

5 years ago

0.11.105

5 years ago

0.11.104

5 years ago

0.11.103

5 years ago

0.11.102

5 years ago

0.11.101

5 years ago

0.11.100

5 years ago

0.11.99

5 years ago

0.11.98

5 years ago

0.11.97

5 years ago

0.11.96

5 years ago

0.11.94-alpha.7

5 years ago

0.11.94-alpha.6

5 years ago

0.11.94-alpha.5

5 years ago

0.11.94-alpha.4

5 years ago

0.11.94-alpha.3

5 years ago

0.11.94-alpha.2

5 years ago

0.11.94-alpha.1

5 years ago

0.11.93

5 years ago

0.11.92

5 years ago

0.11.91

5 years ago

0.11.90

5 years ago

0.11.89

5 years ago

0.11.88

5 years ago

0.11.87

5 years ago

0.11.86

5 years ago

0.11.85

5 years ago

0.11.84

5 years ago

0.11.83

5 years ago

0.11.81

5 years ago

0.11.80

5 years ago

0.11.79

5 years ago

0.11.78

5 years ago

0.11.77

5 years ago

0.11.76-alpha.12

5 years ago

0.11.76-alpha.11

5 years ago

0.11.76-alpha.10

5 years ago

0.11.76-alpha.9

5 years ago

0.11.76-alpha.8

5 years ago

0.11.76-alpha.7

5 years ago

0.11.76-alpha.6

5 years ago

0.11.76-alpha.5

5 years ago

0.11.76-alpha.4

5 years ago

0.11.76-alpha.3

5 years ago

0.11.76-alpha.2

5 years ago

0.11.76-alpha.1

5 years ago

0.11.50-alpha.75

5 years ago

0.11.50-alpha.74

5 years ago

0.11.50-alpha.73

5 years ago

0.11.50-alpha.72

5 years ago

0.11.50-alpha.71

5 years ago

0.11.50-alpha.70

5 years ago

0.11.50-alpha.69

5 years ago

0.11.50-alpha.68

5 years ago

0.11.50-alpha.67

5 years ago

0.11.50-alpha.66

5 years ago

0.11.50-alpha.65

5 years ago

0.11.50-alpha.64

5 years ago

0.11.50-alpha.63

5 years ago

0.11.50-alpha.62

5 years ago

0.11.50-alpha.61

5 years ago

0.11.50-alpha.60

5 years ago

0.11.50-alpha.59

5 years ago

0.11.50-alpha.58

5 years ago

0.11.50-alpha.57

5 years ago

0.11.50-alpha.56

5 years ago

0.11.50-alpha.55

5 years ago

0.11.50-alpha.54

5 years ago

0.11.50-alpha.53

5 years ago

0.11.50-alpha.52

5 years ago

0.11.50-alpha.51

5 years ago

0.11.50-alpha.50

5 years ago

0.11.50-alpha.49

5 years ago

0.11.50-alpha.48

5 years ago

0.11.50-alpha.47

5 years ago

0.11.50-alpha.46

5 years ago

0.11.50-alpha.45

5 years ago

0.11.50-alpha.44

5 years ago

0.11.50-alpha.43

5 years ago

0.11.50-alpha.42

5 years ago

0.11.50-alpha.41

5 years ago

0.11.50-alpha.40

5 years ago

0.11.50-alpha.39

5 years ago

0.11.50-alpha.38

5 years ago

0.11.50-alpha.37

5 years ago

0.11.50-alpha.36

5 years ago

0.11.50-alpha.35

5 years ago

0.11.50-alpha.34

5 years ago

0.11.50-alpha.33

5 years ago

0.11.50-alpha.32

5 years ago

0.11.50-alpha.31

5 years ago

0.11.50-alpha.30

5 years ago

0.11.50-alpha.29

5 years ago

0.11.50-alpha.28

5 years ago

0.11.50-alpha.27

5 years ago

0.11.50-alpha.26

5 years ago

0.11.50-alpha.25

5 years ago

0.11.50-alpha.24

5 years ago

0.11.50-alpha.23

5 years ago

0.11.50-alpha.22

5 years ago

0.11.50-alpha.21

5 years ago

0.11.50-alpha.20

5 years ago

0.11.50-alpha.19

5 years ago

0.11.50-alpha.18

5 years ago

0.11.50-alpha.17

5 years ago

0.11.50-alpha.16

5 years ago

0.11.50-alpha.15

5 years ago

0.11.50-alpha.14

5 years ago

0.11.50-alpha.13

5 years ago

0.11.50-alpha.12

5 years ago

0.11.50-alpha.11

5 years ago

0.11.50-alpha.10

5 years ago

0.11.50-alpha.9

5 years ago

0.11.50-alpha.8

6 years ago

0.11.75

6 years ago

0.11.74

6 years ago

0.11.73

6 years ago

0.11.72

6 years ago

0.11.71

6 years ago

0.11.70

6 years ago

0.11.50-alpha.7

6 years ago

0.11.50-alpha.6

6 years ago

0.11.50-alpha.5

6 years ago

0.11.50-alpha.4

6 years ago

0.11.50-alpha.3

6 years ago

0.11.69

6 years ago

0.11.68

6 years ago

0.11.67

6 years ago

0.11.66

6 years ago

0.11.50-alpha.2

6 years ago

0.11.65

6 years ago

0.11.64

6 years ago

0.11.63

6 years ago

0.11.62

6 years ago

0.11.61

6 years ago

0.11.60

6 years ago

0.11.59

6 years ago

0.11.58

6 years ago

0.11.57

6 years ago

0.11.56

6 years ago

0.11.55

6 years ago

0.11.54

6 years ago

0.11.53

6 years ago

0.11.52

6 years ago

0.11.51

6 years ago

0.11.50-alpha.1

6 years ago

0.11.50

6 years ago

0.11.49

6 years ago

0.11.48

6 years ago

0.11.47

6 years ago

0.11.47-alpha.1

6 years ago

0.11.47-aplpha.1

6 years ago

0.11.46

6 years ago

0.11.45

6 years ago

0.11.44

6 years ago

0.11.43

6 years ago

0.11.42

6 years ago

0.11.41

6 years ago

0.11.40

6 years ago

0.11.39

6 years ago

0.11.38

6 years ago

0.11.37

6 years ago

0.11.36

6 years ago

0.11.35

6 years ago

0.11.34-alpha.6

6 years ago

0.11.34-alpha.5

6 years ago

0.11.34-alpha.4

6 years ago

0.11.34-alpha.3

6 years ago

0.11.34-alpha.2

6 years ago

0.11.34-alpha.1

6 years ago

0.11.33

6 years ago

0.11.32

6 years ago

0.11.31

6 years ago

0.11.30

6 years ago

0.11.29

6 years ago

0.11.27

6 years ago

0.11.26

6 years ago

0.11.25

6 years ago

0.11.24

6 years ago

0.11.23

6 years ago

0.11.22

6 years ago

0.11.21

6 years ago

0.11.20

6 years ago

0.11.19

6 years ago

0.11.18

6 years ago

0.11.17

6 years ago

0.11.16

6 years ago

0.11.15

6 years ago

0.11.14

6 years ago

0.11.13

6 years ago

0.11.12

6 years ago

0.11.11

6 years ago

0.11.10

6 years ago

0.11.9

6 years ago

0.11.8

6 years ago

0.11.7

6 years ago

0.11.6

6 years ago

0.11.5

6 years ago

0.11.4

6 years ago

0.11.3

6 years ago

0.11.2

6 years ago

0.11.1

6 years ago

0.11.0

6 years ago

0.11.0-alpha.45

6 years ago

0.11.0-alpha.44

6 years ago

0.11.0-alpha.43

6 years ago

0.11.0-alpha.42

6 years ago

0.11.0-alpha.41

6 years ago

0.11.0-alpha.40

6 years ago

0.11.0-alpha.39

6 years ago

0.11.0-alpha.38

6 years ago

0.11.0-alpha.37

6 years ago

0.11.0-alpha.36

6 years ago

0.11.0-alpha.35

6 years ago

0.11.0-alpha.34

6 years ago

0.11.0-alpha.33

6 years ago

0.11.0-alpha.32

6 years ago

0.11.0-alpha.31

6 years ago

0.11.0-alpha.30

6 years ago

0.11.0-alpha.29

6 years ago

0.11.0-alpha.28

6 years ago

0.11.0-alpha.27

6 years ago

0.11.0-alpha.26

6 years ago

0.11.0-alpha.25

6 years ago

0.11.0-alpha.24

6 years ago

0.11.0-alpha.23

6 years ago

0.11.0-alpha.22

6 years ago

0.11.0-alpha.21

6 years ago

0.11.0-alpha.20

6 years ago

0.11.0-alpha.19

6 years ago

0.11.0-alpha.18

7 years ago

0.11.0-alpha.17

7 years ago

0.11.0-alpha.16

7 years ago

0.11.0-alpha.15

7 years ago

0.11.0-alpha.14

7 years ago

0.11.0-alpha.13

7 years ago

0.11.0-alpha.12

7 years ago

0.11.0-alpha.11

7 years ago

0.11.0-alpha.10

7 years ago

0.11.0-alpha.9

7 years ago

0.11.0-alpha.8

7 years ago

0.11.0-alpha.7

7 years ago

0.11.0-alpha.6

7 years ago

0.11.0-alpha.5

7 years ago

0.11.0-alpha.4

7 years ago

0.11.0-alpha.3

7 years ago

0.11.0-alpha.2

7 years ago

0.11.0-alpha.1

7 years ago

0.10.11

7 years ago

0.10.10

7 years ago

0.10.9

7 years ago

0.10.8

7 years ago

0.10.7

7 years ago

0.10.6

7 years ago

0.10.5

7 years ago

0.10.4

7 years ago

0.10.3

7 years ago

0.10.2

7 years ago

0.10.1

7 years ago

0.9.48

7 years ago

0.9.47

7 years ago

0.9.46

7 years ago

0.9.45

7 years ago

0.9.44

8 years ago

0.9.43

8 years ago

0.9.42

8 years ago

0.9.41

8 years ago

0.9.40

8 years ago

0.9.39

8 years ago

0.9.38

8 years ago

0.9.37

8 years ago

0.9.36

8 years ago

0.9.35

8 years ago

0.9.34

8 years ago

0.9.32

8 years ago

0.9.31

8 years ago

0.9.29

8 years ago

0.9.28

8 years ago

0.9.27

8 years ago

0.9.26

9 years ago

0.9.25

9 years ago

0.9.24

9 years ago

0.9.23

9 years ago

0.9.22

9 years ago

0.9.21

9 years ago

0.9.20

9 years ago

0.9.19

9 years ago

0.9.18

9 years ago

0.9.17

9 years ago

0.9.16

9 years ago

0.9.15

9 years ago

0.9.14

9 years ago

0.9.13

9 years ago

0.9.12

9 years ago

0.9.11

9 years ago

0.9.10

9 years ago

0.9.9

9 years ago

0.9.8

9 years ago

0.9.7

9 years ago

0.9.6

9 years ago

0.9.5

9 years ago

0.9.4

9 years ago

0.9.3

9 years ago

0.9.2

9 years ago

0.9.1

9 years ago

0.9.0

9 years ago

0.8.33

9 years ago

0.8.32

9 years ago

0.8.31

9 years ago

0.8.30

9 years ago

0.8.29

9 years ago

0.8.28

9 years ago

0.8.27

9 years ago

0.8.26

9 years ago

0.8.25

9 years ago

0.8.23

9 years ago

0.8.22

9 years ago

0.8.21

9 years ago

0.8.20

9 years ago

0.8.19

9 years ago

0.8.18

9 years ago

0.8.17

9 years ago

0.8.16

9 years ago

0.8.15

9 years ago

0.8.14

9 years ago

0.8.13

9 years ago

0.8.12

9 years ago

0.8.11

9 years ago

0.8.10

9 years ago

0.8.9

9 years ago

0.8.8

9 years ago

0.8.7

9 years ago

0.8.6

9 years ago

0.8.5

9 years ago

0.8.4

9 years ago

0.8.3

9 years ago

0.8.2

9 years ago

0.8.1

9 years ago

0.8.0

9 years ago

0.7.6

9 years ago

0.7.5

9 years ago

0.7.4

9 years ago

0.7.3

9 years ago

0.7.1

9 years ago

0.7.0

9 years ago

0.6.20

9 years ago

0.6.19

9 years ago

0.6.17

9 years ago

0.6.14

9 years ago

0.6.13

9 years ago

0.6.12

9 years ago

0.6.11

9 years ago

0.6.10

9 years ago

0.6.9

9 years ago

0.6.7

9 years ago

0.6.6

9 years ago

0.6.4

9 years ago

0.6.3

9 years ago

0.6.2

9 years ago

0.6.1

9 years ago

0.5.17

9 years ago

0.5.16

9 years ago

0.5.14

9 years ago

0.5.13

9 years ago

0.5.12

9 years ago

0.5.11

9 years ago

0.5.10

9 years ago

0.5.9

9 years ago

0.5.7

9 years ago

0.5.5

9 years ago

0.5.4

9 years ago

0.5.2

9 years ago

0.5.1

9 years ago

0.5.0

9 years ago

0.3.0

9 years ago

0.2.11

9 years ago

0.2.10

9 years ago

0.2.9

9 years ago

0.2.8

9 years ago

0.2.7

9 years ago

0.2.6

9 years ago

0.2.5

9 years ago

0.2.4

9 years ago

0.2.3

9 years ago

0.2.2

9 years ago

0.2.0

9 years ago