初始化仓库:友乐/gameabc 房卡游戏平台脚手架(client + server + docs)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-01 18:13:26 +08:00
co-authored by Claude Opus 5
commit 594820d393
655 changed files with 310861 additions and 0 deletions
@@ -0,0 +1,225 @@
/**
* 网络收发包工具类
* 自动处理平台框架提供的基础数据字段,简化子游戏的网络通信
*
* 功能特性:
* - 自动注入平台数据:agentid、gameid、playerid、roomcode
* - 统一的RPC发送接口
* - 支持调试模式输出
* - 遵循数据包协议规范
*
* @author GameABC Framework
* @version 1.0.0
*/
var RpcHelper = {
/**
* 发送RPC请求
* 自动注入平台框架提供的基础验证字段
*
* @param {string} app - 应用名称,通常为 "youle"
* @param {string} route - 路由名称,如 "room"
* @param {string} rpc - RPC方法名,如 "play_card"
* @param {Object} gameData - 子游戏业务数据
* @param {Object} options - 可选配置参数
* @param {boolean} options.debug - 是否输出调试信息,默认false
* @param {Object} options.customData - 自定义的额外数据字段
*/
sendRpc: function(app, route, rpc, gameData, options) {
// 参数验证
if (!app || typeof app !== 'string') {
console.error('RpcHelper.sendRpc: app参数必须是非空字符串');
return;
}
if (!route || typeof route !== 'string') {
console.error('RpcHelper.sendRpc: route参数必须是非空字符串');
return;
}
if (!rpc || typeof rpc !== 'string') {
console.error('RpcHelper.sendRpc: rpc参数必须是非空字符串');
return;
}
// 默认选项
options = options || {};
var debug = options.debug || false;
var customData = options.customData || {};
// 构建完整的数据包
var data = {};
// 1. 自动注入平台框架提供的基础验证字段
try {
data.agentid = GameData.AgentId; // 运营商ID(String类型)
data.gameid = GameData.GameId; // 游戏类型标识(String类型)
data.playerid = C_Player.playerid; // 玩家唯一标识(Number类型)
data.roomcode = Utl.getRoomcode(); // 房间号(String类型)
} catch (e) {
console.error('RpcHelper.sendRpc: 获取平台基础数据失败', e);
return;
}
// 2. 验证必需的平台数据
if (!data.agentid) {
console.error('RpcHelper.sendRpc: agentid未设置,请确保平台框架已初始化');
return;
}
if (!data.gameid) {
console.error('RpcHelper.sendRpc: gameid未设置,请确保平台框架已初始化');
return;
}
if (!data.playerid) {
console.error('RpcHelper.sendRpc: playerid未设置,请确保玩家已登录');
return;
}
if (!data.roomcode) {
console.error('RpcHelper.sendRpc: roomcode未设置,请确保已进入房间');
return;
}
// 3. 合并子游戏业务数据
if (gameData && typeof gameData === 'object') {
for (var key in gameData) {
if (gameData.hasOwnProperty(key)) {
data[key] = gameData[key];
}
}
}
// 4. 合并自定义数据
for (var key in customData) {
if (customData.hasOwnProperty(key)) {
data[key] = customData[key];
}
}
// 5. 调试信息输出
if (debug || Game_Config.Debugger.isDebugger) {
console.log('RpcHelper发送RPC:', {
app: app,
route: route,
rpc: rpc,
platform_data: {
agentid: data.agentid,
gameid: data.gameid,
playerid: data.playerid,
roomcode: data.roomcode
},
game_data: gameData,
custom_data: customData
});
}
// 6. 通过框架发送RPC请求
Utl.sendData(app, route, rpc, data);
},
/**
* 发送游戏房间RPC
* 专门用于游戏房间相关的RPC调用,预设app="youle", route="room"
*
* @param {string} rpc - RPC方法名
* @param {Object} gameData - 子游戏业务数据
* @param {Object} options - 可选配置参数
*/
sendGameRpc: function(rpc, gameData, options) {
this.sendRpc("youle", "room", rpc, gameData, options);
},
/**
* 发送代理商RPC
* 专门用于代理商相关的RPC调用,预设app="youle", route="agent"
*
* @param {string} rpc - RPC方法名
* @param {Object} gameData - 子游戏业务数据
* @param {Object} options - 可选配置参数
*/
sendAgentRpc: function(rpc, gameData, options) {
this.sendRpc("youle", "agent", rpc, gameData, options);
},
/**
* 发送平台RPC
* 专门用于平台相关的RPC调用,预设app="youle", route="platform"
*
* @param {string} rpc - RPC方法名
* @param {Object} gameData - 子游戏业务数据
* @param {Object} options - 可选配置参数
*/
sendPlatformRpc: function(rpc, gameData, options) {
this.sendRpc("youle", "platform", rpc, gameData, options);
},
/**
* 获取当前平台数据快照
* 用于调试和信息查看
*
* @returns {Object} 包含当前平台数据的对象
*/
getPlatformData: function() {
try {
return {
agentid: GameData.AgentId,
gameid: GameData.GameId,
playerid: C_Player.playerid,
roomcode: Utl.getRoomcode(),
timestamp: new Date().getTime()
};
} catch (e) {
console.error('RpcHelper.getPlatformData: 获取平台数据失败', e);
return null;
}
},
/**
* 验证平台数据完整性
* 检查所有必需的平台数据是否已正确设置
*
* @returns {Object} 验证结果对象 {valid: boolean, missing: Array}
*/
validatePlatformData: function() {
var result = {
valid: true,
missing: []
};
try {
if (!GameData.AgentId) {
result.valid = false;
result.missing.push('agentid');
}
if (!GameData.GameId) {
result.valid = false;
result.missing.push('gameid');
}
if (!C_Player.playerid) {
result.valid = false;
result.missing.push('playerid');
}
if (!Utl.getRoomcode()) {
result.valid = false;
result.missing.push('roomcode');
}
} catch (e) {
result.valid = false;
result.missing.push('platform_error');
console.error('RpcHelper.validatePlatformData: 验证过程出错', e);
}
return result;
}
};
// ES5兼容性:确保在旧版本浏览器中也能正常工作
if (typeof Object.defineProperty === 'function') {
// 防止意外修改工具类
Object.defineProperty(window, 'RpcHelper', {
value: RpcHelper,
writable: false,
configurable: false
});
} else {
// 旧版本浏览器的兼容处理
window.RpcHelper = RpcHelper;
}