初始化仓库:友乐/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
+149
View File
@@ -0,0 +1,149 @@
// ============================================================================
// 游戏配置 (Game Configuration)
// ============================================================================
var Game_Config = Game_Config||{};//相关配置
Game_Config.Debugger={//调试配置
isDebugger : true,// debugger模式下会将所有收发的包输出到控制台(正式发布改为false)
AutoLogin : true,//debugger模式下是否需要记住登录状态自动登录(正式发布改为true)
isSubmitError : false,//是否需要服务器收集错误信息调试时可根据需要(正式发布改为true)
visitorLogin : true,//隐藏式游客登录
visiblePay:true,//审核通过后是否显示支付按钮
serverType:1,//0->正式服务器 1->本地服务器 http://ylyxservice1.0791ts.cn/config/update_json.txt
gameserver:"https://tsgames.daoqi88.cn/config_test/beta_update_jsonv2.txt"+"?"+ifast_random(100000)
// gameserver:"https://tsgames.daoqi88.cn/config_test/test_update_jsonv2.txt"+"?"+ifast_random(100000)
//gameserver:"https://gameotherwork.ld2sw.cn/update_json/update_json_haiwai.txt"+"?"+ifast_random(100000)
// gameserver:"https://tsgames.daoqi88.cn/config/update_jsonv2.txt"+"?"+ifast_random(100000)
};
Game_Config.Max = {
SumOfRoomtype:3,//创建时房间类型roomtype数组长度
ShowChat:2000,//聊天停留时间
PlayerCnt:4,//房间最大人数
group:500,//游戏最大群组号
showtime:10,//加载等待最少时间
reconnecttime:30000,//唤醒游戏间隔(超过间隔断线重连)
Mainnickname:10,//主界面玩家昵称显示长度(字符长度)
Infonickname:16//个人信息显示长度(字符长度)
};
Game_Config.Combat = {
height:80,//战绩页单行高度高度
up_y:190,//战绩页裁剪y坐标
bannerheight:60,//战绩横幅高度
bannery:80,//战绩横幅Y左边(相对48精灵)
btnbg:50
};
Game_Config.Info = {
Mainnickname:8,//游戏主界面玩家信息显示最大长度(字符)
textwidth_1:12.5,//昵称文字显示的宽度(未改动聊天显示文字大小无需改动无需修改)
textwidth_2:12.5,//积分文字显示的宽度(未改动聊天显示文字大小无需改动无需修改)
otherPositionDefault:true,//其他主界面玩家信息(昵称、积分)是否采用默认对齐方式对齐居中点为头像中点
myPositionDefault:true,//其他主界面玩家信息(昵称、积分)是否采用默认对齐方式对齐居中点为头像中点
myPosition:130,//自己信息对齐点(根据游戏界面自行修改)
position:[],//其他主界面玩家信息(昵称、积分)居中对齐的x坐标 注意是其他玩家不包括自己从下家开始
//TextContent:["1","2","3","4","5","6","7"],//常用语内容
TextContent:["你好","2","3","4","5","6","7"],//常用语内容
TextContentMp3:["","","","","","",""],//常用语对应音效
};
Game_Config.Share={//分享参数
appdownload:"",//下载链接(无需配置,从服务器获取)
title:"Test",//(分享标题)
description:"hello world",//分享描述
gameTitle:"",//游戏中的分享标题模板工程会自动将游戏名字分享出去、不必写在这个变量里
gameDescription:""//游戏中分享描述
};
Game_Config.Chat={//游戏内聊天配置信息
LimitLength:40,//聊天最大长度(字节长度)
textwidth:12.5,//聊天显示文字的宽度(未改动聊天显示文字大小无需改动无需修改)
ChatDis:[30,12],//聊天气泡与内容的间隔0位置左右间隔(最好不要低于30)1位置上下间隔
isLeft:[1,0,0,1,1],//聊天气泡是否为以左边为基准线
ChatLoc:[[35,517],[1100,315],[1100,105],[175,105],[175,315]]//聊天气泡的基准点位置(注意是基准点位置!)
};
Game_Config.Voice={//游戏内聊天配置信息
VoiceTime:600,//播放语音动画的时间一般情况无需无需修改
VoiceDis:[30,12],//语音气泡与内容的间隔0位置左右间隔(最好不要低于30)1位置上下间隔
isLeft:[1,0,0,1,1],//气泡是否为以左边为基准线
VoiceLoc:[[35,517],[1100,315],[1100,105],[175,105],[175,315]]//气泡的基准点位置(注意是基准点位置!)
};
Game_Config.Setting={
Ads1:"本游戏仅为娱乐休\n闲使用,道具所有\n 游戏通用\n\n游戏问题请联系微\n 信公众号:\n",
//Ads2:"\n 或客服号:\n",
board:"",//从后台获取设置无效
//info:[" 客服信息","QQ:","",""],//客服QQ提醒
info:[" 客服信息","QQ:","手机:","微信:"],//客服QQ提醒
board_blength:24,//通知页面一行最大字节数(无需设置)
charge:"关注友乐微信公众号充值",//充值提示
};
Game_Config.Protocol={
x:270,//协议图片初始x坐标
y:70,//协议图片初始y坐标
h:560,//协议图片显示高度
w:729//协议图片显示宽度
};
Game_Config.Help={//帮助
x:300,//帮助图片初始x坐标
y:165,//帮助图片初始y坐标
w:729,//帮助图片显示高度
h:450//帮助图片显示宽度
};
Game_Config.Notice={//滚动公告
x1:0,//无需设置
x2:0,//无需设置
y:0,//无需设置
h:0,//无需设置
//以上参数用来截取滚动公告的显示,截取位置是与滚动公告底大小位置一致
speed:0.1,//滚动公告的滚动速度
width:15//滚动公告的内容字体的字节长度(汉字是两个字节)
};
Game_Config.Feedback = {//反馈配置
maxLen:250 //反馈内容最大长度
};
Game_Config.shakeList ={//摇一摇事件的回调ID、需要添加时在此处添加回调事件写在Utl_Input.js中的Utl.shakeEvent()中
nil:0,
startwar:1
};
Game_Config.soundList ={//声音资源名
MenuSceneMusic:"",//大厅界面背景音
MainSceneMusic:""//游戏主界面背景音
};
Game_Config.ClickButton = {//需要设置点击音效的按钮(只有有弹窗的按钮设置此音效有效、按钮已经设置好、子游戏不允许修改)
src_1:"",//点击时播放的声音资源文件( 不需要播放则不填,下同)
src_2:""//弹窗时播放的音效
}
Game_Config.loginButton = {//登录按钮信息
x1:415,//非审核版本微信登录按钮x
x2:113,//审核版本微信登录按钮x
x3:488,//审核版本游客登录按钮x
};
Game_Config.sysConfig = {
mainMenuButton:false,//是否进入主菜单界面隐藏四个按钮
mainScenePlayerInfo:false,//是否隐藏主界面玩家信息
mainSceneButton:false,//是否隐藏主界面按钮
shareRoom:false,//接收到星星场是否屏蔽平台框架显示
changeSeat:false,//是否屏蔽平台自动刷新换座后界面
hideNotice:false,//隐藏公告栏
vipInfinite:false,//是否为百人场
}
+129
View File
@@ -0,0 +1,129 @@
// ============================================================================
// 01_SubGame_modify.js —— 平台交互/创建房间接口「转发壳」(框架维护,子游戏不碰)
// 顶部为「房型/创建房间配置区」(数据,子游戏填值);其下为接口转发壳(转发到 SubGameHooks)。
// 严格 ES5。
// ----------------------------------------------------------------------------
// 【平台约定精灵:25 号 = 创建房间确认按钮】(接入子游戏必看)
// 平台框架在「创建房间」界面提供 25 号精灵作为“确认/提交”按钮;其点击交互与
// 发送的数据包,均需【子游戏自己实现】(平台不代发),约定流程:
// 1. 子游戏在打开创建房间界面时注册 25 号精灵的点击(经 SpriteEventController
// 或 mouseup),点击即“确认创建房间”。
// 2. 子游戏按界面选项拼出 roomtype(房型配置串,编码局数/人数/扣卡/规则等,
// 由各子游戏按玩法自定义与解析),组装并发送创建房间请求:
// Net.Send_create_room({
// agentid : GameData.AgentId,
// playerid: C_Player.playerid,
// gameid : GameData.GameId,
// roomtype: <房型配置字符串>
// });
//
// 本麻将实现见 codes/game/ui/handlers/CreateRoomEventHandler(bindEvents 注册
// 25→submit;submit 用 UIManager._buildRoomTypeString 拼 roomtype 后 Net.Send_create_room)。
// ============================================================================
// ---------- 配置区(数据,子游戏按玩法填值;与 00 的 Game_Config 分工) ----------
var Game_Modify = Game_Modify || {};
// ---------- 平台需要的必须字段 ----------
Game_Modify.roomDes = ""; // 房间描述,子游戏在 setRoomDes 内填
Game_Modify.game_config = {}; // 游戏配置默认值
Game_Modify.combat = {
maxPlayerCount: 5,
pageOnelimitStrLen: 8,
pageOneDoc: false,
pageTwolimitStrLen: 16,
pageTwoDoc: false
};
Game_Modify.Type_1 = [
{ id: 0, des: "10局(房卡X1)", roomcard: 1, type: 1 },
{ id: 1, des: "20局(房卡X2)", roomcard: 2, type: 2 }
];
Game_Modify.Type_2 = [
{ id: 0, des: "房主扣卡", type: 1 },
{ id: 1, des: "每人扣卡", type: 2 }
];
Game_Modify.CreateRoomData = {
Type_1: 0,
Type_2: 0
};
// ---------- 接口转发壳(A 类:无 hook 即 no-op) ----------
Game_Modify.utlmousedown = function (gameid, spid, downx, downy, no1, no2, no3, no4, no5, no6) {
if (window.SubGameHooks && SubGameHooks.utlmousedown) return SubGameHooks.utlmousedown(gameid, spid, downx, downy, no1, no2, no3, no4, no5, no6);
};
Game_Modify.utlmousedown_nomove = function (gameid, spid, downx, downy, timelong, no1, no2, no3, no4, no5) {
if (window.SubGameHooks && SubGameHooks.utlmousedown_nomove) return SubGameHooks.utlmousedown_nomove(gameid, spid, downx, downy, timelong, no1, no2, no3, no4, no5);
};
Game_Modify.mouseup = function (gameid, spid_down, downx, downy, spid_up, upx, upy, timelong, no1, no2) {
if (window.SubGameHooks && SubGameHooks.mouseup) return SubGameHooks.mouseup(gameid, spid_down, downx, downy, spid_up, upx, upy, timelong, no1, no2);
};
Game_Modify.utlmousemove = function (gameid, spid, downx, downy, movex, movey, timelong, offmovex, offmovey, no1) {
if (window.SubGameHooks && SubGameHooks.utlmousemove) return SubGameHooks.utlmousemove(gameid, spid, downx, downy, movex, movey, timelong, offmovex, offmovey, no1);
};
Game_Modify.utlgamemydrawbegin = function (gameid, spid, times, timelong, no2, no3, no4, no5, no6, no7) {
if (window.SubGameHooks && SubGameHooks.utlgamemydrawbegin) return SubGameHooks.utlgamemydrawbegin(gameid, spid, times, timelong, no2, no3, no4, no5, no6, no7);
};
Game_Modify.gamemydraw = function (gameid, spid, times, timelong, no2, no3, no4, no5, no6, no7) {
if (window.SubGameHooks && SubGameHooks.gamemydraw) return SubGameHooks.gamemydraw(gameid, spid, times, timelong, no2, no3, no4, no5, no6, no7);
};
Game_Modify.OpenCreateRoom = function () {
if (window.SubGameHooks && SubGameHooks.OpenCreateRoom) return SubGameHooks.OpenCreateRoom();
};
Game_Modify.CloseCreateRoom = function () {
if (window.SubGameHooks && SubGameHooks.CloseCreateRoom) return SubGameHooks.CloseCreateRoom();
};
Game_Modify.setRoomDes = function (roomcode, asetcount, roomtype) {
if (window.SubGameHooks && SubGameHooks.setRoomDes) return SubGameHooks.setRoomDes(roomcode, asetcount, roomtype);
};
// ---------- gameCombat 兼容空定义 ----------
// 平台 gamemain.js 仍直接调用 gameCombat.utl*(战绩界面回调),保留全局对象与 6 个空接口防报错。
// 战绩功能由 RecordView 重建(见迁移子项目 2);届时这些接口可改为委托或保持空。
var gameCombat = gameCombat || {};
gameCombat.utlani_doend = gameCombat.utlani_doend || function () {};
gameCombat.utlmousedown = gameCombat.utlmousedown || function () {};
gameCombat.utlmouseup = gameCombat.utlmouseup || function () {};
gameCombat.utlmousemove = gameCombat.utlmousemove || function () {};
gameCombat.utlgamemydraw = gameCombat.utlgamemydraw || function () {};
gameCombat.utlgamemydrawbegin = gameCombat.utlgamemydrawbegin || function () {};
// 战绩接收入口(平台 09_Net 调):转发到 SubGameHooks(框架转发壳不引用 codes;子游戏在 SubGameHooks 内转 CombatService)
gameCombat.get_player_grade1 = function (_msg) {
if (window.SubGameHooks && SubGameHooks.get_player_grade1) return SubGameHooks.get_player_grade1(_msg);
};
gameCombat.get_player_grade2 = function (_msg) {
if (window.SubGameHooks && SubGameHooks.get_player_grade2) return SubGameHooks.get_player_grade2(_msg);
};
// 战绩入口:13 号精灵点击 → 发送获取战绩请求(Net.Send_get_player_grade1,平台底层发送)
// 点击经 平台 → Game_Modify.mouseup → SubGameHooks.mouseup → SpriteEventController 链到达
if (typeof SpriteEventController !== 'undefined' && SpriteEventController.registerMouseUp) {
SpriteEventController.registerMouseUp(13, function () {
if (typeof Net !== 'undefined' && Net.Send_get_player_grade1) {
Net.Send_get_player_grade1({
agentid: GameData.AgentId,
playerid: C_Player.playerid,
gameid: GameData.GameId,
type: 0
});
}
});
}
// 平台通用精灵交互(从 SubGameHooks 移入;经 Game_Modify.mouseup/gamemydraw→SubGameHooks→SpriteEventController 分发)
// 注:25 号(创建房间提交)已归创建房间职责,移至 codes/game/ui/handlers/CreateRoomEventHandler.bindEvents。
if (typeof SpriteEventController !== 'undefined') {
// 150:帮助按钮
if (SpriteEventController.registerMouseUp) {
SpriteEventController.registerMouseUp(150, function () {
if (typeof GameUI !== 'undefined' && GameUI.OpenHelp) { GameUI.OpenHelp(); }
});
}
// 248:协议勾选绘制(勾上时自绘钩)
if (SpriteEventController.registerDraw) {
SpriteEventController.registerDraw(248, function (e) {
if (GameData.ProtocolIndex) {
ifast_mydrawbmp(e.spriteId, 4, 5, 5, 40, 40, 0, 0, 40, 40);
}
});
}
}
+300
View File
@@ -0,0 +1,300 @@
// ============================================================================
// 02_SubGame_Input.js —— 平台输入/回调接口「转发壳」(框架维护,子游戏不碰)
// 平台按全局名调用 gameHallImport.* / Game_Modify.*;本文件统一转发到 SubGameHooks 同名 hook。
// 子游戏只需在 codes/ 的 SubGameHooks 里实现需要的接口(见 codes/SubGameHooks.js)。
// 严格 ES5。接口清单与默认值依据 spec §9。
// ============================================================================
var gameHallImport = gameHallImport || {};
var Game_Modify = Game_Modify || {};
// ============================================================================
// gameHallImport.* — 大厅接口(9 个)
// ============================================================================
// A 类:纯子游戏行为,无 hook 即 no-op
// 注:与 Game_Modify.appStart 同名但语义不同(大厅启动 vs 游戏启动),故 hook 名加 hall 前缀区分
gameHallImport.appStart = function () {
if (window.SubGameHooks && SubGameHooks.hallAppStart) return SubGameHooks.hallAppStart();
};
// A 类:纯子游戏行为,无 hook 即 no-op
gameHallImport.jumpMenuScene = function () {
if (window.SubGameHooks && SubGameHooks.jumpMenuScene) return SubGameHooks.jumpMenuScene();
};
// A 类:纯子游戏行为,无 hook 即 no-op
gameHallImport.gameStart = function () {
if (window.SubGameHooks && SubGameHooks.gameStart) return SubGameHooks.gameStart();
};
// A 类:纯子游戏行为,无 hook 即 no-op
gameHallImport.setGameList = function () {
if (window.SubGameHooks && SubGameHooks.setGameList) return SubGameHooks.setGameList();
};
// A 类:纯子游戏行为,无 hook 即 no-op
gameHallImport.clearGameinfo = function () {
if (window.SubGameHooks && SubGameHooks.clearGameinfo) return SubGameHooks.clearGameinfo();
};
// A 类:纯子游戏行为,无 hook 即 no-op
gameHallImport.getWebdata = function (data) {
if (window.SubGameHooks && SubGameHooks.getWebdata) return SubGameHooks.getWebdata(data);
};
// B 类:有平台默认返回值,无 hook 即返回默认
gameHallImport.isInstalled = function (data) {
if (window.SubGameHooks && SubGameHooks.isInstalled) return SubGameHooks.isInstalled(data);
return 1;
};
// A 类:纯子游戏行为,无 hook 即 no-op
gameHallImport.up_imgurl = function (recid, photo) {
if (window.SubGameHooks && SubGameHooks.up_imgurl) return SubGameHooks.up_imgurl(recid, photo);
};
// A 类:纯子游戏行为,无 hook 即 no-op
gameHallImport.getphoto = function (recid, photo) {
if (window.SubGameHooks && SubGameHooks.getphoto) return SubGameHooks.getphoto(recid, photo);
};
// ============================================================================
// Game_Modify.* — 生命周期/回调接口(来自 02,45 个)
// ============================================================================
// A 类:纯子游戏行为,无 hook 即 no-op
Game_Modify.appStart = function () {
if (window.SubGameHooks && SubGameHooks.appStart) return SubGameHooks.appStart();
};
// A 类:开战回调,无 hook 即 no-op
Game_Modify.StartWar = function (_msg) {
if (window.SubGameHooks && SubGameHooks.StartWar) return SubGameHooks.StartWar(_msg);
};
// A 类:接收数据包,无 hook 即 no-op
Game_Modify._ReceiveData = function (_msg) {
if (window.SubGameHooks && SubGameHooks._ReceiveData) return SubGameHooks._ReceiveData(_msg);
};
// A 类:创建房间,无 hook 即 no-op
Game_Modify.createRoom = function (_roomtype, _infinite) {
if (window.SubGameHooks && SubGameHooks.createRoom) return SubGameHooks.createRoom(_roomtype, _infinite);
};
// A 类:自己进入房间,无 hook 即 no-op
Game_Modify.myJoinRoom = function (_msg) {
if (window.SubGameHooks && SubGameHooks.myJoinRoom) return SubGameHooks.myJoinRoom(_msg);
};
// A 类:重连,无 hook 即 no-op
Game_Modify.Reconnect = function (_deskinfo) {
if (window.SubGameHooks && SubGameHooks.Reconnect) return SubGameHooks.Reconnect(_deskinfo);
};
// A 类:关闭所有声音,无 hook 即 no-op
Game_Modify.stopAllSounds = function () {
if (window.SubGameHooks && SubGameHooks.stopAllSounds) return SubGameHooks.stopAllSounds();
};
// A 类:投票解散确认,无 hook 即 no-op
Game_Modify.Free = function (_msg) {
if (window.SubGameHooks && SubGameHooks.Free) return SubGameHooks.Free(_msg);
};
// A 类:未开战状态加入牌桌数据,无 hook 即 no-op
Game_Modify.DeskInfo = function (_msg) {
if (window.SubGameHooks && SubGameHooks.DeskInfo) return SubGameHooks.DeskInfo(_msg);
};
// A 类:开局后自己退出房间,无 hook 即 no-op
Game_Modify.breakRoom = function () {
if (window.SubGameHooks && SubGameHooks.breakRoom) return SubGameHooks.breakRoom();
};
// A 类:其他玩家加入房间,无 hook 即 no-op
Game_Modify.playerJoinRoom = function (seat) {
if (window.SubGameHooks && SubGameHooks.playerJoinRoom) return SubGameHooks.playerJoinRoom(seat);
};
// A 类:其他玩家离开房间,无 hook 即 no-op
Game_Modify.playerLeaveRoom = function (seat) {
if (window.SubGameHooks && SubGameHooks.playerLeaveRoom) return SubGameHooks.playerLeaveRoom(seat);
};
// A 类:更新游戏界面,无 hook 即 no-op
Game_Modify.updateScene = function () {
if (window.SubGameHooks && SubGameHooks.updateScene) return SubGameHooks.updateScene();
};
// A 类:关闭游戏界面,无 hook 即 no-op
Game_Modify.closeGameScene = function () {
if (window.SubGameHooks && SubGameHooks.closeGameScene) return SubGameHooks.closeGameScene();
};
// A 类:玩家离线,无 hook 即 no-op
Game_Modify.playerOffline = function (seat) {
if (window.SubGameHooks && SubGameHooks.playerOffline) return SubGameHooks.playerOffline(seat);
};
// A 类:玩家上线,无 hook 即 no-op
Game_Modify.playerOnline = function (seat) {
if (window.SubGameHooks && SubGameHooks.playerOnline) return SubGameHooks.playerOnline(seat);
};
// A 类:玩家电话状态,无 hook 即 no-op
Game_Modify.playerphonestate = function (seat, type) {
if (window.SubGameHooks && SubGameHooks.playerphonestate) return SubGameHooks.playerphonestate(seat, type);
};
// A 类:摇一摇事件,无 hook 即 no-op
Game_Modify.shakeEvent = function () {
if (window.SubGameHooks && SubGameHooks.shakeEvent) return SubGameHooks.shakeEvent();
};
// A 类:计算结果,无 hook 即 no-op
Game_Modify.calResult = function (inputArr) {
if (window.SubGameHooks && SubGameHooks.calResult) return SubGameHooks.calResult(inputArr);
};
// A 类:进入游戏主场景,无 hook 即 no-op
Game_Modify.onEnterMainScene = function (roomtype) {
if (window.SubGameHooks && SubGameHooks.onEnterMainScene) return SubGameHooks.onEnterMainScene(roomtype);
};
// A 类:退出游戏主场景,无 hook 即 no-op
Game_Modify.onExitMainScene = function () {
if (window.SubGameHooks && SubGameHooks.onExitMainScene) return SubGameHooks.onExitMainScene();
};
// A 类:获取游戏配置时调用,无 hook 即 no-op
Game_Modify.onGameConfig = function (_gameConfig) {
if (window.SubGameHooks && SubGameHooks.onGameConfig) return SubGameHooks.onGameConfig(_gameConfig);
};
// A 类:进入牌局回放,无 hook 即 no-op
Game_Modify.onEnterVideo = function () {
if (window.SubGameHooks && SubGameHooks.onEnterVideo) return SubGameHooks.onEnterVideo();
};
// A 类:收到投降回包,无 hook 即 no-op
Game_Modify.onSurrender = function (_msg) {
if (window.SubGameHooks && SubGameHooks.onSurrender) return SubGameHooks.onSurrender(_msg);
};
// A 类:玩家准备触发,无 hook 即 no-op
Game_Modify.onReady = function (seat) {
if (window.SubGameHooks && SubGameHooks.onReady) return SubGameHooks.onReady(seat);
};
// B 类:获取房间描述,无 hook 返回默认文案
Game_Modify.getRoomInfo = function (roomtype, type, tea) {
if (window.SubGameHooks && SubGameHooks.getRoomInfo) return SubGameHooks.getRoomInfo(roomtype, type, tea);
return "房间描述" + roomtype;
};
// B 类:获取房间星星场下限,无 hook 返回默认值
Game_Modify.getStarLimit = function (roomtype) {
if (window.SubGameHooks && SubGameHooks.getStarLimit) return SubGameHooks.getStarLimit(roomtype);
return 2001000;
};
// B 类:获取房间星星场倍数,无 hook 返回默认值
Game_Modify.getMult = function (roomtype, type) {
if (window.SubGameHooks && SubGameHooks.getMult) return SubGameHooks.getMult(roomtype, type);
return 10000;
};
// B 类:获取房间全部信息描述,无 hook 返回默认文案
Game_Modify.getFullRoomInfo = function (roomtype) {
if (window.SubGameHooks && SubGameHooks.getFullRoomInfo) return SubGameHooks.getFullRoomInfo(roomtype);
return "房间描述" + roomtype;
};
// A 类:打开帮助页面,无 hook 即 no-op
Game_Modify.onOpenHelp = function (spid) {
if (window.SubGameHooks && SubGameHooks.onOpenHelp) return SubGameHooks.onOpenHelp(spid);
};
// A 类:显示大厅界面,无 hook 即 no-op
Game_Modify.onMainMenuScene = function () {
if (window.SubGameHooks && SubGameHooks.onMainMenuScene) return SubGameHooks.onMainMenuScene();
};
// A 类:数字输入框确认回调,无 hook 即 no-op
Game_Modify.onCheckInput = function (_result) {
if (window.SubGameHooks && SubGameHooks.onCheckInput) return SubGameHooks.onCheckInput(_result);
};
// A 类:创建房间成功后触发,无 hook 即 no-op
Game_Modify.onCreateRoom = function (_data) {
if (window.SubGameHooks && SubGameHooks.onCreateRoom) return SubGameHooks.onCreateRoom(_data);
};
// B 类:获取离场限制,无 hook 返回默认值
Game_Modify.getLeaveLimit = function (roomtype) {
if (window.SubGameHooks && SubGameHooks.getLeaveLimit) return SubGameHooks.getLeaveLimit(roomtype);
return 10;
};
// A 类:成功获取定位信息,无 hook 即 no-op
Game_Modify.onLocationInfo = function (_locationInfo) {
if (window.SubGameHooks && SubGameHooks.onLocationInfo) return SubGameHooks.onLocationInfo(_locationInfo);
};
// A 类:进入游戏界面创建牌桌之前,无 hook 即 no-op
Game_Modify.onCreateDesk = function (roomtype) {
if (window.SubGameHooks && SubGameHooks.onCreateDesk) return SubGameHooks.onCreateDesk(roomtype);
};
// B 类:获取是否开启视频功能,无 hook 返回默认值
Game_Modify.getVideoByRoomType = function (roomtype) {
if (window.SubGameHooks && SubGameHooks.getVideoByRoomType) return SubGameHooks.getVideoByRoomType(roomtype);
return 1;
};
// B 类:获取房间顶部描述数组,无 hook 返回默认文案数组
Game_Modify.getRoomTopDescAry = function (roomtype) {
if (window.SubGameHooks && SubGameHooks.getRoomTopDescAry) return SubGameHooks.getRoomTopDescAry(roomtype);
return ["" + roomtype];
};
// A 类:星星场房间列表,无 hook 即 no-op
Game_Modify.getShareRoom = function (_msg) {
if (window.SubGameHooks && SubGameHooks.getShareRoom) return SubGameHooks.getShareRoom(_msg);
};
// A 类:玩家自己退出房间,无 hook 即 no-op
Game_Modify.myExitRoom = function (seat) {
if (window.SubGameHooks && SubGameHooks.myExitRoom) return SubGameHooks.myExitRoom(seat);
};
// A 类:接收到换座包触发,无 hook 即 no-op
Game_Modify.changeSeat = function (seat1, seat2) {
if (window.SubGameHooks && SubGameHooks.changeSeat) return SubGameHooks.changeSeat(seat1, seat2);
};
// A 类:关闭 vip 选项时调用,无 hook 即 no-op
Game_Modify.onCloseVip = function () {
if (window.SubGameHooks && SubGameHooks.onCloseVip) return SubGameHooks.onCloseVip();
};
// B 类:判断房间是否为金币场,无 hook 返回默认值(0=非金币场)
Game_Modify.getRoomMode = function (roomtype) {
if (window.SubGameHooks && SubGameHooks.getRoomMode) return SubGameHooks.getRoomMode(roomtype);
return 0;
};
// B 类:获取房间最大玩家数量,无 hook 返回默认值
Game_Modify.getMaxPlayerCount = function (roomtype) {
if (window.SubGameHooks && SubGameHooks.getMaxPlayerCount) return SubGameHooks.getMaxPlayerCount(roomtype);
// 默认值依赖全局 Game_Config(须在本模板之前加载);无则回退 4
return (Game_Config.Max && Game_Config.Max.PlayerCnt) || 4;
};
// B 类:更新玩家信息 UI,无 hook 返回 false(让平台默认处理)
Game_Modify.updatePlayerInfoUI = function (targetSeat) {
if (window.SubGameHooks && SubGameHooks.updatePlayerInfoUI) return SubGameHooks.updatePlayerInfoUI(targetSeat);
return false;
};