|
搞海外棋牌的兄弟们,我最近连续接了两个百游棋牌房卡的海外定制单,一套改成越南版,一套改成菲律宾版,踩了无数深坑,跑了十几遍代码。趁着热乎劲儿,把百游这套框架的海外适配与核心玩法修改过程整理成技术文档,全代码实操,给正在折腾百游房卡二开的朋友做个参考。 一、百游房卡源码结构速览先快速过一下百游棋牌房卡的整体结构,这套框架服务端用Lua开发,客户端基于Cocos Creator,数据库MySQL + Redis,房卡模式下的房间创建、解散、结算逻辑全部在Lua层实现。接手后第一件事,把目录关系理顺: ByGameServer/├── script/│ ├── global.lua -- 全局配置、语言开关│ ├── room_mgr.lua -- 房间管理、房号生成│ ├── game_niuniu.lua -- 百人牛牛逻辑│ ├── game_majiang.lua -- 地方麻将逻辑│ └── pay_call.lua -- 支付回调接口├── bin/│ └── dbsql/ -- 数据库脚本与配置表└── config/ └── server_config.json -- 服务器端口、域名配置
二、多语言与货币改造:从Lua层到客户端全链路海外适配第一步不是改玩法,而是先让界面说当地语言、结算显示当地货币。百游这套源码默认只有中文,全局语言配置放在global.lua里。 2.1 服务端多语言开关先改global.lua,增加语言枚举和当前语言变量: -- global.lua 增加多语言支持LANG_TYPE = { ZH = 1, EN = 2, VI = 3, -- 越南语 TH = 4, -- 泰语}CUR_LANG = LANG_TYPE.VI -- 当前设为越南语,可根据渠道包动态切换-- 语言文本映射表LANG_TEXT = { [LANG_TYPE.ZH = { room_create = "创建房间", room_join = "加入房间", gold_name = "金币", }, [LANG_TYPE.VI = { room_create = "Tạo phòng", room_join = "Vào phòng", gold_name = "Xu", }, ...}
客户端在请求服务器时带上语言参数,服务端根据CUR_LANG下发对应文本,避免客户端硬编码。 2.2 货币单位本地化百游原版使用“金币”“元宝”,海外需要改成“PHP”“VND”等本地货币。这里不止是改个名字,结算金额的显示逻辑也要动。以牛牛为例,game_niuniu.lua中结算通知的代码片段: -- game_niuniu.lua 结算推送修改前function push_settle_msg(players) for _, p in ipairs(players) do local msg = string.format("你赢了%d金币", p.win_gold) send_to_client(p.uid, msg) endend
海外版需要读取货币单位,并在展示时做汇率转换(如果接入本地支付后金币有对应关系的话): -- 修改后function push_settle_msg(players) local unit = LANG_TEXT[CUR_LANG.gold_name -- 越南文显示"Xu" for _, p in ipairs(players) do local msg = string.format("Bạn thắng %d %s", p.win_gold, unit) send_to_client(p.uid, msg) endend
同理,客户端收到消息后要根据当前语言匹配字体和排版,这部分客户端代码后面会说。 三、房卡模式核心玩法修改:底分与房卡消耗百游房卡模式下,创建房间需要消耗房卡,不同玩法底分、倍数也各不相同。海外运营时需要根据当地习惯调整,这些逻辑全部在room_mgr.lua中。 3.1 调整底分与入场限制例如越南用户喜欢玩小底分快速局,原来底分默认100,需要降为10。同时增加“局数消耗房卡”的功能,因为有的地区按局收费。 -- room_mgr.lua 创建房间时读取配置function create_room(params) local game_type = params.game_type -- 1:牛牛 2:麻将 local base_score = params.base_score or 10 -- 默认底分改为10 local round_count = params.rounds or 8 -- 8局 local card_cost = calc_room_card_cost(game_type, base_score, round_count) if params.card_count < card_cost then return {code = -1, msg = "房卡不足"} -- 这里msg也要用多语言 end -- 扣除房卡,生成房号 ...endfunction calc_room_card_cost(gtype, score, rounds) local cost_table = { [1 = {base=2, per_round=0.5}, -- 牛牛底分系数 [2 = {base=3, per_round=0.8}, -- 麻将 } local cfg = cost_table[gtype return math.ceil(cfg.base + score/20 * cfg.per_round * rounds)end
这样,底分10分、8局的牛牛房间,房卡消耗 = 2 + (10/20)*0.5*8 = 4张,运营可以自由调节系数。 3.2 解散房间与退款逻辑海外玩家对房主解散房间后的退款很敏感,百游原版解散不退房卡,需要二次开发。在room_mgr.lua的dismiss_room函数里加入退卡逻辑: function dismiss_room(room_id, dismiss_uid) local room = get_room(room_id) if room.owner_uid ~= dismiss_uid then return end -- 检查是否可以退款:未开始游戏,或已开始但所有人未操作 if room.status == ROOM_STATUS.WAITING or is_no_play(room) then local refund = room.used_card -- 退还房卡数 add_user_card(room.owner_uid, refund) log_refund(room.owner_uid, room_id, refund) end -- 通知所有玩家房间解散 ...end
这是海外版本地化运营必改的一处,避免客诉。 四、客户端多语言资源替换与界面演示客户端我们用Cocos Creator打开,主要改点:字符串表、UI预制体文字、图片资源。 4.1 字符串表本地化新建LangData_vi.json,结构如下: { "btn_create_room": "Tạo phòng", "btn_join_room": "Vào phòng", "label_rounds": "Số ván", "label_base_score": "Điểm cơ bản"}
然后在LangManager.js中根据服务端下发的语言类型加载对应的json文件,所有Label组件动态赋值。 4.2 UI布局兼容越南语文字普遍比中文长30%左右,泰语更高,不改布局按钮会撑爆。建议固定按钮宽度,文字字号做缩放适配。 // LangManager.js 自适应调整setLabel( node, key ) { let str = this.langData[key; let label = node.getComponent(cc.Label); label.string = str; // 英文和越南语适当缩小字号 if (this.curLang == 'en' || this.curLang == 'vi') { label.fontSize = label.fontSize * 0.85; }}
4.3 换肤与图标替换海外上架需要去掉明显的中国风元素,把龙、凤换成当地吉祥物,支付图标改成Maya、GCash等。资源替换完成后重新打包,注意把图集也一并更新。 百游棋牌客户端多语言界面演示图,用手机竖屏模拟真实运行效果,标注不同语言下的UI布局差异,展示海外适配的最终呈现状态。 五、海外支付接入实战代码百游原版支付只接了一家国内第三方,海外需要替换成当地支付,这里以接入菲律宾GCash为例,服务端pay_call.lua处理回调。 -- pay_call.lua 新增GCash回调处理function on_gcash_callback(data) local order_id = data.order_id local txn_id = data.txn_id local amount = data.amount -- 验签 if not verify_gcash_sign(data) then return http_resp(403, "sign error") end -- 处理订单,发放房卡或金币 local uid = get_uid_by_order(order_id) local goods = get_goods_by_order(order_id) if goods.type == "room_card" then add_user_card(uid, goods.num) end -- 记录流水 save_pay_log(uid, amount, "GCash", txn_id) return http_resp(200, "SUCCESS")end
客户端调用支付SDK拉起GCash,支付成功后通知服务端,流程和国内支付一致,只是签名算法和请求格式需要按GCash文档调整。这部分代码量较多,完整插件包我整理在本地,需要的朋友文末扫码获取。
以上就是百游棋牌房卡海外版二开过程中的关键代码改动,从服务端Lua多语言、房卡消耗算法,到客户端UI适配和支付接入,基本覆盖了90%以上的改造需求。实际项目里还会碰到运营商短信、Facebook登录等模块,但万变不离其宗,核心还是把语言和支付这两条链路打通。 如果你也在做百游棋牌房卡的海外二开,卡在某个报错上,或者需要完整的多语言资源包和支付插件源码,可以扫描下方二维码加我微信(备注“百游海外”)。
|