UNPKG

mm_os

Version:

MM_OS服务端架构,用于快速构建应用程序,支持网站建设、小程序后台、AI应用、物联网(IOT/AIOT)、游戏服务端等多种场景。

170 lines (153 loc) 3.76 kB
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;