mm_os
Version:
MM_OS服务端架构,用于快速构建应用程序,支持网站建设、小程序后台、AI应用、物联网(IOT/AIOT)、游戏服务端等多种场景。
170 lines (153 loc) • 3.76 kB
JavaScript
const {
Drive
} = require('mm_machine');
/**
* 游戏房间
*/
class Room extends Drive {
static config = {
// 房间名称
'name': '5v5',
// 房间标题
'title': '',
// 房间等级上限
'max_level': 1000,
// 房间最大人数
'max_players': 5,
// 游戏类型 rpg、card
'type': 'card',
// 游戏类型 排位赛rank、娱乐局casual
'mode': 'rank',
// 房间主程序
'main': ''
};
/**
* 构造函数
* @param {object} config 配置参数
*/
constructor(config) {
super({
...Room.config,
...config
});
// 房间列表
this.list = new Map();
}
};
/**
* 获取模板目录
* @returns {string} 模板目录
*/
Room.prototype.getTplDir = function() {
return __dirname;
};
/**
* 初始化核心
* @param {object} zone 游戏世界分区
* @param {object} eventer 事件管理器
* @param {object} logger 日志管理器
*/
Room.prototype._initCore = async function (zone, eventer, logger) {
if (!zone) {
throw new TypeError('游戏世界分区不能为空');
}
// 游戏世界分区
this.getZone = function () {
return zone;
};
if (logger) {
this.setLogger(logger);
}
if (eventer) {
this.getEventer = function () {
return eventer;
};
}
};
/**
* 开始匹配
*/
Room.prototype.startMatch = function () {
// 检查所有玩家是否已准备
if (!this.isAllPlayersReady()) {
throw new Error('房间内玩家未全部准备');
}
// 检查房间是否已开始匹配
if (this.state === 2) {
throw new Error('房间已开始匹配');
}
// 检查房间是否已开始游戏
else if (this.state === 3) {
throw new Error('房间已开始游戏');
}
this.state = 2;
// 记录匹配开始时间
this._match_time = Date.now();
// 触发开始匹配事件
this.emitEvent('room_start_match', {
room_id: this.room_id,
room_name: this.config.name,
timestamp: this._match_time
});
};
/**
* 匹配玩家
* 根据房间配置进行玩家匹配
* @returns {object} 匹配结果
*/
Room.prototype._matchPlayers = function () {
var config = this.config;
var format = config.format || '5v5';
var mode = config.mode || 'rank';
var player_ids = this.getAllPlayerIds();
var player_count = player_ids.length;
var ret = this._checkMatch(player_count, config.max_players || 6);
if (!ret.valid) {
return { success: false, reason: ret.reason };
}
var teams = this._splitTeams(player_ids, format);
if (!teams) {
return { success: false, reason: '玩家数量不符合比赛格式要求' };
}
return this._buildMatch(mode, format, teams, player_count);
};
/**
* 检查匹配条件
* @param {number} player_count 玩家数量
* @param {number} max_players 最大玩家数
* @returns {object} 检查结果
*/
Room.prototype._checkMatch = function (player_count, max_players) {
if (player_count === 0) {
return { valid: false, reason: '房间内没有玩家' };
}
if (player_count > max_players) {
return { valid: false, reason: '房间内玩家数量超过上限' };
}
return { valid: true };
};
/**
* 构建匹配结果
* @param {string} mode 游戏模式
* @param {string} format 比赛格式
* @param {object} teams 队伍配置
* @param {number} player_count 玩家数量
* @returns {object} 匹配结果
*/
Room.prototype._buildMatch = function (mode, format, teams, player_count) {
var ret = {
success: true,
room_id: this.room_id,
mode: mode,
format: format,
teams: teams,
player_count: player_count,
timestamp: Date.now()
};
this.emitEvent('room_match_success', {
room_id: this.room_id,
ret: ret
});
return ret;
};
exports.Room = Room;