diff --git a/assets/bundles/first/config/Const.json b/assets/bundles/first/config/Const.json index 9a229eb..bf42fb4 100644 --- a/assets/bundles/first/config/Const.json +++ b/assets/bundles/first/config/Const.json @@ -226,5 +226,11 @@ "desc": "关卡技能宝箱个数", "para": 6, "para1": "" + }, + { + "id": 39, + "desc": "回收金币", + "para": 5, + "para1": "" } ] \ No newline at end of file diff --git a/assets/res/font/str.txt b/assets/res/font/str.txt index 20a92b1..086d840 100644 --- a/assets/res/font/str.txt +++ b/assets/res/font/str.txt @@ -1,2 +1,2 @@ [ - {"_type:c.Prfab,nmgGidojFls0Ex}v1zNuh2846]3V-5Qw背包格开启7UITSC9KRqAMB@JHYOD+未LWk文字选项框X/待Z怪物来袭第波一倍速二资产底部出砚台金币视频标图点石成自动合置灰线<=>敌方信息引导手指上箭头加宝箱秒杀斩受击刀痕光效特木水火土皮肤禁止跳拖尾暴子锁定死亡营地血条量长保护派机兵走路吹号角猴虾魂小发阴影冰冻锥结恶鬼下层攻晕眩流电粘液果盾睡觉鼻涕泡呼噜限万神幡三味真持续九霄雷乾坤袋桃率卡千里眼双符属性四封榜授仙箓幻镜施法技能弱危提示升级昌笔碎帝钟偷缚网捕获衰门向左退随牌齐落飞行弹冲锋枪剑气阵目束召唤哮天犬杨戬刺身术悟空放复活干扰迷雾挑砸损毁风雪李靖塔棍红治疗混乱生簿母大招普通疾直龙矢葫芦画追踪射体降雨原旋转车缨掉品质武器景戈墟静态障碍片口盖在面灵渊遮澜沧离岳冈宫河桥府岩浆花山编辑时到中查看状蓝虚紫色橙闪#让我们替换它确取消存清除设等战斗和关闭汽炸窗题力几,数或所有%赏令后概多得个增的*幸运鏖册对丸π寻尺解块额外御珠接近灭省契耗滞进度矿每枚变伤害Ⅰ系爆ⅡⅢ距远最释程超过低于幅|毒素命给添造群周围友军必狠舞穿透球次区域减并脚潭经打单位强化分裂霸王之场支云巨燃隔牛扇形精准同极输北京津西内蒙古辽宁吉林黑江海苏浙安徽福建东南湖广重庆川贵州藏陕甘肃青夏新疆湾香港澳初始值恢间(:)刷盘道具告购买权首匹配段少星局铲现达终触展推使用日胜奖励应当前为整不玩家游戏公容好!正式见了欢迎验任何问反馈。期就是组算钱飘免费基础绿默认巡妖白骨女·阶唐僧嫦娥哪吒尖两孙如意箍棒猪八戒玉轩辕儿国太乙烧幼园班学年五六高硕士博讲师教劈砍连带抡圈携扩范抛散戳横扫倒树移非猛踩将镇瞬无作交错丢挥需要循环表专根据参考人族扔但占独立调装档帮助快捷入美返回页桌赠送钻礼商店已领券充月词及副本荡可张马激卸载彩虹功章节即累计失败还没仅观请先完今登录制误异常检剧情够摧抽足吧径堵!补余剩备困难模狱明再满其他该兑码铜英雄斧弓沙阎吸尘酷炫猎以与材搭全收益把锐比投掷贯弯处卷残般杖钉耙显握审判众操纵寒签铁银黄铂耀宗者稀享尽叫森漠优摆()蜘蛛禽漩涡狐狸巫注会响知刮起狂魅惑你临继工版更轮择、敬戴七十折拥荐饿…吃桀别怕温柔滚菜食类末逃撕延闯易统短冷却兽语靠往暂停弃只差至虽然也音乐震侧边栏都甲城挂越积务列否?己丰厚预览世站传说堆唯丧尸言简宠邀培养钥匙馨感着℃浓逐渐覆抵抗昼夜许些修此筑?排名魔描述农牢笼劳男刻利援榴莲理且主屏幕右滑哦恭喜您去哈奇螃蟹乌龟梅鹿狗焰狮猫熊鹰烈羊驼押雇佣闹帘蓬凡拘伸腾而断急漫针齿池链吞噬递君归心百掌叶圣牙留住啃半逻父深翻协瑶赐共庭娘霆轰顶掣切割缉拿承祝从梭×&征唔溜痛种尚镶嵌醒永久鉴库步私货噻称售罄被惊圆矩拷贝糕客料喽爱繁한국어にほんごñçрускийязыí像罩戟件';曲代控坐境构求夹^\$~`🚫➡️报允缓密例压缩适缺寸居钩监听事颜;则忽略宽相拐平采样绘帧端议~总避遍历固旧截那实沿播竖管记板索克隆擦案轴储维供渲染各函须致若按改含象垂倾斜填跟偏附惯执型拟布<殊裁剪毕这写某义印序因元约负摸抬肯做创话删竟驱粗怼防哎呢候才想善啊艹坑👈👉罕况套志识钮依赖销证界粒擎核阻纹─缘浮跃→老烟傻撒奥斯刚尝试集源串废址拉隐摘仍读跑缀早跨逆赋访插联键邻顺骤弦↔谁煮肉饭找滤均洗拽很突声锚欧析策价拓扑纯测热氏钳署照由航途朝业规轻「」溯旁曼顿估假塞校恰桶赶拦服聚迟抑硬绑卖荷挡扣绪兜栈勿队零—另互槽询丹稍叠爪囚际污乘芭蕉贡献划汇墙毫竞碰撞拍漏盒脱威胁蟠剔筛≤°贪济扁决垮史莱姆厂典宿责订阅迭螺漂爬匀涉兼昧腰亦批举架抖微份职演绕络户探厅偿≥便绎聊智警慢佳贴幂拼±绝壳›险铺拔刘译¥₩﷼坏句棋挖–仿抢棵拆拒骰饰撤疫妙恒遗挪斥答“亮”晋闩闲驻磁峰泵曾纠脏诊Σ伪较欠挤姿淡旦孤委托辨律踢丁露故晚稳员鸿付脑裸亿兆垓秭穰沟涧阿祇思什么论似科季尔弧耦浏虑 【】诗椭抓暗珊瑚座墨朵耳隙丞奔灞帅猩猿魈浪臂鱼鸟喷谛玲珑扭书骼宵摊婆饼霜诛芒舌菩昭晶财灯破糊§©®™←↑↓●■◆▲▼★☆○《》『』〈〉‘’¥£¢∞℉灾厄仓钢镔刃莫邪吴敖玄罗笑赢挣宅掘麾振鼓沉村匠枝柳凑净搬孩岂肆犯脉畏惧碧侵溃捍卫幽冥踏讨伐泉奈忘彻旗扬鸣辈秩严辱崩蓄驭驰祭颗伙蔓践陷吼猜藤叹伞烁缝臭草袈裟禅救帽嘴泪啦鹅姐奶荧溅巴筒赫柱摔炮雹甜窜陀昨款掰野练习削罢捡趁棉昊田既紧账冤募鼋犀腿掏粪熔炉涂僵焊研洞拳皇丑潮冠珍淇淋鼍虎贼鼠蛮豕卒鳝貉貂豹鲤鳌蜃戾煞魄伥蟾蚌蛇螭守魇怨祟夔犼欲蝎魉魍魑魃猊狼獐獾猢獬蚣盗凶蛊嗔痴胖锤鬃毛颚祥育抱富爷呆妇拾荒壮髦病丝糖贸市堂翅篮摇俑厨烤夫吐虫猕劫涌鹏宴洪寅岭峦佛祖寇潜焚罴傲猁兔丈鳞蟒梁凰妄赛岁辟尊眉袍膀俯隼弄洛阳陨仇捞粮滋杆催铃勾详坊荆撑睛街陋搜厉努医船锅胳膊梯阱楼希望攀松阈悬瞄崖鸡哥蝉兹蔽遭贬胎亲逢叉陡渡庄捎銮殿摄赌祛兴遇伏婚琵琶苦棘吟咏诸柿衕秽朱拯疲癃脸>油 奏竹蜻蜓罚最叆(¤šº¾è¡¨‰˜­¯ªé»Œä¸Žž½‹³‡‚¹Ÿ„Šƒã•µ²¿¦«´¬�纳¶借肩摩裙室烂药洁骑磨稻拇彪院氛蜂窝睁汤缸苗骷髅粉呜又究怎丘房卧凤郡钯捉竺凌遥席噼啪脆捆办央馆谷社郊民隧宾炼溶峡坝碑坟煤酒葬寺庙坍塌艺舍蔬棚钓洲豪华邮赴糟谢训勤吗穷怀疑她迹嗯垃圾肥米杂锻拣冶堡细软锯廓颠尬泄司咪簇匕溢灼沫镖秘坚椅炒床煎娃械茶筝票雕塑凉亭乒乓柜筋桩墩篓纸枯凳韩伯✅🌍菱橘蛙∈映盆栽砖躺毯闸吊泥坛厢舰琴瓷咨筐茅屋岗弥勒饵灶植恐蛋裹墓棺烛罐帐篷介绍赚衣嫌喇叭梦媚玻璃傅咸绳赎罪慌汗坠忆担挽念蒸弗兰伦裤梨斑斓啥晓闻囤顾宣柴秀滩腐蚀畜淬晃喝爽噩团曝砧壁沾瘦矮陆帆鞋察筷哇桂鸭媒咖啡麻辣蜜盛聘企洽谈佬诚彼悔恨逼妹骗惨亏篑捧爸俊杰董宏伟碗瓶膏纫秋扳醋翡翠檀唱仪偶洋饮鲜簪杯镯谱剂抹轿芯壶党胶冬苁蓉枸杞茸漱皂苷杉醇凝奢健宋酿啤斛燕午餐麦脂豆芝墅麝胆杏铸膜蚕瑞沈舟珩楚慕萧婉疏秦阮禾辞官溪陈沐桐翊辰赵予郑冯眠沅曦邓曹宇泽峻熙嘉铭彦郭春棠芽雀柚瓮琛郁柠徐叙舒胡袁吕卢蒋蔡贾魏薛潘杜澄奕尧弈敢嚣扛搞霞蹭斤兄弟饶痒喉咙捏饥渴耐喊滥谨慎阀崛争淘违迫扶融埃碾瓜汪康娱叮蚁休迪驾驶讯宙酱蚂堪钞暖拜泰窦诉郎砒焖肝晦贱股陪俩谋祸眨誓妈瘫艾吓贷懂轨敲呀踹姓债骂篡忙扯淑芬郝丫惹歹屈胸哼撩耍嘛羞嘿祈奋耻聪挺欺叔尴茬良奸谍殴崽葱嘞麒麟赔瞧肾蚝咱辆佩势荣苛抚咬劝泼烦屁挨揍跪孕嗨愿卑鄙厕掐脖稽扎仔甩忍刹砰嫂妮拱磕逞醉薇胞恩槌袒宜耽撬丽莎暧愉渣骆蹲昂朴贿赂瞎廊妻夺嫩卓祎悄浑捣租掩啰衡遣辛盯趴凭蹋辅劲窃纪涨趋氓馁恼犒磊噪舵筹瞒趟德缠患裕舅涩菲揽矛谅趣朋寨懒促恙憋咎懈怠犊谓呗唧届躲勇拭夸鞠躬瘁癖傍巧芸叛囊蠢舆熟酵织搅搁措诺眈颈幺蛾薪妨跌犹豫乞丐俱嘲掺撼逛忧怒奠伍枉惜昏寄冒雅觑喘呈瓢吵娜惠峥嵘耕塘芳桑柄槛盈衔渍嘟愤浴巾咔肘咚暑衅膝皱馒咀嚼撇盔铠莉搂捂袱盹讶肿龇杠鸦肚嘻挠旅侦呲羽掸酥掳椒玫瑰滕巅浩孟夕疼悉缮窍拎裆靡萌辉煌倡廉擘亨寡滨劣掀萨噶歌伴革殖侄腻愁姨诽谤甚仁悦栋诅咒缴瘟屎诬诱谣灌澡嫣蟑螂猖呦逾潇洒诈妥碳唉湘刁爹辜庞嫁贤牺牲垄愧乖逮惺怜乎嘱咐貌恳疯伎霉兮崴踝绷妞蕾勉瞌仆苍坯贫漆笨纽遵驳悠酸揉捶伺哭嘎绩晨赞愣渠屉肺昆仑炎ÄÖÜöüßàùêâîôûаАЯЁёìÍÌÁÀáÉÈÒÓòóŐőÙÚŰúűÑÆÃÂÔõěčřýůťďňĚČŘŤżźśńłęćąŻŹŚŃŁĘĆĄảạăắằẳẵặấầẩẫậẻẽẹếềểễệỉĩịỏọốồổỗộơớờởỡợủũụưứừửữựỳỷỹỵđẢẠĂẮẰẲẴẶẤẦẨẪẬẺẼẸÊẾỀỂỄỆỈĨỊỎÕỌỐỒỔỖỘƠỚỜỞỠỢỦŨỤƯỨỪỬỮỰÝỲỶỸỴĐ😉🚗哟噢井玛喂弊括祗仕盲≈沼披畅÷敏蝇酣漓昵汉鞭θ怖咩评锹苹飙⚠❌👇⚡🔄💡級镂穴窄矫①②惩逗迁综惰滴尤侣拧∩−仰皆褐③④挫盟枭埋羁绊岛≠瓣膨胀泛俸禄政吾擂徒・庐揭薄篇≫哨佐瞻蹦Δ浅凸掠垫拢擅匿碌剥申寂寞 \ No newline at end of file + {"_type:c.Prfab,nmgGidojFls0Ex}v1zNuh2846]3V-5Qw背包格开启7UITSC9KRqAMB@JHYOD+未LWk文字选项框X/待Z怪物来袭第波一倍速二资产底部出砚台金币视频标图点石成自动合置灰线<=>敌方信息引导手指上箭头加宝箱秒杀斩受击刀痕光效特木水火土皮肤禁止跳拖尾暴死亡营地血条量长保护派机铲子挖画铁兵走路吹号角猴虾魂小发阴影冰冻锥结中毒恶鬼下层攻晕眩流电粘液果盾睡觉鼻涕泡呼噜限三味真持续九霄神雷乾坤袋桃率卡双符四属性弱危提示授仙箓升级昌笔碎法帝钟缚网衰门向左退随牌万齐落技能球陨冲锋飞枪剑气阵千里眼目束刺复活挑砸损毁风雪弹行治疗术混乱母大招普通疾直龙矢追踪射体降雨棍原旋转车红缨掉品质武器景戈墟静态障碍片口灵渊澜沧盖在面离岳冈宫河桥府岩浆花山编辑时到查看状蓝虚雾紫色橙闪#让我们替换它确定取消存清除设等战斗和关闭汽炸窗题力几召唤,数或所有%赏令后概多获得个增的*幸运鏖册对丸π生寻尺解锁块额外御珠接近灭省契耗滞进度矿每枚伤害Ⅰ系()爆ⅡⅢ距远最释放程超过低于幅|素命给添造群周围友军必狠舞穿透次区域减并脚潭经打单位强化分裂霸王之场支云巨燃隔牛身扇形精准同极输北京天津西内蒙古辽宁吉林黑江海苏浙安徽福建东南湖广重庆川贵州藏陕甘肃青夏新疆湾香港澳初始值恢间(:)刷盘道具告购买权首匹配段少星局现达终触展推使用日胜奖励应当前为整不玩家游戏公容好!正式见了欢迎验任何问反馈。期就是组算钱飘免费基础绿回收默认白骨女·阶唐僧嫦娥哪吒尖杨戬两孙悟空如意箍棒猪八戒玉轩辕儿国太乙烧幼园班学年五六高硕士博讲师教劈砍连带抡圈携扩范抛散戳横扫树移非猛踩将镇丢挥专扔装美返页变桌赠送钻礼商店已领券充月词及副本荡可张马激卸载彩虹功章节即累计失败还没仅观请先完据档今登录制错误交异常检剧情够摧抽足吧径堵!补余剩需备无困难模狱明再满其他该兑码入铜英雄斧弓沙阎吸尘酷炫猎人以与要材搭全益把锐比投掷贯弯处卷残般妖杖钉耙显握簿审判众操纵寒签银黄铂耀宗者稀享尽叫森漠优摆蜘蛛禽漩涡狐狸巫注会但响知刮起狂魅惑你临继工作版更轮择、敬戴七十快折拥荐饿…吃桀别怕温柔滚菜食类末逃撕延闯易统立短冷却兽语靠往暂停弃只差至虽然也音乐震侧边栏都甲城挂越积务列表否?己丰厚预览世站传说堆唯丧尸言简宠邀培养钥匙馨感着℃浓逐渐覆抵抗昼夜许些修此筑?排名魔描述农牢笼捕劳男刻利援榴莲帮助理且主屏幕右滑哦恭喜您去哈奇螃蟹乌龟梅鹿狗焰狮猫熊鹰烈羊驼押雇佣闹帘蓬凡拘伸腾而断急漫针齿池链吞噬递君归心百施掌叶圣根牙留住啃半李靖巡逻父深翻协瑶赐共庭娘霆轰顶掣切割缉拿承祝从梭×&征唔溜痛粗种细镶嵌尚醒永久鉴库步私货噻称售罄被惊圆矩拷贝糕客料喽爱繁한국어にほんごñçрускийязыí像榜';曲代调参控坐环境构求镜夹^\$~`🚫➡️报允缓密例压缩适缺件寸居钩监听事颜;则忽略宽相拐平采样绘帧端议~总避遍历固循旧截那实沿播竖管记板索克隆擦案轴储维供渲染各函须致若按改含象垂倾斜填跟偏附惯执型拟布<殊裁剪毕这写某义印序因元约负摸抬肯做创话删竟驱怼防哎呢候才想善啊艹坑👈👉罕况套志识钮依赖销证界粒擎核阻纹─缘浮跃→老烟傻撒奥斯刚尝试集源串废址拉隐摘仍读跑缀早跨逆赋访插联键邻顺骤弦↔谁煮肉饭找滤均洗拽很突声锚欧析策价拓扑占纯测热氏钳署照由航途朝业规独轻「」溯考旁曼顿估假塞校恰桶赶拦服聚迟抑硬绑卖荷塔挡扣绪兜栈勿队零—另互槽询丹稍叠爪囚际污乘芭蕉贡献封划汇瞬墙毫竞碰撞拍漏盒脱威胁蟠剔筛≤°贪济扁决垮史莱姆厂典宿责订阅迭螺倒漂爬匀涉兼昧腰亦批举架抖微份职演绕络户探厅偿≥便绎聊智警慢佳贴幂拼捷±绝壳›险铺拔刘译¥₩﷼坏遮句棋–仿抢棵拆拒骰饰撤疫妙偷恒遗挪斥答“亮”晋闩闲驻磁峰泵曾纠脏诊Σ伪较欠挤姿罩淡旦孤委托辨律踢丁露故晚稳员鸿付脑裸亿兆垓秭穰沟涧阿祇思什么论似科季尔弧耦浏虑 【】幡诗幻椭抓暗珊瑚座墨朵耳哮犬隙丞奔灞葫芦帅猩猿魈浪臂鱼鸟喷谛玲珑扭书骼宵摊婆饼霜诛芒舌菩昭晶财灯破糊§©®™←↑↓●■◆▲▼★☆○《》『』〈〉‘’¥£¢∞℉干扰迷族戟灾厄仓钢镔刃莫邪吴敖玄罗笑赢挣宅掘麾振鼓沉村匠枝柳凑净搬孩岂肆犯脉畏惧碧侵溃捍卫幽冥踏讨伐泉奈忘彻旗扬鸣辈秩严辱崩蓄驭驰祭颗伙蔓践陷吼猜藤叹伞烁缝臭草袈裟禅救帽嘴泪啦鹅姐奶荧溅巴筒赫柱摔炮雹甜窜陀昨款掰野练习削罢捡趁棉昊田既紧账冤募鼋犀腿掏粪熔炉涂僵焊研洞拳皇丑潮冠珍淇淋鼍虎贼鼠蛮豕卒鳝貉貂豹鲤鳌蜃戾煞魄伥蟾蚌蛇螭守魇怨祟夔犼欲蝎魉魍魑魃猊狼獐獾猢獬蚣盗凶蛊嗔痴胖锤鬃毛颚祥育抱富爷呆妇拾荒壮髦病丝糖贸市堂翅篮摇俑厨烤夫吐虫猕劫涌鹏宴洪寅岭峦佛祖寇潜焚罴傲猁兔丈鳞蟒梁凰妄赛岁辟尊眉袍膀俯隼弄洛阳仇捞粮滋杆催铃勾详坊荆撑睛街陋搜厉努医船锅胳膊梯阱楼希望攀松阈悬瞄崖鸡哥蝉兹蔽遭贬胎亲逢叉陡渡庄捎銮殿摄赌祛兴遇伏婚琵琶苦棘吟咏诸柿衕秽朱拯疲癃脸>油 奏竹蜻蜓罚最叆(¤šº¾è¡¨‰˜­¯ªé»Œä¸Žž½‹³‡‚¹Ÿ„Šƒã•µ²¿¦«´¬�纳¶借肩摩裙室烂药洁骑磨稻拇彪院氛蜂窝睁汤缸苗骷髅粉呜又究怎丘房卧凤郡钯捉竺凌遥席噼啪脆捆办央馆谷社郊民隧宾炼溶峡坝碑坟煤酒葬寺庙坍塌艺舍蔬棚钓洲豪华邮赴糟谢训勤吗穷怀疑她迹嗯垃圾肥米杂锻拣冶堡软锯廓颠尬泄司咪簇匕溢灼沫镖秘坚椅炒床煎娃械茶筝票雕塑凉亭乒乓柜筋桩墩篓纸枯凳韩伯✅🌍菱橘蛙∈映盆栽砖躺毯闸吊泥坛厢舰琴瓷咨筐茅屋岗弥勒饵灶植恐蛋裹墓棺烛罐帐篷介绍赚衣嫌喇叭梦媚玻璃傅咸绳赎罪慌汗坠忆担挽念蒸弗兰伦裤梨斑斓啥晓闻囤顾宣柴秀滩腐蚀畜淬晃喝爽噩团曝砧壁沾瘦矮陆帆鞋察筷哇桂鸭媒咖啡麻辣蜜盛聘企洽谈佬诚彼悔恨逼妹骗惨亏篑捧爸俊杰董宏伟碗瓶膏纫秋扳醋翡翠檀唱仪偶洋饮鲜簪杯镯谱剂抹轿芯壶党胶冬苁蓉枸杞茸漱皂苷杉醇凝奢健宋酿啤斛燕午餐麦脂豆芝墅麝胆杏铸膜蚕瑞沈舟珩楚慕萧婉疏秦阮禾辞官溪陈沐桐翊辰赵予郑冯眠沅曦邓曹宇泽峻熙嘉铭彦郭春棠芽雀柚瓮琛郁柠徐叙舒胡袁吕卢蒋蔡贾魏薛潘杜澄奕尧弈敢嚣扛搞霞蹭斤兄弟饶痒喉咙捏饥渴耐喊滥谨慎阀崛争淘违迫扶融埃碾瓜汪康娱叮蚁休迪驾驶讯宙酱蚂堪钞暖拜泰窦诉郎砒焖肝晦贱股陪俩谋祸眨誓妈瘫艾吓贷懂轨敲呀踹姓债骂篡忙扯淑芬郝丫惹歹屈胸哼撩耍嘛羞嘿祈奋耻聪挺欺叔尴茬良奸谍殴崽葱嘞麒麟赔瞧肾蚝咱辆佩势荣苛抚咬劝泼烦屁挨揍跪孕嗨愿卑鄙厕掐脖稽扎仔甩忍刹砰嫂妮拱磕逞醉薇胞恩槌袒宜耽撬丽莎暧愉渣骆蹲昂朴贿赂瞎廊妻夺嫩卓祎悄浑捣租掩啰衡遣辛盯趴凭蹋辅劲窃纪涨趋氓馁恼犒磊噪舵筹瞒趟德缠患裕舅涩菲揽矛谅趣朋寨懒促恙憋咎懈怠犊谓呗唧届躲勇拭夸鞠躬瘁癖傍巧芸叛囊蠢舆熟酵织搅搁措诺眈颈幺蛾薪妨跌犹豫乞丐俱嘲掺撼逛忧怒奠伍枉惜昏寄冒雅觑喘呈瓢吵娜惠峥嵘耕塘芳桑柄槛盈衔渍嘟愤浴巾咔肘咚暑衅膝皱馒咀嚼撇盔铠莉搂捂袱盹讶肿龇杠鸦肚嘻挠旅侦呲羽掸酥掳椒玫瑰滕巅浩孟夕疼悉缮窍拎裆靡萌辉煌倡廉擘亨寡滨劣掀萨噶歌伴革殖侄腻愁姨诽谤甚仁悦栋诅咒缴瘟屎诬诱谣灌澡嫣蟑螂猖呦逾潇洒诈妥碳唉湘刁爹辜庞嫁贤牺牲垄愧乖逮惺怜乎嘱咐貌恳疯伎霉兮崴踝绷妞蕾勉瞌仆苍坯贫漆笨纽遵驳悠酸揉捶伺哭嘎绩晨赞愣渠屉肺昆仑炎ÄÖÜöüßàùêâîôûаАЯЁёìÍÌÁÀáÉÈÒÓòóŐőÙÚŰúűÑÆÃÂÔõěčřýůťďňĚČŘŤżźśńłęćąŻŹŚŃŁĘĆĄảạăắằẳẵặấầẩẫậẻẽẹếềểễệỉĩịỏọốồổỗộơớờởỡợủũụưứừửữựỳỷỹỵđẢẠĂẮẰẲẴẶẤẦẨẪẬẺẼẸÊẾỀỂỄỆỈĨỊỎÕỌỐỒỔỖỘƠỚỜỞỠỢỦŨỤƯỨỪỬỮỰÝỲỶỸỴĐ😉🚗哟噢井玛喂弊括祗仕盲≈沼披畅÷敏蝇酣漓昵汉鞭θ怖咩评锹苹飙⚠❌👇⚡🔄💡級镂穴窄矫①②惩逗迁综惰滴尤侣拧∩−仰皆褐③④挫盟枭埋羁绊岛≠瓣膨胀泛俸禄政吾擂徒・庐揭薄篇≫哨佐瞻蹦Δ浅凸掠垫拢擅匿碌剥申寂寞烘焙 \ No newline at end of file diff --git a/assets/script/battle/bag/BattleBagSession.ts b/assets/script/battle/bag/BattleBagSession.ts index 0f8639c..11ae2a6 100644 --- a/assets/script/battle/bag/BattleBagSession.ts +++ b/assets/script/battle/bag/BattleBagSession.ts @@ -44,6 +44,7 @@ import type { BagRollEntry } from './BagWeaponPool'; import { buildGmWeaponPresetQueue } from '../debug/GmBattlePreset'; import type { ProjectBattleHandle } from '../runtime/BattleRuntime'; import { TableNames } from '../../game/ConfigTableData'; +import { ConstNumType } from '../../game/GameDataEnums'; import { RankDataManager } from '../../manager/RankDataManager'; import type { DailyShopParsed } from '../../manager/DailyShopTypes'; import { @@ -100,6 +101,14 @@ export class BattleBagSession { * @param ownerPlayerId 归属玩家 */ onUnlockCoinFly: ((gridIndex: number, coin: number, ownerPlayerId: number) => void) | null = null; + /** + * 数字拖垃圾桶回收发金币后(金币已入账;飞币等字飞到垃圾桶后再播)。 + * @param gold 本次金币 + * @param ownerPlayerId 归属玩家 + */ + onGlyphRecycleGold: ((gold: number, ownerPlayerId: number) => void) | null = null; + /** 待播飞币的回收金币(入账后写入,飞到 ui_delete 播完清零) */ + pendingRecycleGoldFx = 0; /** * 三选一回调:铲子铲开宝箱格后触发(dugChestCount 为本局已铲宝箱数)。 * @param ownerPlayerId 归属玩家 @@ -942,13 +951,16 @@ export class BattleBagSession { } /** - * 地图字拖到 ui_delete 时删掉,不退回字池。 + * 地图字拖到 ui_delete 时删掉,不退回字池;数字回收发 Const39 金币。 * @param gridIndex 来源地图格 */ discardMapGlyph(gridIndex: number): boolean { + const tile = this.merge.map.getTile(gridIndex); + const weapon2Id = tile?.weapon2Id ?? 0; const before = this.merge.map.getCellKind(gridIndex); const ok = this.merge.discardDraggedMapGlyph(gridIndex); if (!ok) return false; + this._tryGrantGlyphRecycleGold(weapon2Id); const next = this.merge.map.getCellKind(gridIndex); if (this._walkabilityChanged(before, next)) { const becameBlocked = before === MapCellKind.Walkable && next !== MapCellKind.Walkable; @@ -961,7 +973,7 @@ export class BattleBagSession { } /** - * 背包字拖到 ui_delete 时删掉,不退回字池。 + * 背包字拖到 ui_delete 时删掉,不退回字池;数字回收发 Const39 金币。 * @param slotIndex 来源槽 */ discardBagSlot(slotIndex: number): boolean { @@ -970,11 +982,46 @@ export class BattleBagSession { console.log('[BattleBagSession] 空槽无法删除', slotIndex); return false; } + const weapon2Id = rec.weapon2Id; this.merge.bag.clearSlot(slotIndex); + this._tryGrantGlyphRecycleGold(weapon2Id); GEvent.Ins.emit(GEvent.UpdateBestPlace); return true; } + /** + * 五行数字回收:读 Const39 加金币并通知飞币。 + * @param weapon2Id Text.id + */ + private _tryGrantGlyphRecycleGold(weapon2Id: number): void { + const wid = Math.floor(Number(weapon2Id) || 0); + if (wid <= 0) return; + const w2Type = WeaponComposeConfigProvider.instance.getWeapon2Type(wid); + if (!isElementGlyphType(w2Type)) return; + if (typeof gg === 'undefined' || !gg.data?.table?.getConst) { + console.warn('[BattleBagSession] 回收金币:gg.data.table 未就绪'); + return; + } + const gold = Math.floor(Number(gg.data.table.getConst(ConstNumType.GlyphRecycleGold)) || 0); + if (gold <= 0) { + console.warn('[BattleBagSession] Const39 回收金币无效', gold); + return; + } + const battle = gg.game?.CurentBattle as ProjectBattleHandle | null | undefined; + const slot = battle?.session?.players?.[this._ownerPlayerId] + ?? (this._ownerPlayerId === 0 ? battle?.localSlot : undefined); + if (!slot) { + console.warn('[BattleBagSession] 回收金币:player slot 缺失', this._ownerPlayerId); + return; + } + slot.addGold(gold); + if (this._ownerPlayerId === (battle?.localPlayerId ?? 0)) { + battle.CurentCoinNum = slot.gold; + } + this.pendingRecycleGoldFx = gold; + this.onGlyphRecycleGold?.(gold, this._ownerPlayerId); + } + drop(source: DragSource, target: DropTarget): PlaceRejectReason | null { const toolHit = this._tryApplyBagTool(source, target); if (toolHit !== 'skip') { diff --git a/assets/script/battle/view/CocosBagBoardView.ts b/assets/script/battle/view/CocosBagBoardView.ts index ae5528c..0ad7fca 100644 --- a/assets/script/battle/view/CocosBagBoardView.ts +++ b/assets/script/battle/view/CocosBagBoardView.ts @@ -137,6 +137,8 @@ export class CocosBagBoardView { private _bagList: Node | null = null; /** 拖字删除落点(BattleGame ui_delete) */ private _deleteNode: Node | null = null; + /** 字飞到垃圾桶后播回收金币飞币 */ + private _onRecycleGoldFx: ((gold: number) => void) | null = null; /** ui_textList 开启 / 待解锁 / 未解锁 */ private readonly _land = new TextListLandHost(); /** 开格展示字块补显重试帧计数(textGrid 预制体异步加载未就绪时留空格) */ @@ -1316,6 +1318,14 @@ export class CocosBagBoardView { this._deleteNode = node?.isValid ? node : null; } + /** + * 字飞到垃圾桶后播回收金币飞币。 + * @param handler 入账金币数量;传 null 清除 + */ + setRecycleGoldFxHandler(handler: ((gold: number) => void) | null): void { + this._onRecycleGoldFx = handler; + } + bind( battle: ProjectBattleHandle, map: MapManager, @@ -1497,6 +1507,7 @@ export class CocosBagBoardView { this.setInkstoneWorldPosProvider(null); this.setOtherBagAnchor(null); this.setDeleteNode(null); + this.setRecycleGoldFxHandler(null); this.setBagEntranceHandler(null, null); this.setSkillPeachFlyHandler(null); this.setAfterShovelDig(null); @@ -4299,7 +4310,7 @@ export class CocosBagBoardView { } /** - * 飞到 ui_delete 后回收字块,并补上推迟的盘面刷新。 + * 飞到 ui_delete 后回收字块,并补上推迟的盘面刷新;有回收金币则播飞币。 * @param grid 飞行中的字 */ private _finishDiscardFlight(grid: TextGrid): void { @@ -4309,6 +4320,16 @@ export class CocosBagBoardView { this._flushAllPendingRebuilds(); this._refreshDragEnabled(); this._refreshCanUpgradeHints(); + this._playPendingRecycleGoldFx(); + } + + /** 字到达垃圾桶后,消费 pendingRecycleGoldFx 播飞币。 */ + private _playPendingRecycleGoldFx(): void { + const session = this._bagSession; + const gold = Math.floor(Number(session?.pendingRecycleGoldFx) || 0); + if (!session || gold <= 0) return; + session.pendingRecycleGoldFx = 0; + this._onRecycleGoldFx?.(gold); } /** diff --git a/assets/script/battle/view/TextListLandHost.ts b/assets/script/battle/view/TextListLandHost.ts index 92d585e..f6cebb8 100644 --- a/assets/script/battle/view/TextListLandHost.ts +++ b/assets/script/battle/view/TextListLandHost.ts @@ -35,7 +35,7 @@ export interface TextListPromoteResult { * 按关卡 normalland / tolockland 管理 ui_textList 格子状态与拖入解锁。 * normalland 为开启且开局不放字;tolockland 为待开启(有字、不能拖、靠同类型同等级合成打开)。 * 待开启被合成后自身变为开启,上下左右的未解锁格变为待开启。其余为未解锁。 - * 每局记录解锁次数,bind 时清零。第 1 次读 Const 39 的 index 0,依次类推;超出则用最后一项。 + * 每局记录解锁次数,bind 时清零。第 1 次读 Const26(UnlockLandLevelAdd)的 index 0,依次类推;超出则用最后一项。 * 该加值累加到本次上下左右新待解锁格的数字等级上。 * grid1-24 都是普通地块(含 grid17、grid23、grid24)。名为 temp 的节点跳过。 * 格子上的字块是背包槽位数据(BattleBagSession),由视图按槽位记录生成标准 TextGrid; @@ -52,7 +52,7 @@ export class TextListLandHost { private readonly _open: number[] = []; /** 待解锁下标(开启但不能拖) */ private readonly _gate: number[] = []; - /** 本局已解锁次数;bind / clear 清零。下次解锁用这个下标读 Const 39 */ + /** 本局已解锁次数;bind / clear 清零。下次解锁用这个下标读 Const26 */ private _unlockCount = 0; /** 最近一次解锁的邻格等级加值,供本条解锁日志使用 */ private _lastLevelAdd = 0; diff --git a/assets/script/game/GameDataEnums.ts b/assets/script/game/GameDataEnums.ts index 257cb00..3ce9d29 100644 --- a/assets/script/game/GameDataEnums.ts +++ b/assets/script/game/GameDataEnums.ts @@ -566,6 +566,8 @@ export enum ConstNumType { BattleBuffAdRefreshCount = 37, /** 关卡技能宝箱个数 para */ BattleDigChestCount = 38, + /** 数字拖垃圾桶回收获得金币 para */ + GlyphRecycleGold = 39, } export enum TaskType { diff --git a/assets/script/ui/BattleFail/UIBattleFail.ts b/assets/script/ui/BattleFail/UIBattleFail.ts index a84d35f..83dbd6f 100644 --- a/assets/script/ui/BattleFail/UIBattleFail.ts +++ b/assets/script/ui/BattleFail/UIBattleFail.ts @@ -33,6 +33,10 @@ export class UIBattleFail extends Auto_BattleFail { private _coinFly: BattleSuccessCoinFlyPresenter | null = null; /** 领取流程中 */ private _claiming = false; + /** 打开结算时缓存的波次(广告回调时 CurentBattle 可能已空) */ + private _settleWaveNum = 1; + /** 打开结算时缓存的关卡 id */ + private _settleLevelId = 0; /** 降星动画目标 index(star1~star5) */ private _starDropIndex = 0; /** 降星动画结束后星条点亮数 */ @@ -71,22 +75,24 @@ export class UIBattleFail extends Auto_BattleFail { onInit(): void { this.addNum = 1; this._claiming = false; - this.btnGet.active = true; - this.btnADGet.active = true; + const battle = gg.game.CurentBattle; + this._settleWaveNum = Math.max(1, Math.floor(Number(battle?.CurentWaveNum) || 1)); + this._settleLevelId = Math.floor(Number(battle?.LevelConfigId) || gg.game.CurentSelectLevelId || 0); + if (this.btnGet?.isValid) this.btnGet.active = true; + if (this.btnADGet?.isValid) this.btnADGet.active = true; BattleAudio.playFail(); const starsBefore = RankDataManager.getPlayerRankStars(); - MatchWinStats.record(false, gg.game.CurentBattle?.opponentRankId ?? 0); + MatchWinStats.record(false, battle?.opponentRankId ?? 0); gg.sdk.reportDY('inLevel', `${gg.game.getReportDYRankLabel()}-失败`); void this._refreshRankUi(starsBefore); - if (gg.game.CurentBattle.LevelConfigId == gg.game.CurentSelectLevelId) { + if (this._settleLevelId === gg.game.CurentSelectLevelId) { gg.data.setStatistics(StatisticsType.SuccessContinuousCount, 0); } - const curWaveNum = gg.game.CurentBattle.CurentWaveNum; - gg.sdk.reportDY("inLevel", `${gg.game.getReportDYBattleCountLabel(curWaveNum)}-过关失败`); + gg.sdk.reportDY("inLevel", `${gg.game.getReportDYBattleCountLabel(this._settleWaveNum)}-过关失败`); const levelId = gg.sdk.get30rLevelId(); gg.sdk.report30r('LEVEL_LOSE', { level_id: levelId, @@ -99,7 +105,7 @@ export class UIBattleFail extends Auto_BattleFail { this._refreshMoneyDisplay(); this._refreshCoinRewardDisplay(); - if (!gg.game.CurentBattle.IsWatchAd && gg.game.CurentSelectLevelId >= 3) { + if (!battle?.IsWatchAd && gg.game.CurentSelectLevelId >= 3) { gg.sdk.showInterstitialAd(() => { }, () => { }, true); } } @@ -198,7 +204,15 @@ export class UIBattleFail extends Auto_BattleFail { /** 仅发放表配 loserreward;局内击杀掉落失败不获得 */ showReward(): void { - const levelId = gg.game.CurentBattle.LevelConfigId; + const levelId = this._settleLevelId > 0 + ? this._settleLevelId + : (gg.game.CurentBattle?.LevelConfigId ?? gg.game.CurentSelectLevelId); + if (!(levelId > 0)) { + console.warn('[BattleFail] 结算奖励缺少关卡 id'); + this._pendingCoin = 0; + this._dataList = []; + return; + } const rewardStr = gg.data.project.getLevelRewardStr(levelId, false); if (!rewardStr) { console.log('[BattleFail] Level 无 loserreward', levelId); @@ -272,8 +286,7 @@ export class UIBattleFail extends Auto_BattleFail { click_btnGet(): void { if (this._claiming) return; - const curWaveNum = gg.game.CurentBattle.CurentWaveNum; - gg.sdk.reportDY("inLevel", `${gg.game.getReportDYBattleCountLabel(curWaveNum)}-失败领取奖励`); + gg.sdk.reportDY("inLevel", `${gg.game.getReportDYBattleCountLabel(this._settleWaveNum)}-失败领取奖励`); this._claimWithCoinFly(); } @@ -281,8 +294,8 @@ export class UIBattleFail extends Auto_BattleFail { private _claimWithCoinFly(): void { if (this._claiming) return; this._claiming = true; - this.btnGet.active = false; - this.btnADGet.active = false; + if (this.btnGet?.isValid) this.btnGet.active = false; + if (this.btnADGet?.isValid) this.btnADGet.active = false; const coinGain = Math.floor(this._pendingCoin * this.addNum); const icon = this._coinIconNode(); @@ -321,19 +334,22 @@ export class UIBattleFail extends Auto_BattleFail { if (!this.isValid) return; this._claiming = false; gg.game.returnedFromBattleFail = true; - gg.game.returnedFromBattleFailChapterId = gg.game.CurentBattle.LevelConfigId; + const levelId = this._settleLevelId > 0 + ? this._settleLevelId + : (gg.game.CurentBattle?.LevelConfigId ?? gg.game.CurentSelectLevelId); + gg.game.returnedFromBattleFailChapterId = levelId; gg.game.enterMain(UIID.Home); } click_btnADGet(): void { if (this._claiming) return; gg.sdk.showVideoAd((res) => { + if (!this.isValid) return; if (res) { - const curWaveNum = gg.game.CurentBattle.CurentWaveNum; - gg.sdk.reportDY("inLevel", `${gg.game.getReportDYBattleCountLabel(curWaveNum)}-AD-失败双倍领取奖励`); + gg.sdk.reportDY("inLevel", `${gg.game.getReportDYBattleCountLabel(this._settleWaveNum)}-AD-失败双倍领取奖励`); this.addNum = 2; this._refreshCoinRewardDisplay(); - gg.game.CurentBattle.IsWatchAd = true; + if (gg.game.CurentBattle) gg.game.CurentBattle.IsWatchAd = true; this._claimWithCoinFly(); } else { gg.ui.showToast('观看视频失败'); diff --git a/assets/script/ui/BattleGame/BattleGameKillPeachPresenter.ts b/assets/script/ui/BattleGame/BattleGameKillPeachPresenter.ts index 46c8bf0..def0d98 100644 --- a/assets/script/ui/BattleGame/BattleGameKillPeachPresenter.ts +++ b/assets/script/ui/BattleGame/BattleGameKillPeachPresenter.ts @@ -1,44 +1,38 @@ import type { EntityId } from 'db://assets/mx/module/battle'; +import type { Vec3 } from 'cc'; import { BattleBuffCarryStore } from '../../manager/battleBuff/BattleBuffCarryStore'; import { rollCarriedKillCoinBonus } from '../../manager/battleBuff/BattleBuffPassiveSkillUtil'; import type { ProjectBattleHandle } from '../../battle/runtime/BattleRuntime'; -import type { CocosBagBoardView } from '../../battle/view/CocosBagBoardView'; -import type { BattlePeachCoinFlyPresenter } from './BattlePeachCoinFlyPresenter'; /** * 赏金令:击杀小怪概率额外金币飞币表现。 */ export class BattleGameKillPeachPresenter { private _battle: ProjectBattleHandle | null = null; - private _bagView: CocosBagBoardView | null = null; - private _coinFly: BattlePeachCoinFlyPresenter | null = null; - private _resolveDeathWorldPos: ((victim: EntityId) => import('cc').Vec3 | null) | null = null; + private _playLocalCoinFly: ((fromWorld: Readonly, amount: number) => void) | null = null; + private _resolveDeathWorldPos: ((victim: EntityId) => Vec3 | null) | null = null; /** * 绑定击杀事件上下文。 * @param battle 战斗 - * @param bagView 棋盘 - * @param coinFly 飞币 + * @param playLocalCoinFly 本机飞币(挂起 UI,到达后刷新) * @param resolveDeathWorldPos 死亡世界坐标 */ bind( battle: ProjectBattleHandle, - bagView: CocosBagBoardView | null, - coinFly: BattlePeachCoinFlyPresenter | null, - resolveDeathWorldPos: (victim: EntityId) => import('cc').Vec3 | null, + playLocalCoinFly: (fromWorld: Readonly, amount: number) => void, + resolveDeathWorldPos: (victim: EntityId) => Vec3 | null, ): void { this.unbind(); this._battle = battle; - this._bagView = bagView; - this._coinFly = coinFly; + this._playLocalCoinFly = playLocalCoinFly; this._resolveDeathWorldPos = resolveDeathWorldPos; } /** 解除绑定 */ unbind(): void { this._battle = null; - this._bagView = null; - this._coinFly = null; + this._playLocalCoinFly = null; this._resolveDeathWorldPos = null; } @@ -55,13 +49,12 @@ export class BattleGameKillPeachPresenter { if (ownerId !== battle.localPlayerId) return; const bonus = rollCarriedKillCoinBonus(BattleBuffCarryStore.getPassives(ownerId)); if (bonus <= 0) return; + battle.addPlayerGold(ownerId, bonus); const from = this._resolveDeathWorldPos?.(victim); if (!from) { console.log('[KillCoin] 击杀额外金币无死亡坐标', victim); - battle.addPlayerGold(ownerId, bonus); return; } - this._coinFly?.playKillDrop(from, bonus); - battle.addPlayerGold(ownerId, bonus); + this._playLocalCoinFly?.(from, bonus); } } diff --git a/assets/script/ui/BattleGame/BattlePeachCoinFlyPresenter.ts b/assets/script/ui/BattleGame/BattlePeachCoinFlyPresenter.ts index 3815867..7633fa1 100644 --- a/assets/script/ui/BattleGame/BattlePeachCoinFlyPresenter.ts +++ b/assets/script/ui/BattleGame/BattlePeachCoinFlyPresenter.ts @@ -30,8 +30,6 @@ const PLUS_CHILD = 'dropPlusOne'; export class BattlePeachCoinFlyPresenter { private _moneyNode: Node | null = null; private _flyLayer: Node | null = null; - private _flyPending = 0; - private _flyComplete: (() => void) | null = null; /** 掉落 +1 飘字 */ private readonly _plusQueue: Node[] = []; /** 波次金币还待生成的枚数 */ @@ -52,6 +50,8 @@ export class BattlePeachCoinFlyPresenter { private _waveSpawnFinished = false; /** 正在冒出并等待一起飞 */ private _waveAwaitFly = false; + /** 波次金币全部飞到 btnCoin 后回调 */ + private _waveOnAllArrived: (() => void) | null = null; /** 绑定飞向目标(btnCoin/金币)与飞行层(ui_fly) */ bind(moneyNode: Node | null | undefined, flyLayer: Node | null | undefined): void { @@ -65,8 +65,7 @@ export class BattlePeachCoinFlyPresenter { this._recycleAllPlus(); this._moneyNode = null; this._flyLayer = null; - this._flyPending = 0; - this._flyComplete = null; + this._waveOnAllArrived = null; } /** @@ -109,19 +108,23 @@ export class BattlePeachCoinFlyPresenter { * @param startWorld 起点世界坐标 * @param showGold 单枚金币上的显示数量 * @param count 生成枚数 + * @param onAllArrived 全部到达 btnCoin 后回调 */ - playWaveCoin(flyLayer: Node, startWorld: Readonly, showGold: number, count: number): void { + playWaveCoin(flyLayer: Node, startWorld: Readonly, showGold: number, count: number, onAllArrived: (() => void) | null = null): void { if (!flyLayer?.isValid) { console.log('[BattlePeachCoinFly] 波次金币缺少 ui_fly'); + onAllArrived?.(); return; } const amount = Math.floor(showGold); const flyCount = Math.floor(count); if (!(amount > 0) || !(flyCount > 0)) { console.log('[BattlePeachCoinFly] 波次金币数量非法', showGold, count); + onAllArrived?.(); return; } this._stopWaveSpawn(); + this._waveOnAllArrived = onAllArrived; this._waveLeft = flyCount; this._waveShowGold = amount; this._waveLayer = flyLayer; @@ -197,11 +200,22 @@ export class BattlePeachCoinFlyPresenter { const end = money?.isValid ? money.worldPosition.clone() : null; const coins = this._takeWaveCoins(); this._clearWaveSpawn(); + const done = this._waveOnAllArrived; + this._waveOnAllArrived = null; if (!end) { console.log('[BattlePeachCoinFly] 波次金币缺少飞向目标'); for (let i = 0; i < coins.length; i++) this._recycleWaveCoin(coins[i]); + done?.(); return; } + const batch = { left: 0 }; + const onOneDone = (peach?: Node): void => { + if (peach?.isValid) this._putPlusChild(peach); + batch.left--; + if (batch.left > 0) return; + done?.(); + GEvent.Ins.emit(GEvent.UpdateGameCoinNum); + }; for (let i = 0; i < coins.length; i++) { const node = coins[i]; if (!node?.isValid) continue; @@ -210,8 +224,10 @@ export class BattlePeachCoinFlyPresenter { this._recycleWaveCoin(node); continue; } - comp.flyTo(end, this._onPeachDone); + batch.left++; + comp.flyTo(end, onOneDone); } + if (batch.left <= 0) done?.(); } /** @@ -260,6 +276,9 @@ export class BattlePeachCoinFlyPresenter { const coins = this._takeWaveCoins(); for (let i = 0; i < coins.length; i++) this._recycleWaveCoin(coins[i]); this._clearWaveSpawn(); + const done = this._waveOnAllArrived; + this._waveOnAllArrived = null; + done?.(); } /** 清空波次金币生成状态,不回收已经开始飞行的金币 */ @@ -273,21 +292,26 @@ export class BattlePeachCoinFlyPresenter { } /** - * 击杀掉落飞桃:先弹跳再飞向 ui_money,不占用回收完成回调。 + * 击杀掉落飞桃:先弹跳再飞向 btnCoin。 * @param startWorld 死亡世界坐标 * @param peachCount Monster.peach + * @param onAllArrived 全部到达后回调(刷新金币 UI) */ - playKillDrop(startWorld: Readonly, peachCount: number): void { - if (peachCount <= 0) return; + playKillDrop(startWorld: Readonly, peachCount: number, onAllArrived: (() => void) | null = null): void { + if (peachCount <= 0) { + onAllArrived?.(); + return; + } BattleAudio.playCoinFly(); - const n = this._spawnCoinFlies(startWorld.clone(), peachCount, null, true); + const n = this._spawnCoinFlies(startWorld.clone(), peachCount, onAllArrived, true); if (n <= 0) { console.log('[BattlePeachCoinFly] 击杀掉桃未生成'); + onAllArrived?.(); } } /** - * AI 击杀掉落:原地弹跳后回池,不飞向本机 ui_money。 + * AI 击杀掉落:原地弹跳后回池,不飞向本机 btnCoin。 * @param startWorld 死亡世界坐标 * @param peachCount Monster.peach */ @@ -300,38 +324,33 @@ export class BattlePeachCoinFlyPresenter { } /** - * 乾坤袋回收:与怪物死亡产桃相同(coinFly 弹跳 + battleText「+1」飞向 ui_money)。 + * 乾坤袋回收:与怪物死亡产桃相同(coinFly 弹跳 + battleText「+1」飞向 btnCoin)。 * @param startWorld 起点世界坐标 * @param peachCount 回收蟠桃数量 - * @param onAllArrived 全部到达 ui_money 后回调 + * @param onAllArrived 全部到达 btnCoin 后回调 */ playRecycleFromWorld(startWorld: Readonly, peachCount: number, onAllArrived: () => void): void { this.playFromWorld(startWorld, peachCount, onAllArrived); } - /** 从世界坐标飘仙桃到 ui_money(coinFly,多枚) */ + /** 从世界坐标飘仙桃到 btnCoin(coinFly,多枚) */ private _playFromWorldStart(startWorld: Vec3, peachCount: number, onAllArrived: () => void): void { - this._flyPending = 0; - this._flyComplete = onAllArrived; - const spawned = this._spawnCoinFlies(startWorld, peachCount, this._onOneCoinFlyArrived.bind(this), true); - if (spawned <= 0) { - this._flyComplete = null; - onAllArrived(); - } + const spawned = this._spawnCoinFlies(startWorld, peachCount, onAllArrived, true); + if (spawned <= 0) onAllArrived(); } /** - * 生成 coinFly:先原地弹跳;toMoney 时再飞向 ui_money。 + * 生成 coinFly:先原地弹跳;toMoney 时再飞向 btnCoin。每批独立计数,可并发。 * @param startWorld 起点 * @param peachCount 桃子数量 - * @param onArrive 单枚到达;击杀掉落可空 - * @param toMoney 是否飞向本机 ui_money + * @param onAllArrived 本批全部到达;可空 + * @param toMoney 是否飞向本机 btnCoin * @param flySec 飞向终点时长;≤0 为击杀掉落的短飞行 * @param layer 指定父节点;缺省用已绑定的飞行层 * @param plusText 金币上的数字;缺省为击杀掉落的 +1 * @param maxCount 本次最多生成枚数;波次结算按配置次数,击杀掉落沿用上限 */ - private _spawnCoinFlies(startWorld: Vec3, peachCount: number, onArrive: (() => void) | null, toMoney: boolean, flySec = 0, layer: Node | null = null, plusText = '+1', maxCount = MAX_FLY_COUNT): number { + private _spawnCoinFlies(startWorld: Vec3, peachCount: number, onAllArrived: (() => void) | null, toMoney: boolean, flySec = 0, layer: Node | null = null, plusText = '+1', maxCount = MAX_FLY_COUNT): number { const flyLayer = layer?.isValid ? layer : this._flyLayer; const moneyNode = this._moneyNode; if (!flyLayer?.isValid) { @@ -346,7 +365,14 @@ export class BattlePeachCoinFlyPresenter { const endPos = toMoney && moneyNode?.isValid ? moneyNode.worldPosition.clone() : null; const flyCount = Math.min(Math.max(1, Math.floor(peachCount)), Math.floor(maxCount)); - let spawned = 0; + const batch = { left: 0 }; + const onOneDone = (peach?: Node): void => { + if (peach?.isValid) this._putPlusChild(peach); + batch.left--; + if (batch.left > 0) return; + onAllArrived?.(); + if (toMoney) GEvent.Ins.emit(GEvent.UpdateGameCoinNum); + }; for (let i = 0; i < flyCount; i++) { const node = gg.res.getNode('prefab/', 'coinFly', GBundle.BattleGame); @@ -367,12 +393,11 @@ export class BattlePeachCoinFlyPresenter { gg.res.putNode(node); continue; } - spawned++; - if (onArrive) this._flyPending++; + batch.left++; this._attachPlus(node, plusText); - comp.flyAni(endPos, this._onPeachDone, i * FLY_STAGGER_SEC, flySec); + comp.flyAni(endPos, onOneDone, i * FLY_STAGGER_SEC, flySec); } - return spawned; + return batch.left; } /** @@ -412,12 +437,6 @@ export class BattlePeachCoinFlyPresenter { this._plusQueue.push(node); } - /** 桃子动画结束:拆 +1,再走到达计数 */ - private readonly _onPeachDone = (peach?: Node): void => { - if (peach?.isValid) this._putPlusChild(peach); - if (this._flyPending > 0) this._onOneCoinFlyArrived(); - }; - /** * 从桃子上拆下 +1 并回池。 * @param peach 桃子节点 @@ -464,14 +483,4 @@ export class BattlePeachCoinFlyPresenter { node.removeFromParent(); gg.res.putNode(node); } - - /** 单枚 coinFly 到达 ui_money */ - private _onOneCoinFlyArrived(): void { - this._flyPending = Math.max(0, this._flyPending - 1); - if (this._flyPending > 0) return; - const done = this._flyComplete; - this._flyComplete = null; - done?.(); - GEvent.Ins.emit(GEvent.UpdateGameCoinNum); - } } diff --git a/assets/script/ui/BattleGame/UIBattleGame.ts b/assets/script/ui/BattleGame/UIBattleGame.ts index 9127bc3..f2d93bf 100644 --- a/assets/script/ui/BattleGame/UIBattleGame.ts +++ b/assets/script/ui/BattleGame/UIBattleGame.ts @@ -150,6 +150,8 @@ export class UIBattleGame extends Auto_BattleGame { private _illustratedHintShownThisBattle = false; /** 桃 UI 缓存,避免每帧写 Label */ private _peachUiGold = -1; + /** 已入账、飞币未到 btnCoin 的金币(显示暂不计入) */ + private _peachUiPendingFly = 0; /** 召唤消耗缓存 */ private _peachUiCost = -1; /** 金币广告已用次数缓存 */ @@ -297,6 +299,7 @@ export class UIBattleGame extends Auto_BattleGame { this._coinAdVideoIcon = this.btnCoin?.getChildByName('视频标') ?? null; this._waveUiIdx = -999; this._peachUiGold = -1; + this._peachUiPendingFly = 0; this._peachUiCost = -1; this._peachUiCoinAdUsed = -1; this._refreshPeachUi(); @@ -427,6 +430,7 @@ export class UIBattleGame extends Auto_BattleGame { console.error('[UIBattleGame] AiBattleBridge.start 异常', String(e)); } this._bindUnlockCoinFly(battle); + this._bindGlyphRecycleGold(battle); this._bindBattleBuffSelect(battle); this._bindPeerMapToolApplied(battle); this._bindDigChest(map); @@ -529,7 +533,7 @@ export class UIBattleGame extends Auto_BattleGame { const gold = this._waveSettleGold(); if (!(gold > 0)) return; battle.addPlayerGold(battle.localPlayerId, gold); - this._refreshPeachUi(); + this._holdPeachUiForFly(gold); this._playWaveSettleCoin(gold); this._grantWaveGoldToOthers(gold); } @@ -607,11 +611,13 @@ export class UIBattleGame extends Auto_BattleGame { } this._ensurePeachCoinFly(); if (!layer.active) layer.active = true; - this._peachCoinFly?.playWaveCoin(layer, layer.worldPosition, show, count); + this._peachCoinFly?.playWaveCoin(layer, layer.worldPosition, show, count, () => { + this._releasePeachUiAfterFly(gold); + }); } /** - * 击杀掉桃表现:本机飞向 ui_money;AI 归属原地弹跳(金已入 AI 槽)。 + * 击杀掉桃表现:本机飞向 btnCoin;AI 归属原地弹跳(金已入 AI 槽)。 * @param killer 击杀者 * @param victim 死亡实体 */ @@ -628,12 +634,50 @@ export class UIBattleGame extends Auto_BattleGame { } const ownerId = battle.resolveKillPeachOwnerPlayerId(killer, victim); if (ownerId === battle.localPlayerId) { - fly.playKillDrop(from, peach); + this._playLocalCoinFly(from, peach); return; } fly.playKillDropLocal(from, peach); } + /** + * 本机飞币:入账已发生,挂起 UI 数字,到达 btnCoin 后再显示。 + * @param fromWorld 起点 + * @param amount 本次金币 + */ + private _playLocalCoinFly(fromWorld: Readonly, amount: number): void { + const gold = Math.floor(Number(amount) || 0); + if (!(gold > 0)) return; + this._ensurePeachCoinFly(); + this._holdPeachUiForFly(gold); + const fly = this._peachCoinFly; + if (!fly) { + this._releasePeachUiAfterFly(gold); + return; + } + fly.playKillDrop(fromWorld, gold, () => this._releasePeachUiAfterFly(gold)); + } + + /** + * 飞币未到前暂不把新增金币画到 lb_coin。 + * @param amount 本次挂起数量 + */ + private _holdPeachUiForFly(amount: number): void { + const n = Math.floor(Number(amount) || 0); + if (!(n > 0)) return; + this._peachUiPendingFly += n; + } + + /** + * 飞币到达后解除挂起并刷新 lb_coin。 + * @param amount 本次解除数量 + */ + private _releasePeachUiAfterFly(amount: number): void { + const n = Math.floor(Number(amount) || 0); + if (n > 0) this._peachUiPendingFly = Math.max(0, this._peachUiPendingFly - n); + this._refreshPeachUi(); + } + /** * 击杀时怪物世界坐标(节点优先,否则 presenter 缓存)。 * @param victim 死亡实体 @@ -714,6 +758,7 @@ export class UIBattleGame extends Auto_BattleGame { console.log('[UIBattleGame] ui_delete 缺失,无法拖字删除'); } this._bagView.setDeleteNode(this.ui_delete); + this._bagView.setRecycleGoldFxHandler(this._onRecycleGoldFx); // bind() 开头会 unbind,入场回调必须在 bind 之后再挂 this._bagView.setOtherBagAnchor(this.ui_otherBag); this._bagView.setInkstoneWorldPosProvider(this._inkstoneWorldPos); @@ -833,9 +878,7 @@ export class UIBattleGame extends Auto_BattleGame { * @param fromWorld 金矿图标世界坐标 */ private readonly _onGoldMineCoinFly = (fromWorld: Readonly): void => { - this._ensurePeachCoinFly(); - this._peachCoinFly?.playKillDrop(fromWorld, 1); - this._refreshPeachUi(); + this._playLocalCoinFly(fromWorld, 1); }; /** AI 金矿飞币:敌方被动金矿图标原地弹跳 */ @@ -872,6 +915,50 @@ export class UIBattleGame extends Auto_BattleGame { } } + /** + * 数字拖垃圾桶回收:金币入账后刷新 UI;飞币等字飞到垃圾桶后再播。 + * @param battle 战斗 + */ + private _bindGlyphRecycleGold(battle: ProjectBattleHandle): void { + this._ensurePeachCoinFly(); + if (battle.bagSession) { + battle.bagSession.onGlyphRecycleGold = this._onGlyphRecycleGold; + } + } + + /** + * 回收金币已入账:先挂起 UI,飞币到垃圾桶后再播(见 `_onRecycleGoldFx`)。 + * @param gold Const39 数量 + * @param ownerPlayerId 归属 + */ + private readonly _onGlyphRecycleGold = (gold: number, ownerPlayerId: number): void => { + if (!(gold > 0)) return; + const battle = this._battle; + if (ownerPlayerId !== (battle?.localPlayerId ?? 0)) return; + this._holdPeachUiForFly(gold); + }; + + /** + * 字飞到垃圾桶后:从 ui_delete 弹跳飞向 btnCoin,到达后刷新数字。 + * @param gold Const39 数量 + */ + private readonly _onRecycleGoldFx = (gold: number): void => { + if (!(gold > 0)) return; + this._ensurePeachCoinFly(); + const from = this.ui_delete?.isValid ? this.ui_delete.worldPosition.clone() : null; + if (!from) { + console.warn('[UIBattleGame] 回收金币缺少 ui_delete 坐标'); + this._releasePeachUiAfterFly(gold); + return; + } + const fly = this._peachCoinFly; + if (!fly) { + this._releasePeachUiAfterFly(gold); + return; + } + fly.playKillDrop(from, gold, () => this._releasePeachUiAfterFly(gold)); + }; + /** * 地图解锁达 Const27 次数:本机弹三选一,AI 自动选。 * @param battle 战斗 @@ -1012,12 +1099,12 @@ export class UIBattleGame extends Auto_BattleGame { const fly = this._peachCoinFly; const from = this._bagView?.getMapGridWorldPosition(gridIndex); if (ownerPlayerId === battle?.localPlayerId) { - this._refreshPeachUi(); if (!from) { console.log('[UIBattleGame] 寻金尺无飞币坐标', gridIndex); + this._refreshPeachUi(); return; } - fly?.playKillDrop(from, coin); + this._playLocalCoinFly(from, coin); return; } if (!from) { @@ -1028,7 +1115,7 @@ export class UIBattleGame extends Auto_BattleGame { }; /** - * 技能产桃:本机 coinFly 飞向 ui_money;敌方格心 coinFly 原地弹跳后回池。 + * 技能产桃:本机飞到 btnCoin 后再入账刷新;敌方格心原地弹跳。 * @param gridIndex 施法格 * @param peachCount 蟠桃数量 */ @@ -1041,10 +1128,19 @@ export class UIBattleGame extends Auto_BattleGame { if (!from) { console.log('[UIBattleGame] 产桃坐标缺失', gridIndex, ownerPlayerId); bagView?.grantBattlePeach(peachCount); + this._refreshPeachUi(); + return; + } + this._ensurePeachCoinFly(); + if (!fly) { + bagView?.grantBattlePeach(peachCount); + this._refreshPeachUi(); return; } - fly?.playKillDrop(from, peachCount); - bagView?.grantBattlePeach(peachCount); + fly.playKillDrop(from, peachCount, () => { + bagView?.grantBattlePeach(peachCount); + this._refreshPeachUi(); + }); return; } if (battle && ownerPlayerId >= 0) { @@ -1064,8 +1160,7 @@ export class UIBattleGame extends Auto_BattleGame { this._killPeach = new BattleGameKillPeachPresenter(); this._killPeach.bind( battle, - this._bagView, - this._peachCoinFly, + (from, amount) => this._playLocalCoinFly(from, amount), (victim) => this._monsterDeathWorldPos(victim), ); } @@ -1144,23 +1239,24 @@ export class UIBattleGame extends Auto_BattleGame { const battle = this._battle; if (!battle) return; - const gold = battle.localGold; + const realGold = battle.localGold; + const showGold = Math.max(0, realGold - this._peachUiPendingFly); const cost = battle.bagSession ? battle.bagSession.normalRefreshCost : getDiscountedBagNormalRefreshCost(0, resolveCarriedSummonCostReduceWan().reduceWan); const coinAdUsed = battle.coinAdUsed; - if (gold === this._peachUiGold && cost === this._peachUiCost && coinAdUsed === this._peachUiCoinAdUsed) return; - this._peachUiGold = gold; + if (showGold === this._peachUiGold && cost === this._peachUiCost && coinAdUsed === this._peachUiCoinAdUsed) return; + this._peachUiGold = showGold; this._peachUiCost = cost; this._peachUiCoinAdUsed = coinAdUsed; if (this.lb_coin?.isValid) { - this.lb_coin.string = `${gold}`; + this.lb_coin.string = `${showGold}`; } this._syncCoinAdUi(battle); if (this.lb_RefreshNeed?.isValid) { this.lb_RefreshNeed.string = `${cost}`; } - const enough = cost <= 0 || gold >= cost; + const enough = cost <= 0 || realGold >= cost; this._showRefreshBg1(enough); this._syncRefreshBounce(enough); } @@ -1387,12 +1483,14 @@ export class UIBattleGame extends Auto_BattleGame { AiBattleBridge.inst.setGoldMineCoinFlyHandler(null); if (this._battle?.bagSession) { this._battle.bagSession.onUnlockCoinFly = null; + this._battle.bagSession.onGlyphRecycleGold = null; this._battle.bagSession.onBattleBuffSelect = null; this._battle.bagSession.onPeerMapToolApplied = null; } const aiBagTeardown = AiBattleBridge.inst.aiBagSession; if (aiBagTeardown) { aiBagTeardown.onUnlockCoinFly = null; + aiBagTeardown.onGlyphRecycleGold = null; aiBagTeardown.onBattleBuffSelect = null; aiBagTeardown.onPeerMapToolApplied = null; } @@ -1444,6 +1542,7 @@ export class UIBattleGame extends Auto_BattleGame { this._refreshBounceHinted = false; this._illustratedHintShownThisBattle = false; this._peachUiGold = -1; + this._peachUiPendingFly = 0; this._peachUiCost = -1; this._peachUiCoinAdUsed = -1; this._coinAdVideoIcon = null; diff --git a/assets/script/ui/BattleSuccess/BattleSuccessCoinFlyPresenter.ts b/assets/script/ui/BattleSuccess/BattleSuccessCoinFlyPresenter.ts index a90a567..5b497f8 100644 --- a/assets/script/ui/BattleSuccess/BattleSuccessCoinFlyPresenter.ts +++ b/assets/script/ui/BattleSuccess/BattleSuccessCoinFlyPresenter.ts @@ -1,4 +1,5 @@ import { instantiate, Node, Tween, tween, UIOpacity, UITransform, v3, Vec3 } from 'cc'; +import { GAudioPath } from '../../game/ConfigRes'; /** 单次飞行时长(秒) */ const COIN_FLY_SEC = 0.45; @@ -50,9 +51,11 @@ export class BattleSuccessCoinFlyPresenter { } this._stopShadows(); - gg.audio.playEffect({ name: '结算金币效果' }); + gg.audio.playEffect({ name: '结算金币效果', path: GAudioPath.SfxUi }); const endPos = this._resolveWorldCenter(targetCoin); const srcPos = sourceIcon.worldPosition.clone(); + const srcScale = sourceIcon.worldScale; + const shadowScale = new Vec3(srcScale.x, srcScale.y, srcScale.z); let arrived = 0; for (let i = 0; i < count; i++) { @@ -62,8 +65,9 @@ export class BattleSuccessCoinFlyPresenter { shadow.setSiblingIndex(flyLayer.children.length - 1); const spread = (i - (count - 1) * 0.5) * 14; shadow.setWorldPosition(srcPos.x + spread, srcPos.y + (Math.random() - 0.5) * 10, srcPos.z); - shadow.setWorldScale(sourceIcon.worldScale.clone()); - shadow.getOrAddComponent(UIOpacity).opacity = SHADOW_OPACITY; + shadow.setWorldScale(shadowScale); + const fade = shadow.getOrAddComponent(UIOpacity); + if (fade) fade.opacity = SHADOW_OPACITY; this._shadowNodes.push(shadow); Tween.stopAllByTarget(shadow); diff --git a/assets/script/ui/BattleSuccess/BattleSuccessOpenAnim.ts b/assets/script/ui/BattleSuccess/BattleSuccessOpenAnim.ts index c56355e..a1d623a 100644 --- a/assets/script/ui/BattleSuccess/BattleSuccessOpenAnim.ts +++ b/assets/script/ui/BattleSuccess/BattleSuccessOpenAnim.ts @@ -421,7 +421,8 @@ function playButtonsEnter(buttons: Node[], highlightBtn: Node | null, delay: num }); } -export function stopHighlightButtonAnim(node: Node): void { +export function stopHighlightButtonAnim(node: Node | null | undefined): void { + if (!node?.isValid) return; stopNode(node); const pose = _poseMap.get(node); if (pose) setFinalPose(node, pose); diff --git a/assets/script/ui/BattleSuccess/UIBattleSuccess.ts b/assets/script/ui/BattleSuccess/UIBattleSuccess.ts index 12ad70a..b9dba7b 100644 --- a/assets/script/ui/BattleSuccess/UIBattleSuccess.ts +++ b/assets/script/ui/BattleSuccess/UIBattleSuccess.ts @@ -62,6 +62,8 @@ export class UIBattleSuccess extends Auto_BattleSuccess { private _coinFly: BattleSuccessCoinFlyPresenter | null = null; /** 领取流程中 */ private _claiming = false; + /** 打开结算时缓存的波次(广告回调时 CurentBattle 可能已空) */ + private _settleWaveNum = 1; onLoad(): void { super.onLoad(); @@ -154,8 +156,10 @@ export class UIBattleSuccess extends Auto_BattleSuccess { onInit(): void { this.addNum = 1; - this.btnADGet.active = false; - this.btnShareGet.active = false; + this._claiming = false; + this._settleWaveNum = Math.max(1, Math.floor(Number(gg.game.CurentBattle?.CurentWaveNum) || 1)); + if (this.btnADGet?.isValid) this.btnADGet.active = false; + if (this.btnShareGet?.isValid) this.btnShareGet.active = false; const levelId = gg.sdk.get30rLevelId(); gg.sdk.report30r('LEVEL_PASS', { @@ -185,10 +189,10 @@ export class UIBattleSuccess extends Auto_BattleSuccess { this._refreshMoneyDisplay(); this._refreshCoinRewardDisplay(); - this.btnADGet.active = true - this.btnShareGet.active = false + if (this.btnADGet?.isValid) this.btnADGet.active = true; + if (this.btnShareGet?.isValid) this.btnShareGet.active = false; - if (!gg.game.CurentBattle.IsWatchAd && gg.game.CurentSelectLevelId >= 3) { + if (!gg.game.CurentBattle?.IsWatchAd && gg.game.CurentSelectLevelId >= 3) { gg.sdk.showInterstitialAd(() => { }, () => { @@ -445,7 +449,13 @@ export class UIBattleSuccess extends Auto_BattleSuccess { this._recycleWeaponLoot(); if (this.ui_content?.isValid) this.ui_content.removeAllChildren(); - const levelId = gg.game.CurentBattle.LevelConfigId; + const levelId = gg.game.CurentBattle?.LevelConfigId ?? gg.game.CurentSelectLevelId; + if (!(levelId > 0)) { + console.warn('[UIBattleSuccess] 结算奖励缺少关卡 id'); + this._pendingCoin = 0; + this._dataList = []; + return; + } const rewardStr = gg.data.project.getLevelRewardStr(levelId, true); const pairs = gg.data.project.parseItemPipeNumList(rewardStr); const itemsArray: ItemData[] = []; @@ -572,8 +582,7 @@ export class UIBattleSuccess extends Auto_BattleSuccess { click_btnGet(): void { if (this._claiming) return; - let curWaveNum = gg.game.CurentBattle.CurentWaveNum - gg.sdk.reportDY("inLevel", `${gg.game.getReportDYBattleCountLabel(curWaveNum)}-成功领取奖励`) + gg.sdk.reportDY("inLevel", `${gg.game.getReportDYBattleCountLabel(this._settleWaveNum)}-成功领取奖励`) this._claimWithCoinFly(); } @@ -581,9 +590,9 @@ export class UIBattleSuccess extends Auto_BattleSuccess { private _claimWithCoinFly(): void { if (this._claiming) return; this._claiming = true; - this.btnGet.active = false; - this.btnADGet.active = false; - this.btnShareGet.active = false; + if (this.btnGet?.isValid) this.btnGet.active = false; + if (this.btnADGet?.isValid) this.btnADGet.active = false; + if (this.btnShareGet?.isValid) this.btnShareGet.active = false; const coinGain = Math.floor(this._pendingCoin * this.addNum); const icon = this._coinIconNode(); @@ -627,13 +636,13 @@ export class UIBattleSuccess extends Auto_BattleSuccess { click_btnADGet(): void { if (this._claiming) return; gg.sdk.showVideoAd((res) => { + if (!this.isValid) return; if (res) { - let curWaveNum = gg.game.CurentBattle.CurentWaveNum - gg.sdk.reportDY("inLevel", `${gg.game.getReportDYBattleCountLabel(curWaveNum)}-AD-广告成功双倍领取`) + gg.sdk.reportDY("inLevel", `${gg.game.getReportDYBattleCountLabel(this._settleWaveNum)}-AD-广告成功双倍领取`) this.addNum = 2 stopHighlightButtonAnim(this.btnADGet); this._refreshCoinRewardDisplay(); - gg.game.CurentBattle.IsWatchAd = true + if (gg.game.CurentBattle) gg.game.CurentBattle.IsWatchAd = true; this._claimWithCoinFly(); } else { gg.ui.showToast('观看视频失败');