diff --git a/assets/GameplayIntro.meta b/assets/GameplayIntro.meta new file mode 100644 index 00000000..24131352 --- /dev/null +++ b/assets/GameplayIntro.meta @@ -0,0 +1,21 @@ +{ + "ver": "1.1.3", + "uuid": "b2ad39e9-35c9-4657-ba4b-621b6b6fb499", + "importer": "folder", + "isBundle": true, + "bundleName": "gameplay_intro", + "priority": 1, + "compressionType": { + "wechatgame": "subpackage" + }, + "optimizeHotUpdate": { + "wechatgame": false + }, + "inlineSpriteFrames": { + "wechatgame": false + }, + "isRemoteBundle": { + "wechatgame": false + }, + "subMetas": {} +} \ No newline at end of file diff --git a/assets/GameplayIntro/README.md b/assets/GameplayIntro/README.md new file mode 100644 index 00000000..47c000a3 --- /dev/null +++ b/assets/GameplayIntro/README.md @@ -0,0 +1,37 @@ +# 玩法介绍正式功能包 + +Asset Bundle 名称:`gameplay_intro`。 + +- `prefab/GameplayIntro.prefab`:本关介绍面板固定布局,可在 Creator 中编辑背景、标题、滑动区域和分页器位置。 +- `assets/Script/module/Tool/LevelGameplay.ts`:主脚本目录中的筛选工具,从实际关卡的方块、门、地块及生成队列识别玩法,并按类型去重。主场景仅以类型引用 GameplayIntro,在分包加载完成后用组件名获取实例,避免启动时依赖尚未加载的分包脚本。 +- `script/GameplayIntro.ts`:绑定预制体节点,关闭按钮或外部点击关闭,相邻三页图片加载与释放。 +- `script/GuideCarousel.ts`:鼠标/触摸翻页、缓动回弹、最多三个主圆点及白点替换动画;三个主圆点表示的页码范围外还有介绍时,对应侧显示 60% 大小的小提示点,使用非当前页圆点图片,替换动画期间淡入;单页隐藏分页且不绑定拖动,双页显示两点。 +- `Texture/`:面板背景、玩法指南标题、问号、关闭按钮及分页圆点等 UI 素材;原有中文玩法图片已清理,玩法图片统一加载公共目录。 +- `assets/resources/Window_Prop/`:34 组公共玩法图片,按 `titleN`、`iconN`、`IntroductionN` 加载。daoju26 使用素材 27,daoju27 使用素材 26。 + +游戏入口由 `assets/Script/SceneManager.ts` 控制:进入场景时按实际加载的关卡生成介绍列表,没有特殊道具就隐藏问号。首次点击 `openGameplayIntro` 加载本包的 `prefab/GameplayIntro`,实例挂到 Inspector 绑定的 `tipPanel` 节点;关闭后保留固定布局,释放所有玩法页图片,再次打开复用实例,按解锁关卡倒序排列后定位最左端的最新玩法;三个分页点时高亮左边第 1 点。 + +`GameplayIntro.open(entries)` 接收已经筛选的介绍列表。`NEW_LEVEL.json` 仅提供介绍编号和排列顺序,不再用解锁关卡或玩家进度筛选。开局方块和 `spawnGates[].spawnQueue[].members` 都纳入本关范围,消除后仍可查看;同类型只展示一页。木箱/快递盒/彩色木箱、普通/定次连接等按实际变体匹配,花盆借用的不可见盖板不增加快递盒介绍。 + +场景接线:在 GameScene 的 Top/tip 下放置问号 Sprite + Button,图片使用本包 `wenhao`;Button 点击事件绑定 Canvas 上的 SceneManager.openGameplayIntro。SceneManager 的 Tip Panel 属性绑定场景现有的 tipPanel。tipPanel 应作为位于游戏内容之上的居中容器,不需要添加覆盖整个屏幕的输入拦截组件。 + +预制体直接引用背景、标题、关闭按钮和两种分页圆点;34 种公共玩法图片由脚本按当前页及相邻页动态加载,不能把所有玩法图片拖到预制体中,以免一次加载全部图片。 + +测试包及预览专用接口已移除,启动场景已恢复为主线正式场景。 + +## 可编辑的固定玩法页结构 + +直接打开 `prefab/GameplayIntro.prefab`: + +``` +IntroViewport +└─ Pages + ├─ Page1 + │ ├─ TitleImage + │ ├─ IconImage + │ └─ DescriptionImage + ├─ Page2(相同结构) + └─ Page3(相同结构) +``` + +所有图片节点已经放在面板预制体内,SpriteFrame 留空。IconImage 和 DescriptionImage 的大小由 Sprite 的 Size Mode、Trim 及节点尺寸/缩放控制,代码不覆盖;TitleImage 仍以预制体 Width/Height 为展示区域等比适配;三页需要保持相同布局。代码仅复用三个页面、改变分页位置并动态加载图片。道具图和说明图不做代码缩放,标题图保留等比适配;没有单图比例修正。翻远或关闭面板时清空图片并归还资源引用,不销毁这三个页面;面板整体销毁时由引擎销毁子节点。 diff --git a/assets/GameplayIntro/README.md.meta b/assets/GameplayIntro/README.md.meta new file mode 100644 index 00000000..a1d76679 --- /dev/null +++ b/assets/GameplayIntro/README.md.meta @@ -0,0 +1,6 @@ +{ + "ver": "2.0.2", + "uuid": "7a8b8085-ff6e-436f-8671-a99801b33134", + "importer": "asset", + "subMetas": {} +} \ No newline at end of file diff --git a/assets/gacha_bundle/img/cat.meta b/assets/GameplayIntro/Texture.meta similarity index 81% rename from assets/gacha_bundle/img/cat.meta rename to assets/GameplayIntro/Texture.meta index 0c9ae852..4f8e596d 100644 --- a/assets/gacha_bundle/img/cat.meta +++ b/assets/GameplayIntro/Texture.meta @@ -1,6 +1,6 @@ { "ver": "1.1.3", - "uuid": "87e309c0-a785-428b-a221-9d2ea25f13c6", + "uuid": "260eaaff-84cb-4758-95c7-be73182532c5", "importer": "folder", "isBundle": false, "bundleName": "", diff --git a/assets/GameplayIntro/Texture/close.png b/assets/GameplayIntro/Texture/close.png new file mode 100644 index 00000000..34b6a6ff Binary files /dev/null and b/assets/GameplayIntro/Texture/close.png differ diff --git a/assets/GameplayIntro/Texture/close.png.meta b/assets/GameplayIntro/Texture/close.png.meta new file mode 100644 index 00000000..09f2f23a --- /dev/null +++ b/assets/GameplayIntro/Texture/close.png.meta @@ -0,0 +1,38 @@ +{ + "ver": "2.3.7", + "uuid": "7c6fbbbe-7e71-4e67-bff0-78ed794c6edd", + "importer": "texture", + "type": "sprite", + "wrapMode": "clamp", + "filterMode": "bilinear", + "premultiplyAlpha": false, + "genMipmaps": false, + "packable": false, + "width": 103, + "height": 112, + "platformSettings": {}, + "subMetas": { + "close": { + "ver": "1.0.6", + "uuid": "b920b9e1-7d5d-4218-bc40-797cb0d9319d", + "importer": "sprite-frame", + "rawTextureUuid": "7c6fbbbe-7e71-4e67-bff0-78ed794c6edd", + "trimType": "custom", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "width": 103, + "height": 112, + "rawWidth": 103, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/assets/GameplayIntro/Texture/gameplay_guide_title.png b/assets/GameplayIntro/Texture/gameplay_guide_title.png new file mode 100644 index 00000000..3d037cd2 Binary files /dev/null and b/assets/GameplayIntro/Texture/gameplay_guide_title.png differ diff --git a/assets/GameplayIntro/Texture/gameplay_guide_title.png.meta b/assets/GameplayIntro/Texture/gameplay_guide_title.png.meta new file mode 100644 index 00000000..e70c54fd --- /dev/null +++ b/assets/GameplayIntro/Texture/gameplay_guide_title.png.meta @@ -0,0 +1,38 @@ +{ + "ver": "2.3.7", + "uuid": "e0f7e25d-ab0d-4c0b-ba3b-0a7560ded387", + "importer": "texture", + "type": "sprite", + "wrapMode": "clamp", + "filterMode": "bilinear", + "premultiplyAlpha": false, + "genMipmaps": false, + "packable": false, + "width": 310, + "height": 85, + "platformSettings": {}, + "subMetas": { + "gameplay_guide_title": { + "ver": "1.0.6", + "uuid": "1b908cf0-2bab-4a0e-a4a8-6b1bc8692909", + "importer": "sprite-frame", + "rawTextureUuid": "e0f7e25d-ab0d-4c0b-ba3b-0a7560ded387", + "trimType": "custom", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "width": 310, + "height": 85, + "rawWidth": 310, + "rawHeight": 85, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/assets/GameplayIntro/Texture/mianba.png b/assets/GameplayIntro/Texture/mianba.png new file mode 100644 index 00000000..1644c85a Binary files /dev/null and b/assets/GameplayIntro/Texture/mianba.png differ diff --git a/assets/GameplayIntro/Texture/mianba.png.meta b/assets/GameplayIntro/Texture/mianba.png.meta new file mode 100644 index 00000000..90161a10 --- /dev/null +++ b/assets/GameplayIntro/Texture/mianba.png.meta @@ -0,0 +1,38 @@ +{ + "ver": "2.3.7", + "uuid": "c9aec8f7-4af8-42c2-9761-5d2b3180da1e", + "importer": "texture", + "type": "sprite", + "wrapMode": "clamp", + "filterMode": "bilinear", + "premultiplyAlpha": false, + "genMipmaps": false, + "packable": true, + "width": 902, + "height": 534, + "platformSettings": {}, + "subMetas": { + "mianba": { + "ver": "1.0.6", + "uuid": "506252be-e576-479a-8475-649113ffa72f", + "importer": "sprite-frame", + "rawTextureUuid": "c9aec8f7-4af8-42c2-9761-5d2b3180da1e", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "width": 902, + "height": 534, + "rawWidth": 902, + "rawHeight": 534, + "borderTop": 200, + "borderBottom": 255, + "borderLeft": 60, + "borderRight": 60, + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/assets/GameplayIntro/Texture/wenhao.png b/assets/GameplayIntro/Texture/wenhao.png new file mode 100644 index 00000000..672beaa1 Binary files /dev/null and b/assets/GameplayIntro/Texture/wenhao.png differ diff --git a/assets/GameplayIntro/Texture/wenhao.png.meta b/assets/GameplayIntro/Texture/wenhao.png.meta new file mode 100644 index 00000000..1507e0f4 --- /dev/null +++ b/assets/GameplayIntro/Texture/wenhao.png.meta @@ -0,0 +1,38 @@ +{ + "ver": "2.3.7", + "uuid": "2dbc727b-eb2b-48f4-9e1a-c76fbe480b78", + "importer": "texture", + "type": "sprite", + "wrapMode": "clamp", + "filterMode": "bilinear", + "premultiplyAlpha": false, + "genMipmaps": false, + "packable": false, + "width": 86, + "height": 90, + "platformSettings": {}, + "subMetas": { + "wenhao": { + "ver": "1.0.6", + "uuid": "d9333256-302a-403b-93bf-e25c42829476", + "importer": "sprite-frame", + "rawTextureUuid": "2dbc727b-eb2b-48f4-9e1a-c76fbe480b78", + "trimType": "custom", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "width": 86, + "height": 90, + "rawWidth": 86, + "rawHeight": 90, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/assets/GameplayIntro/Texture/yuandian.png b/assets/GameplayIntro/Texture/yuandian.png new file mode 100644 index 00000000..b1e8762b Binary files /dev/null and b/assets/GameplayIntro/Texture/yuandian.png differ diff --git a/assets/GameplayIntro/Texture/yuandian.png.meta b/assets/GameplayIntro/Texture/yuandian.png.meta new file mode 100644 index 00000000..6e282395 --- /dev/null +++ b/assets/GameplayIntro/Texture/yuandian.png.meta @@ -0,0 +1,38 @@ +{ + "ver": "2.3.7", + "uuid": "b2388707-a337-4107-85c8-3938cbd8d4c5", + "importer": "texture", + "type": "sprite", + "wrapMode": "clamp", + "filterMode": "bilinear", + "premultiplyAlpha": false, + "genMipmaps": false, + "packable": false, + "width": 20, + "height": 20, + "platformSettings": {}, + "subMetas": { + "yuandian": { + "ver": "1.0.6", + "uuid": "93a7437b-9792-42c0-b0f5-73724314cbd8", + "importer": "sprite-frame", + "rawTextureUuid": "b2388707-a337-4107-85c8-3938cbd8d4c5", + "trimType": "custom", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "width": 20, + "height": 20, + "rawWidth": 20, + "rawHeight": 20, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/assets/GameplayIntro/Texture/yuandian00.png b/assets/GameplayIntro/Texture/yuandian00.png new file mode 100644 index 00000000..84dd2593 Binary files /dev/null and b/assets/GameplayIntro/Texture/yuandian00.png differ diff --git a/assets/GameplayIntro/Texture/yuandian00.png.meta b/assets/GameplayIntro/Texture/yuandian00.png.meta new file mode 100644 index 00000000..855ed1bb --- /dev/null +++ b/assets/GameplayIntro/Texture/yuandian00.png.meta @@ -0,0 +1,38 @@ +{ + "ver": "2.3.7", + "uuid": "94a173e9-d339-4583-8962-0a18e0df52d5", + "importer": "texture", + "type": "sprite", + "wrapMode": "clamp", + "filterMode": "bilinear", + "premultiplyAlpha": false, + "genMipmaps": false, + "packable": false, + "width": 38, + "height": 38, + "platformSettings": {}, + "subMetas": { + "yuandian00": { + "ver": "1.0.6", + "uuid": "af06b902-6722-4e79-871c-706dfd075327", + "importer": "sprite-frame", + "rawTextureUuid": "94a173e9-d339-4583-8962-0a18e0df52d5", + "trimType": "custom", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "width": 38, + "height": 38, + "rawWidth": 38, + "rawHeight": 38, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/assets/libs/dn-sdk-minigame.meta b/assets/GameplayIntro/prefab.meta similarity index 81% rename from assets/libs/dn-sdk-minigame.meta rename to assets/GameplayIntro/prefab.meta index f18b29ad..e605f088 100644 --- a/assets/libs/dn-sdk-minigame.meta +++ b/assets/GameplayIntro/prefab.meta @@ -1,6 +1,6 @@ { "ver": "1.1.3", - "uuid": "b341059c-15a3-46d8-96d8-7fc3f5d08127", + "uuid": "768035be-c53f-4e17-b438-a862006a56db", "importer": "folder", "isBundle": false, "bundleName": "", diff --git a/assets/GameplayIntro/prefab/GameplayIntro.prefab b/assets/GameplayIntro/prefab/GameplayIntro.prefab new file mode 100644 index 00000000..20d26d46 --- /dev/null +++ b/assets/GameplayIntro/prefab/GameplayIntro.prefab @@ -0,0 +1,2362 @@ +[ + { + "__type__": "cc.Prefab", + "_name": "", + "_objFlags": 0, + "_native": "", + "data": { + "__id__": 1 + }, + "optimizationPolicy": 0, + "asyncLoadAssets": false, + "readonly": false + }, + { + "__type__": "cc.Node", + "_name": "GameplayIntro", + "_objFlags": 0, + "_parent": null, + "_children": [ + { + "__id__": 2 + }, + { + "__id__": 7 + } + ], + "_active": true, + "_components": [ + { + "__id__": 64 + } + ], + "_prefab": { + "__id__": 65 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 1080, + "height": 1920 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "Backdrop", + "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 3 + }, + { + "__id__": 4 + }, + { + "__id__": 5 + } + ], + "_prefab": { + "__id__": 6 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 4000, + "height": 4000 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Graphics", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 2 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "a153945d-2511-4c14-be7b-05d242f47d57" + } + ], + "_lineWidth": 2, + "_strokeColor": { + "__type__": "cc.Color", + "r": 0, + "g": 0, + "b": 0, + "a": 255 + }, + "_lineJoin": 2, + "_lineCap": 0, + "_fillColor": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_miterLimit": 10, + "_id": "" + }, + { + "__type__": "cc.BlockInputEvents", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 2 + }, + "_enabled": true, + "_id": "" + }, + { + "__type__": "cc.Button", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 2 + }, + "_enabled": true, + "_normalMaterial": null, + "_grayMaterial": null, + "duration": 0.1, + "zoomScale": 1.1, + "clickEvents": [], + "_N$interactable": true, + "_N$enableAutoGrayEffect": false, + "_N$transition": 0, + "transition": 0, + "_N$normalColor": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_N$pressedColor": { + "__type__": "cc.Color", + "r": 211, + "g": 211, + "b": 211, + "a": 255 + }, + "pressedColor": { + "__type__": "cc.Color", + "r": 211, + "g": 211, + "b": 211, + "a": 255 + }, + "_N$hoverColor": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "hoverColor": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_N$disabledColor": { + "__type__": "cc.Color", + "r": 124, + "g": 124, + "b": 124, + "a": 255 + }, + "_N$normalSprite": null, + "_N$pressedSprite": null, + "pressedSprite": null, + "_N$hoverSprite": null, + "hoverSprite": null, + "_N$disabledSprite": null, + "_N$target": { + "__id__": 2 + }, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "RLuNcFtmjzPsfxQx+giP6w", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "IntroPanel", + "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [ + { + "__id__": 8 + }, + { + "__id__": 11 + }, + { + "__id__": 14 + }, + { + "__id__": 17 + }, + { + "__id__": 56 + }, + { + "__id__": 58 + } + ], + "_active": true, + "_components": [ + { + "__id__": 62 + } + ], + "_prefab": { + "__id__": 63 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 920, + "height": 1480 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "BackgroundImage", + "_objFlags": 0, + "_parent": { + "__id__": 7 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 9 + } + ], + "_prefab": { + "__id__": 10 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 920, + "height": 1480 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 8 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "506252be-e576-479a-8475-649113ffa72f" + }, + "_type": 1, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "4JqtbQPABf5EV2rXTzvvqA", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Title", + "_objFlags": 0, + "_parent": { + "__id__": 7 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 12 + } + ], + "_prefab": { + "__id__": 13 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 310, + "height": 85 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 600, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 11 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "1b908cf0-2bab-4a0e-a4a8-6b1bc8692909" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "i2/0JpaqcuctRPU1ClWYVw", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Status", + "_objFlags": 0, + "_parent": { + "__id__": 7 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 15 + } + ], + "_prefab": { + "__id__": 16 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 151, + "g": 111, + "b": 62, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 760, + "height": 100 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 14 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "加载介绍中…", + "_N$string": "加载介绍中…", + "_fontSize": 32, + "_lineHeight": 40, + "_enableWrapText": true, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 2, + "_N$cacheMode": 0, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "d8lgNfQ+Vvz+0A8epBzunQ", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "IntroViewport", + "_objFlags": 0, + "_parent": { + "__id__": 7 + }, + "_children": [ + { + "__id__": 18 + } + ], + "_active": true, + "_components": [ + { + "__id__": 53 + }, + { + "__id__": 54 + } + ], + "_prefab": { + "__id__": 55 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 850, + "height": 1020 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "Pages", + "_objFlags": 0, + "_parent": { + "__id__": 17 + }, + "_children": [ + { + "__id__": 19 + }, + { + "__id__": 30 + }, + { + "__id__": 41 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 52 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 850, + "height": 1020 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "Page1", + "_objFlags": 0, + "_parent": { + "__id__": 18 + }, + "_children": [ + { + "__id__": 20 + }, + { + "__id__": 23 + }, + { + "__id__": 26 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 29 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 850, + "height": 1020 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "TitleImage", + "_objFlags": 0, + "_parent": { + "__id__": 19 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 21 + } + ], + "_prefab": { + "__id__": 22 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 730, + "height": 125 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 425, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 20 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": null, + "_type": 0, + "_sizeMode": 1, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "fbf81871-1c4d-463d-b388-2287474d2a33", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "IconImage", + "_objFlags": 0, + "_parent": { + "__id__": 19 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 24 + } + ], + "_prefab": { + "__id__": 25 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 660, + "height": 425 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 75, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 23 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": null, + "_type": 0, + "_sizeMode": 1, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "6a13c691-afab-4e00-b2f9-d60c0d707bfe", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "DescriptionImage", + "_objFlags": 0, + "_parent": { + "__id__": 19 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 27 + } + ], + "_prefab": { + "__id__": 28 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 735, + "height": 205 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + -325, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 26 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": null, + "_type": 0, + "_sizeMode": 1, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "7153a826-10e3-4bfb-8ab8-98e002e6b025", + "sync": false + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "736c29a2-96dc-4509-b40c-07d74d7f81ce", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Page2", + "_objFlags": 0, + "_parent": { + "__id__": 18 + }, + "_children": [ + { + "__id__": 31 + }, + { + "__id__": 34 + }, + { + "__id__": 37 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 40 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 850, + "height": 1020 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 850, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "TitleImage", + "_objFlags": 0, + "_parent": { + "__id__": 30 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 32 + } + ], + "_prefab": { + "__id__": 33 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 730, + "height": 125 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 425, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 31 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": null, + "_type": 0, + "_sizeMode": 1, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "9be1c97e-e0cb-4957-aee2-4ded08c94222", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "IconImage", + "_objFlags": 0, + "_parent": { + "__id__": 30 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 35 + } + ], + "_prefab": { + "__id__": 36 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 660, + "height": 425 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 75, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 34 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": null, + "_type": 0, + "_sizeMode": 1, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "19bad985-5823-4879-9cbf-7dd8f4dc4212", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "DescriptionImage", + "_objFlags": 0, + "_parent": { + "__id__": 30 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 38 + } + ], + "_prefab": { + "__id__": 39 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 735, + "height": 205 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + -325, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 37 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": null, + "_type": 0, + "_sizeMode": 1, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "b293a531-49fc-4357-9edd-4e7b89d7364d", + "sync": false + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "db760f39-54a3-42b7-84a3-a8945e408a1b", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Page3", + "_objFlags": 0, + "_parent": { + "__id__": 18 + }, + "_children": [ + { + "__id__": 42 + }, + { + "__id__": 45 + }, + { + "__id__": 48 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 51 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 850, + "height": 1020 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 1700, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "TitleImage", + "_objFlags": 0, + "_parent": { + "__id__": 41 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 43 + } + ], + "_prefab": { + "__id__": 44 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 730, + "height": 125 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 425, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 42 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": null, + "_type": 0, + "_sizeMode": 1, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "864c0f29-e875-40d6-9583-d5869845a462", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "IconImage", + "_objFlags": 0, + "_parent": { + "__id__": 41 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 46 + } + ], + "_prefab": { + "__id__": 47 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 660, + "height": 425 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 75, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 45 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": null, + "_type": 0, + "_sizeMode": 1, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "40a3f9ed-8676-4eed-ab77-5070d6a1e4f9", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "DescriptionImage", + "_objFlags": 0, + "_parent": { + "__id__": 41 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 49 + } + ], + "_prefab": { + "__id__": 50 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 735, + "height": 205 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + -325, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 48 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": null, + "_type": 0, + "_sizeMode": 1, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "38f4fe50-3b53-460e-993f-e7213162b477", + "sync": false + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "249c882f-5b3c-4d05-8170-44174198eab4", + "sync": false + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "066a0ec9-5460-4a1a-af70-a9593ced2b37", + "sync": false + }, + { + "__type__": "cc.Mask", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 17 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_spriteFrame": null, + "_type": 0, + "_segments": 64, + "_N$alphaThreshold": 0.1, + "_N$inverted": false, + "_id": "" + }, + { + "__type__": "8168bhI+uRMW5/TmxovW2EE", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 17 + }, + "_enabled": true, + "dotFrame": { + "__uuid__": "93a7437b-9792-42c0-b0f5-73724314cbd8" + }, + "selectedDotFrame": { + "__uuid__": "af06b902-6722-4e79-871c-706dfd075327" + }, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "yraV/Owl8H/VN6T1NEj1Cw", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Pagination", + "_objFlags": 0, + "_parent": { + "__id__": 7 + }, + "_children": [], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 57 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 160, + "height": 40 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + -615, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "/mpSXwHdYoE0dZohjCJEFQ", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "CloseButton", + "_objFlags": 0, + "_parent": { + "__id__": 7 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 59 + }, + { + "__id__": 60 + } + ], + "_prefab": { + "__id__": 61 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 103, + "height": 110 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 365, + 615, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 58 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "b920b9e1-7d5d-4218-bc40-797cb0d9319d" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.Button", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 58 + }, + "_enabled": true, + "_normalMaterial": null, + "_grayMaterial": null, + "duration": 0.1, + "zoomScale": 1.1, + "clickEvents": [], + "_N$interactable": true, + "_N$enableAutoGrayEffect": false, + "_N$transition": 0, + "transition": 0, + "_N$normalColor": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_N$pressedColor": { + "__type__": "cc.Color", + "r": 211, + "g": 211, + "b": 211, + "a": 255 + }, + "pressedColor": { + "__type__": "cc.Color", + "r": 211, + "g": 211, + "b": 211, + "a": 255 + }, + "_N$hoverColor": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "hoverColor": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_N$disabledColor": { + "__type__": "cc.Color", + "r": 124, + "g": 124, + "b": 124, + "a": 255 + }, + "_N$normalSprite": null, + "_N$pressedSprite": null, + "pressedSprite": null, + "_N$hoverSprite": null, + "hoverSprite": null, + "_N$disabledSprite": null, + "_N$target": { + "__id__": 58 + }, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "d335EWZtVCrYv8+999km8J", + "sync": false + }, + { + "__type__": "cc.BlockInputEvents", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 7 + }, + "_enabled": true, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "SjhtNLAlHLqHHyNMZb8DSA", + "sync": false + }, + { + "__type__": "b6043noSMtByaaImD9068l0", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 1 + }, + "_enabled": true, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "", + "sync": false + } +] \ No newline at end of file diff --git a/assets/GameplayIntro/prefab/GameplayIntro.prefab.meta b/assets/GameplayIntro/prefab/GameplayIntro.prefab.meta new file mode 100644 index 00000000..2cf8f013 --- /dev/null +++ b/assets/GameplayIntro/prefab/GameplayIntro.prefab.meta @@ -0,0 +1,9 @@ +{ + "ver": "1.3.2", + "uuid": "23d68b2f-0074-44dd-bbb2-5b064ee575a6", + "importer": "prefab", + "optimizationPolicy": "AUTO", + "asyncLoadAssets": false, + "readonly": false, + "subMetas": {} +} \ No newline at end of file diff --git a/assets/passCheck/script.meta b/assets/GameplayIntro/script.meta similarity index 81% rename from assets/passCheck/script.meta rename to assets/GameplayIntro/script.meta index 6de38418..31157934 100644 --- a/assets/passCheck/script.meta +++ b/assets/GameplayIntro/script.meta @@ -1,6 +1,6 @@ { "ver": "1.1.3", - "uuid": "72820ce5-a70b-4dcf-8596-f1b190eea42d", + "uuid": "281f1ce9-089b-4ef5-983d-42deec7d4e25", "importer": "folder", "isBundle": false, "bundleName": "", diff --git a/assets/GameplayIntro/script/GameplayIntro.ts b/assets/GameplayIntro/script/GameplayIntro.ts new file mode 100644 index 00000000..858fa297 --- /dev/null +++ b/assets/GameplayIntro/script/GameplayIntro.ts @@ -0,0 +1,222 @@ +import GuideCarousel from "./GuideCarousel"; +// 一页图片的资源记录:node 是图片容器,frames 是本页持有引用的资源,sprites 是显示图片的组件。 +// live=false 表示本页已移出保留范围;晚到的加载结果必须丢弃,不能再显示。 +type IntroPage = { node: cc.Node; frames: cc.SpriteFrame[]; sprites: cc.Sprite[]; live: boolean }; +const { ccclass } = cc._decorator; + +// daoju26 是变色跳跃门、daoju27 是障碍杆;公共素材的这两个编号相反。 +const PROP_ART_IDS = Array.from({ length: 34 }, (_, index) => index === 26 ? 27 : index === 27 ? 26 : index); + +/** + * 本关玩法面板控制器,挂在 GameplayIntro 预制体根节点。 + * 阅读顺序:open 接收本关列表 → syncPages 确定需要的三页 → picture 排队加载图片。 + * 关闭时 releasePages 释放玩法图;背景、标题等固定布局留在预制体中供下次复用。 + */ +@ccclass +export default class GameplayIntro extends cc.Component { + private imageLayouts = new Map(); + + // 调用方已按本关配置筛选并去重;按解锁关卡倒序排列,每次打开最左端的最新玩法。 + private introductions: any[] = []; + private carousel: GuideCarousel = null; + private board: cc.Node = null; + private status: cc.Label = null; + // 每次打开/关闭递增的请求编号,用来识别已过期的异步加载回调。 + private request = 0; + private panelTween: cc.Tween = null; + private closing = false; + // 只记录当前页及相邻页的图片,不为所有历史页面常驻图片资源。 + private loadedPages: { [index: number]: IntroPage } = {}; + // 图片逐张加载:队列存“加载任务”,imageLoading 防止同时启动多个任务。 + private imageQueue: Array<() => void> = []; + private imageLoading = false; + + /** entries 是本关实际用到的玩法介绍,空列表直接关闭。 */ + open(entries: any[]) { + this.stopPanelAnimation(); + this.releasePages(); + this.introductions = entries.slice().sort((a, b) => b.level - a.level); + if (!this.introductions.length) { + if (this.carousel) this.carousel.clear(); + this.finishClose(); + return; + } + this.node.active = true; + // 固定节点只查找和绑定一次,避免重复打开时叠加关闭/翻页监听。 + if (!this.board) { + this.board = this.node.getChildByName("IntroPanel"); + this.status = this.board.getChildByName("Status").getComponent(cc.Label); + // Backdrop 是面板外的遮罩,点击它关闭;面板自身通过 BlockInputEvents 阻止穿透。 + const backdrop = this.node.getChildByName("Backdrop"); + const graphics = backdrop.getComponent(cc.Graphics); + graphics.fillColor = new cc.Color(0, 0, 0, 170); + graphics.rect(-backdrop.width / 2, -backdrop.height / 2, backdrop.width, backdrop.height); + graphics.fill(); + backdrop.on("click", this.close, this); + this.board.getChildByName("CloseButton").on("click", this.close, this); + const viewport = this.board.getChildByName("IntroViewport"); + this.carousel = viewport.getComponent(GuideCarousel); + viewport.on("page-changed", () => { + // GuideCarousel 通知目标页已变化,此时及时加载新邻页、释放远处页。 + this.syncPages(); + }, this); + } + // 重置分页状态和滑动监听,保留预制体中的三个固定页面。 + this.carousel.clear(); + this.status.node.targetOff(this); + this.status.node.active = true; + this.status.string = "加载介绍中…"; + this.status.node.active = false; + this.carousel.initialize(this.introductions.length, 0, this.board.getChildByName("Pagination")); + this.board.scale = 0.3; + this.panelTween = cc.tween(this.board) + .to(0.2, { scale: 1.05 }, { easing: "backOut" }) + .to(0.15, { scale: 1 }, { easing: "sineOut" }); + this.panelTween.start(); + } + + /** 性能优化入口:翻页后只保留 current-1、current、current+1 这三页的图片。 */ + private syncPages() { + const current = this.carousel.index; + Object.keys(this.loadedPages).forEach(key => { + const index = Number(key); + // 例如当前为第 5 项,只保留索引 4、5、6;其它已加载页立即释放。 + if (Math.abs(index - current) > 1) this.releasePage(index); + }); + // 优先加载当前页,再加载前一页和后一页;越界或已加载的页面直接跳过。 + // 在真实列表的两端,通常只需保留两页。 + [current, current - 1, current + 1].forEach(index => { + if (index < 0 || index >= this.introductions.length || this.loadedPages[index]) return; + const node = this.carousel.pages[index]; + node.active = true; + const page: IntroPage = { node, frames: [], sprites: [], live: true }; + this.loadedPages[index] = page; + const entry = this.introductions[index]; + const art = PROP_ART_IDS[Number(entry.name.replace("daoju", ""))]; + // 公共玩法图:上方标题、中间道具大图、下方说明。 + if (art !== undefined) { + this.picture(page, "TitleImage", "title" + art); + this.picture(page, "IconImage", "icon" + art); + this.picture(page, "DescriptionImage", "Introduction" + art); + } else this.showMessage(entry.tips); + }); + } + + /** 替换预制体中的图片;道具图和说明图由组件控制大小;标题图按预制体展示区域等比适配。 */ + private picture(page: IntroPage, nodeName: string, path: string) { + const node = page.node.getChildByName(nodeName); + const fitImage = nodeName === "TitleImage"; + if (fitImage && !this.imageLayouts.has(node)) { + this.imageLayouts.set(node, { width: node.width, height: node.height, scale: node.scale }); + } + const sprite = node.getComponent(cc.Sprite); + page.sprites.push(sprite); + this.imageQueue.push(() => { + // 排队期间用户可能已翻走或关闭面板,失效任务无需再发起资源加载。 + if (!page.live) { this.nextImage(); return; } + this.imageLoading = true; + cc.resources.load("Window_Prop/" + path, cc.SpriteFrame, (error, frame: cc.SpriteFrame) => { + // addRef 表示本页持有这份资源;释放页时配对 decRef。 + // decRef 减少引用,资源没有其它引用时由引擎回收。 + if (!error && frame) frame.addRef(); + // 已经发出的请求不能靠清空队列取消;因此结果回来时还要再检查页面是否有效。 + if (!page.live || !cc.isValid(node, true)) { + if (!error && frame) frame.decRef(); + } else if (error) { + this.showMessage("图片加载失败"); + cc.error("Gameplay intro image", path, error); + } else { + page.frames.push(frame); + // 禁止加入动态合图,避免图片被复制到长期存在的图集中,影响关闭后的回收。 + frame.getTexture().packable = false; + sprite.spriteFrame = frame; + if (fitImage) { + const layout = this.imageLayouts.get(node); + const size = frame.getOriginalSize(); + node.setContentSize(size.width, size.height); + node.scale = Math.min(layout.width / size.width, layout.height / size.height) * layout.scale; + } + + } + this.imageLoading = false; + this.nextImage(); + }); + }); + this.nextImage(); + } + + /** 一次只启动一张图,当前加载回调结束后才取下一项,减少集中加载造成的卡顿。 */ + private nextImage() { + if (this.imageLoading || !this.imageQueue.length) return; + this.imageQueue.shift()(); + } + + /** 先断开显示引用,再归还资源引用,最后隐藏固定页面,供后续复用。 */ + private releasePage(index: number) { + const page = this.loadedPages[index]; + page.live = false; + page.sprites.forEach(sprite => { + if (cc.isValid(sprite, true)) sprite.spriteFrame = null; + }); + page.frames.forEach(frame => frame.decRef()); + if (cc.isValid(page.node, true)) { + page.node.active = false; + // 固定页面节点保留,下一次仅替换图片。 + } + delete this.loadedPages[index]; + } + + /** 清空待加载任务和已加载图片;在途请求返回后由 picture 中的 live 检查处理。 */ + private releasePages() { + this.imageQueue = []; + Object.keys(this.loadedPages).forEach(key => this.releasePage(Number(key))); + } + + // 即使外部直接隐藏面板而没有调用 close,也要释放图片并让旧请求失效。 + onDisable() { + this.stopPanelAnimation(); + ++this.request; + this.releasePages(); + } + + // 场景退出或节点被销毁时的兜底清理。 + onDestroy() { + this.stopPanelAnimation(); + this.releasePages(); + } + + /** 隐藏面板并通知打开它的场景;是否恢复游戏由 SceneManager 判断。 */ + close() { + if (this.closing || !this.node.active) return; + if (!this.board) { this.finishClose(); return; } + if (this.panelTween) this.panelTween.stop(); + this.closing = true; + this.panelTween = cc.tween(this.board) + .to(0.15, { scale: 0.3 }, { easing: "sineIn" }) + .call(() => this.finishClose()); + this.panelTween.start(); + } + + // 退场完成后再释放图片和通知场景恢复游戏,避免动画期间内容消失。 + private finishClose() { + this.stopPanelAnimation(); + ++this.request; + this.releasePages(); + this.node.active = false; + this.node.emit("intro-closed"); + } + + private stopPanelAnimation() { + if (this.panelTween) this.panelTween.stop(); + this.panelTween = null; + this.closing = false; + // 销毁回调中子节点可能已释放;这里只停止动画,不再写入节点属性。 + // 每次打开都会重新设置起始缩放。 + } + + // 提示也复用主预制体的 Status 节点,避免向固定玩法页追加节点。 + private showMessage(value: string) { + this.status.string = value; + this.status.node.active = true; + } +} diff --git a/assets/GameplayIntro/script/GameplayIntro.ts.meta b/assets/GameplayIntro/script/GameplayIntro.ts.meta new file mode 100644 index 00000000..0aee8f64 --- /dev/null +++ b/assets/GameplayIntro/script/GameplayIntro.ts.meta @@ -0,0 +1,10 @@ +{ + "ver": "1.1.0", + "uuid": "b60439e8-48cb-41c9-a688-983f74ebc974", + "importer": "typescript", + "isPlugin": false, + "loadPluginInWeb": true, + "loadPluginInNative": true, + "loadPluginInEditor": false, + "subMetas": {} +} \ No newline at end of file diff --git a/assets/GameplayIntro/script/GuideCarousel.ts b/assets/GameplayIntro/script/GuideCarousel.ts new file mode 100644 index 00000000..c92c8513 --- /dev/null +++ b/assets/GameplayIntro/script/GuideCarousel.ts @@ -0,0 +1,297 @@ +const { ccclass, property } = cc._decorator; + +/** + * 通用横向滑动组件,挂在预制体的 IntroViewport 上。 + * 只负责位移、手势和白点动画,不负责解锁配置及图片加载。 + * 手势流程:begin 按下 → move 跟手 → end 松开选页 → update 每帧完成缓动。 + * 实际页码 index 与白点位置 activeDot 是两套状态,介绍页数可以超过 3。 + */ +@ccclass +export default class GuideCarousel extends cc.Component { + @property(cc.SpriteFrame) + dotFrame: cc.SpriteFrame = null; + @property(cc.SpriteFrame) + selectedDotFrame: cc.SpriteFrame = null; + // 当前目标页索引,从 0 开始;pages 包含所有介绍页的占位节点。 + index = 0; + pages: cc.Node[] = []; + private pageSlots: cc.Node[] = []; + // 所有页面都挂到 track 下;移动这个父节点即可让整排页面一起移动。 + private track: cc.Node = null; + private dots: cc.Node[] = []; + // 三个主圆点之外还有页面时,在对应侧显示使用未选中图片的小提示点。 + private edgeDots: cc.Node[] = []; + // 最多三个白点;打开时根据默认页定位。 + private activeDot = 0; + // 仅替换动画期间显示的辅助白点,平时隐藏,不表示额外页面。 + private incomingDot: cc.Node = null; + // 替换动画的移动方向:1 向右移动,-1 向左移动,0 不播放。 + private dotDirection = 0; + private dotElapsed = 0; + // width 是一页宽度;offset 是整排页面的横向位移;origin 是按下时的位移基准。 + private width = 880; + private offset = 0; + private origin = 0; + // 拖动起点、最近位置和最近时间,用于计算拖动距离及甩动速度。 + private startX = 0; + private lastX = 0; + private lastTime = 0; + private speed = 0; + // 记录本次拖动属于鼠标还是哪根手指,避免多个输入同时控制页面。 + private pointer: string = null; + // 松手缓动的起点、终点、已过时间;settling=true 时 update 会继续移动。 + private from = 0; + private destination = 0; + private elapsed = 0; + private settling = false; + + /** 传入所有页面、默认页索引和分页器容器;重复初始化会先清理旧内容。 */ + initialize(count: number, selected: number, indicator: cc.Node) { + this.clear(); + this.width = this.node.width; + this.track = this.node.getChildByName("Pages"); + this.pageSlots = this.track.children.slice(); + // 逻辑页共用预制体内的三个固定槽位,相邻三页对应不同槽位。 + const pages = this.pages = Array.from({ length: count }, (_, index) => this.pageSlots[index % 3]); + const dotCount = pages.length > 1 ? Math.min(3, pages.length) : 0; + indicator.active = dotCount > 0; + for (let i = 0; i < dotCount; i++) { + const dot = this.createDot(indicator, "Dot" + i); + dot.x = (i - (dotCount - 1) / 2) * 40; + this.dots.push(dot); + } + if (pages.length > 3) { + [-1, 1].forEach(direction => { + const dot = this.createDot(indicator, direction < 0 ? "MoreLeftDot" : "MoreRightDot"); + this.styleDot(dot, false); + dot.scale = 0.6; + dot.opacity = 255; + dot.x = direction * 80; + this.edgeDots.push(dot); + }); + this.incomingDot = this.createDot(indicator, "IncomingDot"); + this.incomingDot.active = false; + } + this.index = Math.max(0, Math.min(pages.length - 1, selected)); + this.activeDot = Math.min(Math.max(0, dotCount - 1), this.index); + this.goTo(this.index, false); + if (pages.length < 2) return; + const type = cc.Node.EventType; + this.node.on(type.TOUCH_START, this.touchStart, this); + this.node.on(type.TOUCH_MOVE, this.touchMove, this); + this.node.on(type.TOUCH_END, this.touchEnd, this); + this.node.on(type.TOUCH_CANCEL, this.touchCancel, this); + // 同时监听鼠标与触摸,兼容桌面预览中没有被转换成触摸事件的鼠标拖动。 + this.node.on(type.MOUSE_DOWN, this.mouseDown, this); + this.node.on(type.MOUSE_MOVE, this.mouseMove, this); + this.node.on(type.MOUSE_UP, this.mouseUp, this); + this.node.on(type.MOUSE_LEAVE, this.mouseLeave, this); + } + + /** 清理本组件的监听、页面轨道和白点,防止重复打开后节点/事件越来越多。 */ + clear() { + this.node.targetOff(this); + this.pointer = null; + this.settling = false; + this.dotDirection = 0; + this.pageSlots.forEach(page => { if (cc.isValid(page, true)) page.active = false; }); + this.dots.concat(this.edgeDots, this.incomingDot ? [this.incomingDot] : []).forEach(dot => { + dot.removeFromParent(); + dot.destroy(); + }); + this.track = null; + this.incomingDot = null; + this.dots = []; + this.edgeDots = []; + this.pages = []; + this.offset = 0; + } + + /** 切换目标页;animated=false 用于首次打开时直接定位,默认则平滑过渡。 */ + goTo(index: number, animated = true) { + if (!this.track || !this.pages.length) return; + this.pointer = null; + const previous = this.index; + const previousDot = this.activeDot; + this.resetDotAnimation(); + // 限制在真实页码范围内,所以边界拖动不会进入不存在的页面。 + this.index = Math.max(0, Math.min(this.pages.length - 1, index)); + // 查看更早页:左点 → 中点 → 右点 → 一直保持右点;查看更新页则反向移动。 + // 这里只根据实际页码变化量移动白点,并不要求已经到达介绍列表的两端。 + // 如果只是边界回弹,页码未变,白点也不会改变。 + this.activeDot = Math.max(0, Math.min(this.dots.length - 1, this.activeDot + this.index - previous)); + this.updateEdgeDots(); + this.from = this.offset; + // 第 n 页原本在 n*width 处,让整排左移 n*width,就能把该页放到视口中心。 + this.destination = -this.index * this.width; + this.elapsed = 0; + this.settling = animated; + if (!animated) this.offset = this.destination; + this.dots.forEach((dot, i) => this.styleDot(dot, i === this.activeDot)); + const delta = this.index - previous; + // 页码确实改变,但高亮点已经停在最左/最右时,播放白点从旁边补进的替换动画。 + // 真正到达列表边界且页码未改变时不播放。 + if (this.incomingDot && animated && delta !== 0 && previousDot === this.activeDot && + ((delta < 0 && this.activeDot === 0) || (delta > 0 && this.activeDot === 2))) { + this.dotDirection = delta < 0 ? 1 : -1; + this.dotElapsed = 0; + this.incomingDot.active = true; + this.animateDots(0); + } + this.render(); + this.node.emit("page-changed", this.index); + } + + // 分页图片由预制体直接持有,重复打开无需异步加载。 + private createDot(parent: cc.Node, name: string): cc.Node { + const dot = new cc.Node(name); + dot.parent = parent; + dot.addComponent(cc.Sprite); + this.styleDot(dot, false); + return dot; + } + + private styleDot(dot: cc.Node, selected: boolean) { + dot.getComponent(cc.Sprite).spriteFrame = selected ? this.selectedDotFrame : this.dotFrame; + dot.scale = 1; + } + + private updateEdgeDots() { + if (!this.edgeDots.length) return; + const firstVisible = this.index - this.activeDot; + this.edgeDots[0].active = firstVisible > 0; + this.edgeDots[1].active = firstVisible + this.dots.length < this.pages.length; + } + + // 动画结束或被打断时恢复三个固定位置,隐藏辅助点,选中点使用白色圆点图片。 + private resetDotAnimation() { + this.dotDirection = 0; + if (this.incomingDot) this.incomingDot.active = false; + this.edgeDots.forEach(dot => dot.opacity = 255); + this.dots.forEach((dot, i) => { + dot.x = (i - (this.dots.length - 1) / 2) * 40; + dot.opacity = 255; + this.styleDot(dot, i === this.activeDot); + }); + } + + /** dt 是这一帧经过的秒数;旧点移出并淡出,辅助点从另一边进入并放大。 */ + private animateDots(dt: number) { + if (!this.dotDirection) return; + this.dotElapsed += dt; + // 替换动画持续 0.28 秒,三次方缓动使运动先快后慢。 + const t = Math.min(1, this.dotElapsed / 0.28); + const eased = 1 - Math.pow(1 - t, 3); + const direction = this.dotDirection; + // 补入圆点从边缘经过时,提示点先让位再淡入,避免两点重叠。 + this.edgeDots.forEach(dot => dot.opacity = Math.round(255 * eased)); + this.dots.forEach((dot, i) => { + const destination = i + direction; + this.styleDot(dot, (eased < 0.5 ? i : destination) === this.activeDot); + dot.x = (i - 1) * 40 + direction * 40 * eased; + dot.opacity = destination < 0 || destination > 2 ? Math.round(255 * (1 - eased)) : 255; + }); + this.incomingDot.x = -direction * (80 - 40 * eased); + this.incomingDot.opacity = Math.round(255 * eased); + this.styleDot(this.incomingDot, true); + this.incomingDot.scale = 0.5 + 0.5 * eased; + if (t === 1) this.resetDotAnimation(); + } + + // 把屏幕坐标转成视口局部坐标,面板有缩放时仍能正确计算拖动距离。 + private x(event: cc.Event.EventTouch | cc.Event.EventMouse) { + return this.node.convertToNodeSpaceAR(event.getLocation()).x; + } + + /** 按下时接管当前位置,允许用户在回弹中途再次抓住页面。 */ + private begin(pointer: string, x: number) { + if (this.pointer !== null || this.pages.length < 2) return; + this.pointer = pointer; + this.settling = false; + this.startX = this.lastX = x; + this.lastTime = Date.now(); + this.speed = 0; + this.origin = this.offset; + const min = -(this.pages.length - 1) * this.width; + // 边界位移已经经过阻尼压缩;这里反算原始拖动量。 + // 否则在回弹途中重新按下,第一次 move 会再次压缩位移,导致内容突然跳动。 + if (this.offset > 0) this.origin = 240 * this.offset / (120 - this.offset); + else if (this.offset < min) { + const extra = min - this.offset; + this.origin = min - 240 * extra / (120 - extra); + } + } + + /** 拖动中直接更新位移,实现跟手效果。 */ + private move(pointer: string, x: number) { + if (this.pointer !== pointer) return; + const now = Date.now(); + this.speed = (x - this.lastX) / Math.max(1, now - this.lastTime); + this.lastX = x; + this.lastTime = now; + const raw = this.origin + x - this.startX; + const min = -(this.pages.length - 1) * this.width; + // 合法位移范围是 [min, 0]。超过任一端后使用阻尼:越拉越费劲,位移趋近 120。 + // 240 控制阻力曲线;范围内则直接使用 raw,不额外减慢跟手移动。 + this.offset = raw > 0 ? 120 * raw / (240 + raw) : raw < min ? min - 120 * (min - raw) / (240 + min - raw) : raw; + this.render(); + } + + /** 松手时根据距离/速度决定目标页,再交给 goTo 做吸附或回弹。 */ + private end(pointer: string, cancel = false) { + if (this.pointer !== pointer) return; + const distance = this.lastX - this.startX; + // 停住超过 100 毫秒再松手,就不再把之前的移动速度当作快速甩动。 + const speed = Date.now() - this.lastTime < 100 ? this.speed : 0; + let next = Math.round(-this.offset / this.width); + // 拖过页宽的 18%,或速度超过每毫秒 0.45 个局部坐标单位,即按方向翻一页。 + // 触摸被系统取消时,使用当前位置最近的页面,不额外按甩动方向翻页。 + if (!cancel && (Math.abs(distance) > this.width * 0.18 || Math.abs(speed) > 0.45)) { + next = this.index + ((Math.abs(speed) > 0.45 ? speed : distance) < 0 ? 1 : -1); + } + this.goTo(next); + } + + // 触摸事件带手指 ID;鼠标只响应左键。离开视口也结束拖动,避免内容一直粘着鼠标。 + private touchStart(event: cc.Event.EventTouch) { this.begin("touch" + event.getID(), this.x(event)); event.stopPropagation(); } + private touchMove(event: cc.Event.EventTouch) { this.move("touch" + event.getID(), this.x(event)); event.stopPropagation(); } + private touchEnd(event: cc.Event.EventTouch) { this.end("touch" + event.getID()); event.stopPropagation(); } + private touchCancel(event: cc.Event.EventTouch) { this.end("touch" + event.getID(), true); event.stopPropagation(); } + private mouseDown(event: cc.Event.EventMouse) { if (event.getButton() === 0) this.begin("mouse", this.x(event)); } + private mouseMove(event: cc.Event.EventMouse) { this.move("mouse", this.x(event)); } + private mouseUp(event: cc.Event.EventMouse) { if (event.getButton() === 0) this.end("mouse"); } + private mouseLeave() { this.end("mouse"); } + + /** 应用当前位移;离视口中心越远的页面稍微缩小、变淡,让过渡更自然。 */ + private render() { + this.track.x = this.offset; + this.pageSlots.forEach(page => page.active = false); + for (let i = Math.max(0, this.index - 1); i <= Math.min(this.pages.length - 1, this.index + 1); i++) { + const page = this.pages[i]; + page.active = true; + page.x = i * this.width; + const distance = Math.min(1, Math.abs(i * this.width + this.offset) / this.width); + page.scale = 1 - distance * 0.025; + page.opacity = Math.round(255 - distance * 45); + } + } + + /** Cocos 每帧调用:推进白点动画,以及松手后的 0.32 秒页面缓动。 */ + update(dt: number) { + this.animateDots(dt); + if (!this.settling) return; + this.elapsed += dt; + const t = Math.min(1, this.elapsed / 0.32); + this.offset = this.from + (this.destination - this.from) * (1 - Math.pow(1 - t, 3)); + this.render(); + if (t === 1) this.settling = false; + } + + // 面板隐藏时结束未完成的手势和动画,避免再次显示时残留半途状态。 + onDisable() { + this.resetDotAnimation(); + this.pointer = null; + this.settling = false; + if (this.track && cc.isValid(this.track, true) && this.pageSlots.every(page => cc.isValid(page, true))) { this.offset = -this.index * this.width; this.render(); } + } +} diff --git a/assets/GameplayIntro/script/GuideCarousel.ts.meta b/assets/GameplayIntro/script/GuideCarousel.ts.meta new file mode 100644 index 00000000..fcc04539 --- /dev/null +++ b/assets/GameplayIntro/script/GuideCarousel.ts.meta @@ -0,0 +1,10 @@ +{ + "ver": "1.1.0", + "uuid": "8168b848-fae4-4c5b-9fd3-9b1a2f5b6104", + "importer": "typescript", + "isPlugin": false, + "loadPluginInWeb": true, + "loadPluginInNative": true, + "loadPluginInEditor": false, + "subMetas": {} +} \ No newline at end of file diff --git a/assets/Scene/GameScene.fire b/assets/Scene/GameScene.fire index 58e14f34..32fbf02f 100644 --- a/assets/Scene/GameScene.fire +++ b/assets/Scene/GameScene.fire @@ -88,6 +88,9 @@ }, { "__id__": 293 + }, + { + "__id__": 310 } ], "_active": true, @@ -801,6 +804,9 @@ }, { "__id__": 62 + }, + { + "__id__": 305 } ], "_active": true, @@ -14259,7 +14265,10 @@ "__uuid__": "fd85df88-648f-4407-bab2-da4f15478fb9" }, "messageNode": null, - "_id": "4cjBjPtcBO05zIQupw5luh" + "_id": "4cjBjPtcBO05zIQupw5luh", + "tipPanel": { + "__id__": 310 + } }, { "__type__": "f1883pXzMVIp5/ARDAWfZ7j", @@ -14362,5 +14371,306 @@ "_isTrimmedMode": true, "_atlas": null, "_id": "95joh5iDZB1IGmJkAeXXrL" + }, + { + "__type__": "cc.Node", + "_name": "tip", + "_objFlags": 0, + "_parent": { + "__id__": 15 + }, + "_children": [ + { + "__id__": 306 + } + ], + "_active": true, + "_components": [], + "_prefab": null, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 0, + "height": 0 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "e4LIw406xPc6DLoPDZ9wmy" + }, + { + "__type__": "cc.Node", + "_name": "GameplayInfoButton", + "_objFlags": 0, + "_parent": { + "__id__": 305 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 307 + }, + { + "__id__": 308 + } + ], + "_prefab": null, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 82.66666666666667, + "height": 88 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 282, + -60.562, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "Vg/+kIt8y9qkYZSB/Xx8wA" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 306 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "d9333256-302a-403b-93bf-e25c42829476" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_id": "7urvt+4r1Eol9iPd9AAi5Q" + }, + { + "__type__": "cc.Button", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 306 + }, + "_enabled": true, + "_normalMaterial": null, + "_grayMaterial": null, + "duration": 0.1, + "zoomScale": 1.2, + "clickEvents": [ + { + "__id__": 309 + } + ], + "_N$interactable": true, + "_N$enableAutoGrayEffect": false, + "_N$transition": 0, + "transition": 0, + "_N$normalColor": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_N$pressedColor": { + "__type__": "cc.Color", + "r": 211, + "g": 211, + "b": 211, + "a": 255 + }, + "pressedColor": { + "__type__": "cc.Color", + "r": 211, + "g": 211, + "b": 211, + "a": 255 + }, + "_N$hoverColor": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "hoverColor": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_N$disabledColor": { + "__type__": "cc.Color", + "r": 124, + "g": 124, + "b": 124, + "a": 255 + }, + "_N$normalSprite": null, + "_N$pressedSprite": null, + "pressedSprite": null, + "_N$hoverSprite": null, + "hoverSprite": null, + "_N$disabledSprite": null, + "_N$target": { + "__id__": 306 + }, + "_id": "4y6hgv/WvY4E/88bmCerjg" + }, + { + "__type__": "cc.ClickEvent", + "target": { + "__id__": 2 + }, + "component": "", + "_componentId": "80998T1AYNNRZdRxsVvXR65", + "handler": "openGameplayIntro", + "customEventData": "" + }, + { + "__type__": "cc.Node", + "_name": "tipPanel", + "_objFlags": 0, + "_parent": { + "__id__": 2 + }, + "_children": [], + "_active": false, + "_components": [], + "_prefab": null, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 0, + "height": 0 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "ffogY+noNEpL/dzRMkLQ4G" } -] \ No newline at end of file +] diff --git a/assets/Scene/HomeScene.fire b/assets/Scene/HomeScene.fire index 627ede87..f9305f73 100644 --- a/assets/Scene/HomeScene.fire +++ b/assets/Scene/HomeScene.fire @@ -1498,6 +1498,9 @@ }, { "__id__": 367 + }, + { + "__id__": 734 } ], "_active": true, @@ -31237,5 +31240,268 @@ "__id__": 731 }, "_id": "67zCbKKV9PvYlB9x+eob0L" + }, + { + "__type__": "cc.Node", + "_name": "chengxu", + "_objFlags": 0, + "_parent": { + "__id__": 31 + }, + "_children": [ + { + "__id__": 737 + } + ], + "_active": false, + "_components": [ + { + "__id__": 735 + }, + { + "__id__": 736 + } + ], + "_prefab": null, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 193, + "height": 179 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + -414.356, + -1248.26, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 0 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "3ad7c088-184a-4fb5-a7c2-affdb3ce19be" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 734 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "6f59a7ab-37f7-4e9f-b703-f4a3a548801a" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "6ebdc726-a5e2-40f3-bee2-f5b9801c8e46" + }, + { + "__type__": "cc.Button", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 734 + }, + "_enabled": true, + "_normalMaterial": null, + "_grayMaterial": null, + "duration": 0.1, + "zoomScale": 1.1, + "clickEvents": [], + "_N$interactable": true, + "_N$enableAutoGrayEffect": false, + "_N$transition": 3, + "transition": 3, + "_N$normalColor": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_N$pressedColor": { + "__type__": "cc.Color", + "r": 211, + "g": 211, + "b": 211, + "a": 255 + }, + "pressedColor": { + "__type__": "cc.Color", + "r": 211, + "g": 211, + "b": 211, + "a": 255 + }, + "_N$hoverColor": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "hoverColor": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_N$disabledColor": { + "__type__": "cc.Color", + "r": 124, + "g": 124, + "b": 124, + "a": 255 + }, + "_N$normalSprite": null, + "_N$pressedSprite": null, + "pressedSprite": null, + "_N$hoverSprite": null, + "hoverSprite": null, + "_N$disabledSprite": null, + "_N$target": null, + "_id": "55c173c4-2081-4215-92f0-e205c04659c9" + }, + { + "__type__": "cc.Node", + "_name": "red", + "_objFlags": 0, + "_parent": { + "__id__": 734 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 738 + } + ], + "_prefab": null, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 56, + "height": 56 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 73.095, + 63.753, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "11711833-8dde-4d70-8eac-7bf38990b96b" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 737 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "e124860a-ae6d-4aac-a0e2-5efc12a67b22" + }, + "_type": 0, + "_sizeMode": 1, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_id": "5f745abf-7461-4316-81df-2176c5495311" } -] \ No newline at end of file +] diff --git a/assets/Script/Block.ts b/assets/Script/Block.ts index 516661ff..74f8371d 100644 --- a/assets/Script/Block.ts +++ b/assets/Script/Block.ts @@ -1513,8 +1513,6 @@ export default class Block extends cc.Component { else { MapConroler._instance.costHammer(); } - MapConroler._instance.usePause(); - return false; } this.startPos = this.node.position; @@ -2099,7 +2097,7 @@ export default class Block extends cc.Component { // 与eliminate(魔法棒)的区别:锤子消除有更长的动画和震动效果 // 处理流程: // 1. 清除定时器 - // 2. 设置暂停状态,标记被锤子消除 + // 2. 标记被锤子消除,保留当前计时状态 // 3. 如果是锤子模式(ishammer): // a. 计算锤子落点位置(根据方块锚点anchorX不同而不同) // b. 延时300ms后播放锤子音效 @@ -2125,7 +2123,6 @@ export default class Block extends cc.Component { let self = this; this.isEliminatedByHammer = true; //锤子状态消失 - if (MapConroler && MapConroler._instance) MapConroler._instance.pause = true; if (MapConroler._instance.ishammer == true) { let parentSize = this.node.getContentSize(); setTimeout(() => { diff --git a/assets/Script/GameManager.ts b/assets/Script/GameManager.ts index 3d9f4629..7180224a 100644 --- a/assets/Script/GameManager.ts +++ b/assets/Script/GameManager.ts @@ -8,6 +8,7 @@ import Utils from "./module/Pay/Utils"; import { MiniGameManager } from "./Sdk/MiniGameManager"; import { MiniGameSdk } from "./Sdk/MiniGameSdk"; +import MiniProgramBenefitsBridge from "./module/MiniProgramBenefitsBridge"; const { ccclass, property } = cc._decorator; @@ -70,6 +71,7 @@ export default class GameManager extends cc.Component { if (typeof wx !== 'undefined' && wx !== null) { //@ts-ignore const launchOptions = wx.getLaunchOptionsSync(); + MiniProgramBenefitsBridge.instance.capture(launchOptions, "cold"); this.updateWucaiEntry(launchOptions); const query = launchOptions.query || {}; if (query.ge_ad_id) cc.fx.GameConfig.GM_INFO.ge_ad_id = query.ge_ad_id; @@ -172,6 +174,7 @@ export default class GameManager extends cc.Component { onShow(options?: any) { if (options) { this.updateWucaiEntry(options); + MiniProgramBenefitsBridge.instance.capture(options, "show"); } cc.audioEngine.resumeAll(); cc.game.resume(); @@ -531,6 +534,7 @@ export default class GameManager extends cc.Component { cc.fx.GameTool.getHealth((data) => { this.load5 = true; }); + MiniProgramBenefitsBridge.instance.onLogin(data.data); this.load6 = true; cc.fx.GameTool.iosCanPay(); diff --git a/assets/Script/JiaZai.ts b/assets/Script/JiaZai.ts index 58ca10c2..052433f9 100644 --- a/assets/Script/JiaZai.ts +++ b/assets/Script/JiaZai.ts @@ -19,6 +19,7 @@ import { applyStarterPackStatus, starterPackRemaining, starterPackTimeText, star import { initProvinceLocator } from "./module/Position/GetPosition"; import LoadingCatAnimation from "./LoadingCatAnimation"; import BlockAssetManager from "./module/Tool/BlockAssetManager"; +import MiniProgramBenefitsBridge from "./module/MiniProgramBenefitsBridge"; const { ccclass, property } = cc._decorator; @ccclass @@ -84,6 +85,7 @@ export default class JiaZai extends cc.Component { private starterPackDefaultPosition: cc.Vec2 = null; private starterPackOpening = false; private starterPackChecking = false; + private benefitsEntryOffset: cc.Vec2 = null; // 缓存 reward 预制体 private static cachedRewardPrefab: cc.Prefab | null = null; @@ -853,6 +855,7 @@ export default class JiaZai extends cc.Component { } onDestroy() { + MiniProgramBenefitsBridge.instance.detach(this.node); this.homeAutomaticTasks = []; this.homePopupOpenRequest++; this._sRankRequestId++; @@ -1073,6 +1076,7 @@ export default class JiaZai extends cc.Component { this.refreshNewPlayerActivityButtons(); this.setAdaptation(); + MiniProgramBenefitsBridge.instance.attach(this.node); // 加载广告 // cc.fx.GameTool.preloadRewardedVideoAd().then((success) => { // if (success) { @@ -1156,6 +1160,7 @@ export default class JiaZai extends cc.Component { "xinshou", "yicon", "shop", + "chengxu", "jungle", "hammer", "posBtn", @@ -3123,7 +3128,7 @@ export default class JiaZai extends cc.Component { return top && top.getChildByName("xinshou"); } - /** Jungle 隐藏时由新手礼包补位;两者同时显示时恢复原布局。 */ + /** 新手礼包补位时,福利入口保持场景中配置的相对间距。 */ private refreshHomeActivityEntryLayout(): void { let starterPackButton = this.getStarterPackHomeButton(); let jungleButton = this.getJungleTreasureHomeButton(); @@ -3135,10 +3140,26 @@ export default class JiaZai extends cc.Component { this.starterPackDefaultPosition = cc.v2(starterPackButton.x, starterPackButton.y); } + const benefitsButton = starterPackButton.parent.getChildByName("chengxu"); + if (benefitsButton && !this.benefitsEntryOffset) { + this.benefitsEntryOffset = cc.v2( + benefitsButton.x - this.starterPackDefaultPosition.x, + benefitsButton.y - this.starterPackDefaultPosition.y, + ); + } + let targetPosition = starterPackButton.active && !jungleButton.active ? cc.v2(jungleButton.x, jungleButton.y) : this.starterPackDefaultPosition; starterPackButton.setPosition(targetPosition); + if (benefitsButton && this.benefitsEntryOffset) { + // Hidden activities do not reserve slots above the benefits entry. + const benefitsPosition = starterPackButton.active + ? cc.v2(targetPosition.x + this.benefitsEntryOffset.x, targetPosition.y + this.benefitsEntryOffset.y) + : jungleButton.active ? this.starterPackDefaultPosition : cc.v2(jungleButton.x, jungleButton.y); + benefitsButton.setPosition(benefitsPosition); + } + MiniProgramBenefitsBridge.instance.refreshEntry(); } private setStarterPackHomeButtonVisible(visible: boolean): void { @@ -4079,7 +4100,11 @@ export default class JiaZai extends cc.Component { checkStarter_pack() { if (this.deferHomePopupWhileTransfer("starterPack", () => this.checkStarter_pack())) return; - if (cc.fx.GameConfig.GM_INFO.level < 15 || !cc.fx.GameConfig.GM_INFO.canIos || this.starterPackChecking) return; + if (cc.fx.GameConfig.GM_INFO.level < 15 || !cc.fx.GameConfig.GM_INFO.canIos) { + this.refreshHomeActivityEntryLayout(); + return; + } + if (this.starterPackChecking) return; this.starterPackChecking = true; const apply = (res) => { this.starterPackChecking = false; diff --git a/assets/Script/Map.ts b/assets/Script/Map.ts index f26bd45a..d7354781 100644 --- a/assets/Script/Map.ts +++ b/assets/Script/Map.ts @@ -1237,6 +1237,7 @@ export default class MapConroler extends cc.Component { if (!this.isMapRuntimeAlive()) return; this.ensureWinLoaded(error => onComplete(error)); } : null, + () => this.SceneManager.scheduleGameplayIntroPredownload(), ); }, 0); }; @@ -6097,8 +6098,6 @@ export default class MapConroler extends cc.Component { this.hammerMask.active = true; this.hammer = true; this.ishammer = true; - this.stopBoom(); - this.pause = true; // this.hammerLabel.string = cc.fx.GameConfig.GM_INFO.hammerAmount.toString(); if (this.guideHammerPending) this.destroyPropGuideMask(); return true; @@ -6126,12 +6125,6 @@ export default class MapConroler extends cc.Component { this.hammer = false; this.ishammer = false; - if (this.iceTrue() == false && !this.isPauseOpen() && !this.shopPause) { - this.pause = false; - if (this.gameStart == true) this.startBoom(); - } - - // 如果是使用连胜免费锤子,则不隐藏按钮并恢复其状态 if (this.hammerSpecial) { // console.log("取消的是连胜免费锤子"); diff --git a/assets/Script/SceneManager.ts b/assets/Script/SceneManager.ts index b3144cc3..656f6b4c 100644 --- a/assets/Script/SceneManager.ts +++ b/assets/Script/SceneManager.ts @@ -1,3 +1,5 @@ +import type GameplayIntro from "../GameplayIntro/script/GameplayIntro"; +import { getLevelGameplay } from "./module/Tool/LevelGameplay"; // Learn TypeScript: // - https://docs.cocos.com/creator/manual/en/scripting/typescript.html // Learn Attribute: @@ -43,10 +45,17 @@ export default class SceneManager extends cc.Component { if (bundleName === "action_bundle") return; if (!bundle) return; setTimeout(() => { - if (cc.fx.GameTool && cc.fx.GameTool.shouldRetainGameplayPopupBundlesForGameSceneReload + if (bundleName !== "gameplay_intro" && cc.fx.GameTool && cc.fx.GameTool.shouldRetainGameplayPopupBundlesForGameSceneReload && cc.fx.GameTool.shouldRetainGameplayPopupBundlesForGameSceneReload()) return; const active = SceneManager.activeInstance; - if (active && cc.isValid(active, true)) return; + if (active && cc.isValid(active, true)) { + if (bundleName !== "gameplay_intro") return; + // 旧场景晚到的介绍请求,仅在新场景确实接管此包时保留。 + if (Object.keys(active.dynamicPopupStates || {}).some(name => { + const state = active.dynamicPopupStates[name]; + return state.bundle === bundle || (state.loading && state.bundleName === bundleName); + })) return; + } if (cc.assetManager.getBundle(bundleName) !== bundle) return; bundle.releaseAll(); if (cc.assetManager.getBundle(bundleName) === bundle) { @@ -208,6 +217,36 @@ export default class SceneManager extends cc.Component { private dynamicPopupRetries: { [popupName: string]: { displayName: string; retry: () => void } } = {}; private dynamicPopupStates: { [popupName: string]: DynamicPopupState } = {}; private popupBundleWarmupStarted: boolean = false; + private gameplayIntroPredownloadScheduled: boolean = false; + + /** 地图就绪且弹窗预热结束后调用;持续空闲一秒才派发,只下载,不 loadBundle。 */ + scheduleGameplayIntroPredownload() { + //@ts-ignore + if (cc.sys.platform !== cc.sys.WECHAT_GAME || typeof wx === "undefined" || !wx.preDownloadSubpackage) return; + if (this.gameplayIntroPredownloadScheduled || !this.isPopupRuntimeAlive()) return; + this.gameplayIntroPredownloadScheduled = true; + let idle = false; + const check = () => { + if (!this.isPopupRuntimeAlive()) return; + const tool = cc.fx.GameTool; + if (tool.isGameplayIntroDownloaded()) return; + const busy = tool.hasPendingGameplayResourceLoads() || cc.fx.GameConfig.isGameplayEntryPreparing() + || Object.keys(this.dynamicPopupLoads).length > 0 + || Object.keys(this.dynamicPopupStates).some(name => this.dynamicPopupStates[name].loading); + if (busy || !idle) { + idle = !busy; + this.scheduleOnce(check, 1); + return; + } + tool.predownloadGameplayIntro().then(ready => { + if (!ready && this.isPopupRuntimeAlive()) { + idle = false; + this.scheduleOnce(check, 10); + } + }); + }; + this.scheduleOnce(check, 1); + } warmupGameplayPopupBundles( preloadInstances: boolean = false, @@ -295,11 +334,15 @@ export default class SceneManager extends cc.Component { && !!cc.fx.GameTool && !!cc.fx.GameTool.isIOSDevice && cc.fx.GameTool.isIOSDevice(); - if (!shouldWarmupPauseBundle) return; + if (!shouldWarmupPauseBundle) { + if (onComplete) onComplete(); + return; + } const loadedPauseBundle = cc.assetManager.getBundle("pause"); if (loadedPauseBundle) { console.log("[PopupBundle] already loaded: pause (iOS low-memory warmup)"); + if (onComplete) onComplete(); return; } cc.assetManager.loadBundle("pause", (error: Error, bundle: cc.AssetManager.Bundle) => { @@ -309,9 +352,11 @@ export default class SceneManager extends cc.Component { } if (error) { cc.warn("[PopupBundle] loadBundle failed: pause (iOS low-memory warmup)", error.message || error); + if (onComplete) onComplete(error); return; } console.log("[PopupBundle] loadBundle complete: pause (iOS low-memory warmup)"); + if (onComplete) onComplete(); }); } @@ -548,7 +593,10 @@ export default class SceneManager extends cc.Component { state.root = null; const bundle = state.bundle || cc.assetManager.getBundle(state.bundleName); state.bundle = null; - if (bundle && !retainBundle) this.releaseDynamicPopupBundle(state.bundleName, bundle); + // 介绍只缓存到当前关,不能混入五个常用弹窗的切关保留策略。 + if (bundle && (!retainBundle || state.bundleName === "gameplay_intro")) { + this.releaseDynamicPopupBundle(state.bundleName, bundle); + } } this.finishDynamicPopupLoad(popupName); } @@ -698,7 +746,18 @@ export default class SceneManager extends cc.Component { return true; } + // 在 Creator 的 Inspector 中绑定场景现有 tipPanel;打开后的预制体挂到这里。 + @property(cc.Node) + tipPanel: cc.Node = null; + + // 保存已创建的面板控制器,重复打开复用实例;玩法图片仍由面板按需加载/释放。 + private gameplayIntro: GameplayIntro = null; + private levelGameplay: any[] = []; + isPauseOpen(): boolean { + // 加载期间及面板显示期间都视为暂停,避免重复打开或其它流程提前恢复游戏。 + if (this.dynamicPopupLoads && this.dynamicPopupLoads.gameplayIntro) return true; + if (this.gameplayIntro && cc.isValid(this.gameplayIntro.node) && this.gameplayIntro.node.active) return true; const pauseRoot = this.getDynamicPopup("pause"); return !!(this.dynamicPopupLoads && this.dynamicPopupLoads.pause) || (!!pauseRoot && pauseRoot.active); @@ -792,6 +851,7 @@ export default class SceneManager extends cc.Component { this.dynamicPopupRetries = {}; this.dynamicPopupStates = {}; this.popupBundleWarmupStarted = false; + this.refreshGameplayInfo(); this.ensureLoadingOnTop(); const intercept = this.ensureDynamicPopupIntercept(); if (intercept) intercept.active = false; @@ -865,6 +925,8 @@ export default class SceneManager extends cc.Component { && cc.fx.GameTool.shouldRetainGameplayPopupBundlesForGameSceneReload(); Object.keys(this.dynamicPopupStates || {}).forEach((popupName) => this.releaseDynamicPopup(popupName, true, retainPopupBundles)); + const introBundle = cc.assetManager.getBundle("gameplay_intro"); + if (introBundle) this.releaseDynamicPopupBundleIfUnused("gameplay_intro", introBundle); if (!retainPopupBundles) { ["pause", "NewMode", "propWindow", "lose"].forEach((bundleName) => { const bundle = cc.assetManager.getBundle(bundleName); @@ -1158,8 +1220,75 @@ export default class SceneManager extends cc.Component { }); } - start() { + /** 关卡数据在进入场景前已加载;按完整关卡保存列表,消除道具后仍可查阅。 */ + private refreshGameplayInfo() { + const button = cc.find("Game/GameNode/Top/tip/GameplayInfoButton", this.node); + const apply = (config: any[]) => { + this.levelGameplay = getLevelGameplay(config, cc.fx.GameConfig); + if (button && cc.isValid(button)) button.active = this.levelGameplay.length > 0; + }; + if (cc.fx.GameConfig.NEW_LEVEL) { + apply(cc.fx.GameConfig.NEW_LEVEL); + } else { + // 全局介绍配置是异步读取的,首次进场景时可能仍在加载。 + if (button) button.active = false; + cc.resources.load("Json/NEW_LEVEL", cc.JsonAsset, (error, asset: cc.JsonAsset) => { + if (!this.isPopupRuntimeAlive()) return; + if (error) { cc.error("Gameplay introductions failed to load", error); return; } + apply(asset.json.NEW_LEVEL); + }); + } + } + /** + * 问号 Button 的点击入口。场景按钮需绑定这个方法,Tip Panel 属性需绑定容器节点。 + * 顺序:检查能否打开 → 暂停游戏 → 加载/复用预制体 → 交给 GameplayIntro 显示内容。 + */ + openGameplayIntro() { + if (!this.isPopupRuntimeAlive() || this.isPauseOpen()) return; + if (!this.levelGameplay.length) return; + const map = MapConroler._instance; + if (!map || map.gameOver || map.shopPause) return; + if (!this.tipPanel || !cc.isValid(this.tipPanel)) { + cc.error("GameplayIntro: SceneManager.tipPanel is not assigned"); + return; + } + // 关闭或加载失败时尝试恢复;仍有冰冻、其它暂停面板、商城或已结束时不能强行恢复。 + const resume = () => { + if (!this.isPopupRuntimeAlive()) return; + if (!map.iceTrue() && !this.isPauseOpen() && !map.shopPause && !map.gameOver) { + map.pause = false; + if (map.gameStart) map.startBoom(); + } + }; + // 暂停游戏,并停止场上炸弹计时,避免阅读玩法期间仍消耗倒计时。 + map.pause = true; + map.stopBoom(); + this.tipPanel.active = true; + this.tipPanel.zIndex = cc.macro.MAX_ZINDEX - 2; + // 参数依次为:弹窗缓存名、资源包名、包内预制体路径、挂载父节点、完成回调。 + // 通用加载器首次会 instantiate 并挂载到 tipPanel,以后返回已经创建的根节点。 + this.loadDynamicPopup("gameplayIntro", "gameplay_intro", "prefab/GameplayIntro", this.tipPanel, (error, root) => { + // 无论成功失败都结束加载状态,防止暂停检测一直误认为还在加载。 + this.finishDynamicPopupLoad("gameplayIntro"); + if (error || !root) { + cc.error("GameplayIntro prefab failed to load", error); + resume(); + return; + } + const panel = root.getComponent("GameplayIntro") as GameplayIntro; + if (!panel) { + cc.error("GameplayIntro prefab is missing its controller"); + resume(); + return; + } + // 同一实例只绑定一次关闭回调,避免重开多次后一次关闭触发多次恢复。 + if (this.gameplayIntro !== panel) { + this.gameplayIntro = panel; + root.on("intro-closed", resume); + } + panel.open(this.levelGameplay); + }); } startGame() { diff --git a/assets/Script/module/Config/GameConfig.ts b/assets/Script/module/Config/GameConfig.ts index 4b2940df..88de4642 100644 --- a/assets/Script/module/Config/GameConfig.ts +++ b/assets/Script/module/Config/GameConfig.ts @@ -736,7 +736,7 @@ export class GameConfig { vibrateOpen: true, //震动 coinnum: 0, //每局的金币数 paid_user: false, //是否是付费用户 - version: "1.0.58", //版本号 + version: "1.0.60", //版本号 shushu_DistinctId: "", //数数访客ID shushu_AccountId: "", //数数账号ID uid: "", //用户和后端唯一id diff --git a/assets/Script/module/GameStart/GameAppStart.ts b/assets/Script/module/GameStart/GameAppStart.ts index a5f17963..2fa579c4 100644 --- a/assets/Script/module/GameStart/GameAppStart.ts +++ b/assets/Script/module/GameStart/GameAppStart.ts @@ -27,6 +27,7 @@ window.initMgr = function () { cc.fx.GameConfig = GameConfig; cc.fx.HttpUtil = HttpUtil; cc.fx.GameTool = GameTool; + GameTool.trackResourceLoads(); cc.fx.Notifications = Notifications; diff --git a/assets/Script/module/MiniProgramBenefitsBridge.ts b/assets/Script/module/MiniProgramBenefitsBridge.ts new file mode 100644 index 00000000..4574c0f2 --- /dev/null +++ b/assets/Script/module/MiniProgramBenefitsBridge.ts @@ -0,0 +1,392 @@ +import LoadingCatAnimation from "../LoadingCatAnimation"; +import SevenDayGiftBootstrapApi from "../seven_day_gift/SevenDayGiftBootstrapApi"; + +declare const wx: any; + +const BUNDLE = "mini_program_benefits"; +const TASKS = ["favorite_entry", "desktop_entry"]; + +/** HomeScene entry bridge. UI and the reward adapter live in the lazy bundle. */ +export default class MiniProgramBenefitsBridge { + static readonly instance = new MiniProgramBenefitsBridge(); + private uid = ""; + private pendingEntries: { [task: string]: number } = {}; + private state: any = {}; + private diagnostics: any[] = []; + private home: cc.Node = null; + private entryNode: cc.Node = null; + private entryRed: cc.Node = null; + private entryFrame: cc.SpriteFrame = null; + private entryVisual: cc.Node = null; + private onEntryTouch = (): void => { this.open(); }; + private session: any = null; + private rewardRequests = 0; + private testMount = 0; + private testNode: cc.Node = null; + private testBundle: cc.AssetManager.Bundle = null; + private bundleUsers = 0; + private sharedBundle: cc.AssetManager.Bundle = null; + private releaseBundleUser(): void { + this.bundleUsers--; + if (this.bundleUsers === 0 && this.sharedBundle) { + this.sharedBundle.releaseAll(); + cc.assetManager.removeBundle(this.sharedBundle); + this.sharedBundle = null; + } + } + private listeners: Array<() => void> = []; + + isWechat(): boolean { + return cc.sys.platform === cc.sys.WECHAT_GAME && !!this.wxApi(); + } + private wxApi(): any { return typeof wx !== "undefined" ? wx : null; } + protected info(): any { return cc.fx.GameConfig.GM_INFO as any; } + getUid(): string { return this.uid; } + getState(): any { return this.state; } + getTestEnvironment() { return SevenDayGiftBootstrapApi.getTestEnvironment(); } + getTestSnapshot(): any { + return { uid: this.uid, level: this.info().level, environment: this.getTestEnvironment(), + loginWelfare: this.info().miniProgramWelfare, state: this.state, + eligibility: this.readEligibility(), diagnostics: this.getDiagnostics(), + entryVisible: !!(this.entryNode && this.entryNode.active), + redDot: !!(this.entryNode && this.entryNode.active && this.entryRed && this.entryRed.active), + panelBusy: !!this.session }; + } + setTestEligibility(task?: string): void { + if (!this.getTestEnvironment().allowed) throw new Error("仅独立测试服可操作"); + if (!this.uid) throw new Error("请等待登录完成"); + if (this.session) throw new Error("请先关闭福利弹窗并等待释放完成"); + if (task && TASKS.indexOf(task) < 0) throw new Error("未知入口类型"); + const eligibility = task ? this.readEligibility() : {}; + if (task) eligibility[task] = Date.now(); + cc.sys.localStorage.setItem(this.getEligibilityKey(), JSON.stringify(eligibility)); + this.pendingEntries = {}; + TASKS.forEach(id => this.state[id] = { ...this.state[id], eligibleAt: eligibility[id] || 0 }); + this.changed(); + } + private getEligibilityKey(): string { return "mini_program_benefits_eligibility_v1:" + this.uid; } + clearTestClaimCache(): void { + if (!this.getTestEnvironment().allowed) throw new Error("仅独立测试服可操作"); + if (!this.uid) throw new Error("请等待登录完成"); + if (this.session || this.rewardRequests) throw new Error("请先关闭福利弹窗并等待领取请求完成"); + const prop = cc.fx.StorageMessage.getStorage("prop"); + if (prop && prop.welfareCredits) { + const credits = { ...prop.welfareCredits }; + ["favorite", "desktop"].forEach(type => delete credits["welfare:" + this.uid + ":" + type]); + cc.fx.StorageMessage.setStorage("prop", { ...prop, welfareCredits: credits }); + } + const flags = this.info().miniProgramWelfare; + TASKS.forEach((task, index) => { + const key = index === 0 ? "favorite" : "desktop"; + this.state[task] = { eligibleAt: this.state[task] && this.state[task].eligibleAt || 0, + claimedAt: flags && flags[key] === true ? 1 : 0, acknowledged: true }; + }); + this.changed(); + } + private readEligibility(): any { + try { + const saved = JSON.parse(cc.sys.localStorage.getItem(this.getEligibilityKey()) || "{}"); + const result: any = {}; + TASKS.forEach(task => { + if (saved && typeof saved[task] === "number" && Number.isFinite(saved[task]) && saved[task] > 0) result[task] = saved[task]; + }); + return result; + } catch (_) { return {}; } + } + getRewardStorageKey(): string { return "mini_program_benefits_rewards_v1:" + this.uid; } + getDiagnostics(): any[] { return this.diagnostics.map(item => ({ ...item })); } + subscribe(callback: () => void): () => void { + this.listeners.push(callback); + return () => { this.listeners = this.listeners.filter(item => item !== callback); }; + } + private changed(): void { + this.refreshEntry(); + this.listeners.slice().forEach(callback => callback()); + } + + // Device-tested 1104/1023 record local eligibility; this is not server-verified entry proof. + capture(options: any, lifecycle: "cold" | "show"): void { + if (!this.isWechat()) return; + // Match the panel: cold launch options may describe an older entry after re-entry. + const api = this.wxApi(); + if (api && typeof api.getEnterOptionsSync === "function") { + try { + const current = api.getEnterOptionsSync(); + if (current && Number(current.scene) > 0) options = current; + } catch (_) { /* Older clients can still use the lifecycle callback options. */ } + } + this.diagnostics.push({ scene: Number(options && options.scene) || 0, lifecycle, observedAt: Date.now() }); + this.diagnostics = this.diagnostics.slice(-24); + const scene = Number(options && options.scene); + const task = scene === 1104 ? "favorite_entry" : scene === 1023 ? "desktop_entry" : ""; + if (task) { + this.pendingEntries[task] = Date.now(); + this.saveEntryEligibility(); + } + } + private saveEntryEligibility(): void { + if (!this.uid || !Object.keys(this.pendingEntries).length) return; + const eligibility = this.readEligibility(); + Object.keys(this.pendingEntries).forEach(task => { + eligibility[task] = eligibility[task] || this.pendingEntries[task]; + }); + try { cc.sys.localStorage.setItem(this.getEligibilityKey(), JSON.stringify(eligibility)); } + catch (_) { this.toast("入口资格保存失败,请从对应入口重新进入重试"); return; } + Object.keys(this.pendingEntries).forEach(task => { + this.state[task] = { ...this.state[task], eligibleAt: eligibility[task] }; + }); + this.pendingEntries = {}; + this.changed(); + } + onLogin(user: any): void { + if (!this.isWechat()) return; + const nextUid = String(user && user._id || this.info().uid || ""); + if (this.uid !== nextUid) { + this.close(); + if (this.uid) this.pendingEntries = {}; + } + this.uid = nextUid; + const welfare = user && user.miniProgramWelfare; + this.info().miniProgramWelfare = welfare; + const eligibility = this.uid ? this.readEligibility() : {}; + this.state = {}; + TASKS.forEach((task, index) => { + const key = index === 0 ? "favorite" : "desktop"; + this.state[task] = { eligibleAt: eligibility[task] || 0, claimedAt: welfare && welfare[key] === true ? 1 : 0, acknowledged: true }; + }); + this.saveEntryEligibility(); + this.changed(); + } + bindRewardApi(api: any): void { + if (this.session && !this.session.cancelled) this.session.api = api; + } + private async request(action: string, params: any = {}): Promise { + if (!this.uid) throw new Error("登录尚未完成,请稍后重试"); + const session = this.session; + if (!session || session.cancelled || !session.api) throw new Error("请重新打开福利面板"); + const uid = this.uid; + this.rewardRequests++; + let data: any; + try { data = await session.api.request(action, params, Number(this.info().level)); } + finally { this.rewardRequests--; } + if (uid !== this.uid) throw new Error("账号已切换,请重新打开"); + this.state = data.state; + this.changed(); + return data; + } + refresh(): Promise { return this.request("read"); } + claim(task: string): Promise { return this.request("claim", { task }); } + acknowledge(task: string, receiptId: string): Promise { return this.request("ack", { task, receiptId }); } + + attach(home: cc.Node): void { + const sceneEntry = cc.find("Load/Top/chengxu", home); + if (!this.isWechat()) { + if (sceneEntry) sceneEntry.active = false; + return; + } + if (this.home === home && this.entryNode && cc.isValid(this.entryNode)) return; + this.detach(); + this.home = home; + // 暂停加载测试面板;恢复测试时重新启用,并打开预制体 entry 节点。 + // this.mountTestPanel(home); + // HomeScene owns this node and its position; never replace or reposition it. + if (!sceneEntry) return; + const entry = this.entryNode = sceneEntry; + const sceneSprite = entry.getComponent(cc.Sprite); + if (!sceneSprite || !sceneSprite.spriteFrame) { + // Text fallback for isolated test scenes or a missing scene sprite. + const visual = this.entryVisual = new cc.Node("benefitsVisual"); + visual.parent = entry; visual.setContentSize(entry.getContentSize()); + const graphics = visual.addComponent(cc.Graphics); + graphics.fillColor = cc.color(246, 206, 115); + graphics.roundRect(-89, -74, 178, 148, 24); graphics.fill(); + const text = new cc.Node("label"); text.active = false; text.parent = visual; + const label = text.addComponent(cc.Label); + label.useSystemFont = true; label.fontFamily = "Arial"; + label.fontSize = 34; label.lineHeight = 41; + label.horizontalAlign = cc.Label.HorizontalAlign.CENTER; + label.verticalAlign = cc.Label.VerticalAlign.CENTER; + label.overflow = cc.Label.Overflow.SHRINK; + label.string = "小程序\n福利"; + text.setContentSize(168, 126); text.active = true; + text.color = cc.color(108, 60, 37); + // Only this small entry texture lives in resources; the UI bundle remains lazy. + if (cc.resources) cc.resources.load("texture/mini-program-benefits-entry", cc.SpriteFrame, (error, frame: cc.SpriteFrame) => { + if (error || !frame) return; + if (this.entryNode !== entry || this.entryVisual !== visual || !cc.isValid(visual, true)) { + frame.addRef(); frame.decRef(); return; + } + frame.addRef(); this.entryFrame = frame; + graphics.enabled = false; text.active = false; + const sprite = visual.addComponent(cc.Sprite); sprite.spriteFrame = frame; + sprite.sizeMode = cc.Sprite.SizeMode.CUSTOM; sprite.trim = false; + visual.setContentSize(entry.getContentSize()); + }); + } + // HomeScene binds this activity's badge directly to the shared UI/red sprite. + this.entryRed = entry.getChildByName("red"); + if (!this.entryRed) { + // Isolated test scenes may omit the serialized badge. + this.entryRed = new cc.Node("red"); this.entryRed.parent = entry; + this.entryRed.setPosition(73.095, 63.753); + this.entryRed.setContentSize(56, 56); + } + entry.on(cc.Node.EventType.TOUCH_END, this.onEntryTouch); + this.refreshEntry(); + } + detach(home?: cc.Node): void { + if (home && this.home !== home) return; + this.close(); + this.testMount++; + if (this.testNode && cc.isValid(this.testNode)) this.testNode.destroy(); + this.testNode = null; + if (this.testBundle) { + this.testBundle = null; + cc.director.once(cc.Director.EVENT_AFTER_DRAW, () => this.releaseBundleUser()); + } + if (this.entryNode && cc.isValid(this.entryNode)) { + this.entryNode.off(cc.Node.EventType.TOUCH_END, this.onEntryTouch); + this.entryNode.active = false; + } + if (this.entryVisual && cc.isValid(this.entryVisual)) this.entryVisual.destroy(); + if (this.entryRed && cc.isValid(this.entryRed)) this.entryRed.active = false; + this.entryVisual = null; + const frame = this.entryFrame; this.entryFrame = null; + if (frame) cc.director.once(cc.Director.EVENT_AFTER_DRAW, () => frame.decRef()); + this.entryNode = this.entryRed = this.home = null; + } + private mountTestPanel(home: cc.Node): void { + if (!this.getTestEnvironment().allowed) return; + const token = ++this.testMount; + this.bundleUsers++; + cc.assetManager.loadBundle(BUNDLE, (error, bundle) => { + if (error || !bundle) { this.releaseBundleUser(); this.toast("福利测试面板加载失败"); return; } + this.sharedBundle = bundle; + const valid = () => token === this.testMount && this.home === home + && cc.isValid(home, true) && this.getTestEnvironment().allowed; + if (!valid()) { this.releaseBundleUser(); return; } + bundle.load("test/BenefitsRuntimeTest", cc.Prefab, (loadError, prefab: cc.Prefab) => { + if (loadError || !prefab || !valid()) { this.releaseBundleUser(); return; } + const ctor = cc.js.getClassByName("BenefitsRuntimeTest"); + if (!ctor) { this.releaseBundleUser(); this.toast("请重新构建福利活动分包"); return; } + this.testBundle = bundle; + const node = this.testNode = cc.instantiate(prefab); + node.active = false; + const component: any = node.addComponent(ctor as any); + component.initialize(this); + node.parent = home; node.zIndex = 3002; node.active = true; + }); + }); + } + refreshEntry(): void { + if (!this.entryNode || !cc.isValid(this.entryNode)) return; + const allClaimed = TASKS.every(id => this.state[id] && this.state[id].claimedAt); + const pendingReceipt = TASKS.some(id => this.state[id] && this.state[id].claimedAt && !this.state[id].acknowledged); + // Keep the entry until an outstanding awarded receipt has been shown/acknowledged after response loss. + this.entryNode.active = Number(this.info().level) >= 1 && (!allClaimed || pendingReceipt); + this.entryRed.active = TASKS.some(id => this.state[id] && this.state[id].eligibleAt && !this.state[id].claimedAt) || pendingReceipt; + } + + async open(): Promise { + if (!this.home || !cc.isValid(this.home) || Number(this.info().level) < 1) return; + if (this.session) { + if (!this.session.cancelled) return; + await this.session.done; + return this.open(); // recheck after awaiting: multiple rapid reopen clicks still create one session + } + const session: any = { home: this.home, cancelled: false, bundle: null, node: null }; + this.session = session; + session.done = this.loadPanel(session); + await session.done; + } + private startEntryLoading(session: any): void { + const home: cc.Node = session.home; + const template = home.getChildByName("Loading") + || (home.parent && home.parent.getChildByName("Loading")); + if (!template) return; + const parent = template.parent; + const size = parent.getContentSize(); + const factor = Math.min(1, size.width / 1080, size.height / 1920); + const viewport = new cc.Node("BenefitsLoading"); + viewport.setContentSize(size.width / factor, size.height / factor); + viewport.scale = factor; viewport.parent = parent; viewport.zIndex = cc.macro.MAX_ZINDEX; + viewport.addComponent(cc.BlockInputEvents); + const loading = cc.instantiate(template); loading.parent = viewport; + // Clone only the existing visual; all animation remains in the shared implementation. + session.stopLoading = () => { + LoadingCatAnimation.stop(loading); + viewport.active = false; viewport.destroy(); + }; + LoadingCatAnimation.play(loading); + } + + private stopEntryLoading(session: any): void { + const stop = session.stopLoading; session.stopLoading = null; + if (stop) stop(); + } + + private async loadPanel(session: any): Promise { + this.bundleUsers++; + try { + this.startEntryLoading(session); + session.bundle = await new Promise((resolve, reject) => { + cc.assetManager.loadBundle(BUNDLE, (error, bundle) => error ? reject(error) : resolve(bundle)); + }); + this.sharedBundle = session.bundle; + if (session.cancelled || !cc.isValid(session.home)) return; + const bundle: cc.AssetManager.Bundle = session.bundle; + const prefab = await new Promise((resolve, reject) => { + bundle.load("prefab/BenefitsWindow", cc.Prefab, (error, asset) => error ? reject(error) : resolve(asset as cc.Prefab)); + }); + if (session.cancelled || !cc.isValid(session.home, true)) return; + session.node = cc.instantiate(prefab); + session.node.parent = session.home; session.node.zIndex = 3000; + const panel: any = session.node.getComponent("MiniProgramBenefitsPanel"); + if (!panel) throw new Error("福利预制体缺少控制组件"); + panel.init(this); + } catch (error) { + session.cancelled = true; + if (cc.isValid(session.home) && this.home === session.home) this.toast("福利加载失败,请重试"); + } finally { + this.stopEntryLoading(session); + session.loaded = true; + if (session.cancelled || !cc.isValid(session.home)) await this.releaseSession(session); + } + } + close(): void { + const session = this.session; + if (!session || session.cancelled) return; + session.cancelled = true; + this.stopEntryLoading(session); + if (session.node && cc.isValid(session.node)) { session.node.active = false; session.node.destroy(); } + if (session.loaded) session.done = this.releaseSession(session); + } + onPanelDestroyed(node: cc.Node): void { + if (this.session && this.session.node === node) this.close(); + } + private async releaseSession(session: any): Promise { + if (session.releasing) return session.releasing; + session.releasing = new Promise(resolve => { + const release = () => { + // Test entry and activity window share the same bundle; release after both leave. + this.releaseBundleUser(); + session.api = session.bundle = session.node = session.home = null; + if (this.session === session) this.session = null; + resolve(); + }; + if (session.node) { + if (cc.isValid(session.node)) session.node.destroy(); + // destroy() is deferred: release textures only after onDestroy has detached listeners/sprites. + cc.director.once(cc.Director.EVENT_AFTER_DRAW, release); + } else release(); + }); + return session.releasing; + } + toast(message: string): void { + const wx = this.wxApi(); + if (wx && wx.showToast) wx.showToast({ title: message, icon: "none", duration: 2500 }); + } +} + + + diff --git a/assets/Script/module/MiniProgramBenefitsBridge.ts.meta b/assets/Script/module/MiniProgramBenefitsBridge.ts.meta new file mode 100644 index 00000000..4a00f547 --- /dev/null +++ b/assets/Script/module/MiniProgramBenefitsBridge.ts.meta @@ -0,0 +1,10 @@ +{ + "ver": "1.1.0", + "uuid": "a5161766-f26e-47d5-8354-5605b1d925c5", + "importer": "typescript", + "isPlugin": false, + "loadPluginInWeb": true, + "loadPluginInNative": true, + "loadPluginInEditor": false, + "subMetas": {} +} \ No newline at end of file diff --git a/assets/Script/module/Tool/BlockAssetManager.ts b/assets/Script/module/Tool/BlockAssetManager.ts index 50592feb..772f8316 100644 --- a/assets/Script/module/Tool/BlockAssetManager.ts +++ b/assets/Script/module/Tool/BlockAssetManager.ts @@ -65,6 +65,12 @@ export default class BlockAssetManager { private foregroundLoads = 0; private entryDownloadHolds = 0; + /** 包括直存下载、排队任务和整批后台缓存,供最低优先级分包让路。 */ + hasPendingLoads(): boolean { + return this.foregroundLoads > 0 || this.entryDownloadHolds > 0 || this.backgroundRunning + || this.loading.size > 0 || this.fileDownloads.size > 0 || this.downloadQueue.length > 0; + } + /** 只停止后台派发;已在途下载继续完成,进关所需文件仍可提优先级。 */ holdBackgroundDownloads(): () => void { this.entryDownloadHolds++; diff --git a/assets/Script/module/Tool/GameTool.ts b/assets/Script/module/Tool/GameTool.ts index a412df36..9fd3d636 100644 --- a/assets/Script/module/Tool/GameTool.ts +++ b/assets/Script/module/Tool/GameTool.ts @@ -5,6 +5,7 @@ import Freeze from "../../prop/Freeze"; import SceneManager from "../../SceneManager"; import { MiniGameSdk } from "../../Sdk/MiniGameSdk"; import Utils from "../Pay/Utils"; +import BlockAssetManager from "./BlockAssetManager"; import { starterPackReward, applyStarterPackStatus, starterPackRemaining, starterPackNow, starterPackDay, starterPackPopupKey, starterPackFailureKey, starterPackRecordResult @@ -12,7 +13,7 @@ import { //@ts-ignore //最大工具类 各种公共方法,以及处理上传,获取后端接口数据 var GameTool = { - MAX_NORMAL_LEVEL: 1980, + MAX_NORMAL_LEVEL: 1960, starterPackReactivationUid: "", starterPackQueuedReason: "", MEMORY_WARNING_EVENT: "game-memory-warning", @@ -34,6 +35,73 @@ var GameTool = { _lowMemoryMode: false, _memoryWarningCount: 0, _gameplayPopupSubpackageDownloaded: {}, + _resourceLoadTrackingInstalled: false, + _pendingResourceLoads: 0, + _gameplayIntroDownload: null as Promise, + + /** 在启动入口安装;公开管线覆盖 load/preload/Bundle 及其排队、解析阶段。 */ + trackResourceLoads() { + if (this._resourceLoadTrackingInstalled) return; + this._resourceLoadTrackingInstalled = true; + [cc.assetManager.pipeline, cc.assetManager.fetchPipeline].forEach(pipeline => { + pipeline.insert((task, done) => { + this._pendingResourceLoads++; + const complete = task.onComplete; + let finished = false; + task.onComplete = (...args) => { + if (!finished) { + finished = true; + this._pendingResourceLoads--; + } + if (complete) complete.apply(task, args); + }; + task.output = task.input; + done(null); + }, 0); + }); + }, + + hasPendingGameplayResourceLoads(): boolean { + return !this._resourceLoadTrackingInstalled || this._pendingResourceLoads > 0 + || !!this._gameplayPopupSubpackagePreloadPromise || !!this._gameplayPopupMemoryWarmupPromise + || BlockAssetManager.instance.hasPendingLoads(); + }, + + isGameplayIntroDownloaded(): boolean { + return !!this._gameplayPopupSubpackageDownloaded.gameplay_intro + || !!cc.assetManager.getBundle("gameplay_intro"); + }, + + /** 仅预下载;跨启动的磁盘缓存由微信检查,不持久化可能失效的“已下载”标记。 */ + predownloadGameplayIntro(): Promise { + if (this.isGameplayIntroDownloaded()) return Promise.resolve(true); + if (this._gameplayIntroDownload) return this._gameplayIntroDownload; + // 老基础库不回退到 loadSubpackage,避免后台预下载顺带执行分包脚本。 + //@ts-ignore + const wechat = typeof wx !== "undefined" ? wx : null; + if (!wechat || !wechat.preDownloadSubpackage) return Promise.resolve(false); + this._gameplayIntroDownload = new Promise(resolve => { + console.log("[GameplayIntro] idle subpackage predownload start"); + try { + wechat.preDownloadSubpackage({ + name: "gameplay_intro", + success: () => { + this._gameplayPopupSubpackageDownloaded.gameplay_intro = true; + console.log("[GameplayIntro] subpackage cached; Bundle remains unloaded"); + resolve(true); + }, + fail: error => { cc.warn("[GameplayIntro] predownload failed", error); resolve(false); }, + }); + } catch (error) { + cc.warn("[GameplayIntro] predownload failed", error); + resolve(false); + } + }).then(ready => { + this._gameplayIntroDownload = null; + return ready; + }); + return this._gameplayIntroDownload; + }, _gameplayPopupSubpackageRetryTimer: null, _gameplayPopupSubpackagePreloadPromise: null, _gameplayPopupMemoryWarmupPromise: null, diff --git a/assets/Script/module/Tool/LevelGameplay.ts b/assets/Script/module/Tool/LevelGameplay.ts new file mode 100644 index 00000000..46cd9d2a --- /dev/null +++ b/assets/Script/module/Tool/LevelGameplay.ts @@ -0,0 +1,74 @@ +/** 从实际加载的关卡筛选介绍,不使用玩家进度或首次解锁关卡。 */ +export function getLevelGameplay(config: any[], data: any): any[] { + const level = data.LEVEL_INFO && data.LEVEL_INFO[0] || {}; + const blocks = (data.BLOCK_INFO && data.BLOCK_INFO[0] || []).slice(); + const walls = data.WALL_INFO && data.WALL_INFO[0] || []; + const names = new Set(); + const add = (id: number) => names.add("daoju" + id); + + // 生成区域里尚未出场的方块也属于本关;不扫描会随消除而变化的场景节点。 + const gates = level.spawnGates || []; + if (gates.length) add(33); + gates.forEach(gate => (gate.spawnQueue || []).forEach(item => { + blocks.push(...(item.members || [])); + })); + + blocks.forEach(block => { + if (!block || block.block == null || Number(block.block) === 23) return; + const type = Number(block.type); + switch (type) { + case 1: case 10: add(block.colorChange != null ? 21 : 1); break; + case 2: case 3: case 12: case 13: add(4); break; + case 4: add(2); break; + case 5: add(3); break; + case 6: add(7); break; + case 7: case 8: add(Number(block.lockTime) > 0 ? 31 : 0); break; + case 9: case 19: add(Number(block.lockTime) > 0 ? 17 : 5); break; + case 11: add(11); break; + case 14: add(14); break; + case 16: add(16); break; + case 17: add(18); break; + case 20: add(25); break; + case 21: add(22); break; + case 22: add(28); break; + } + if (block.vertical || block.horizontal) add(0); + if (Number(block.color) === 11 || ((type === 1 || type === 10) && Number(block.stacking) === 11)) add(11); + if (block.colorArray != null) add(25); + if (block.lock != null) add(19); // 铁皮的开/合两种状态都需要介绍。 + if (block.flowerSend || block.flowerReceive) add(24); + // 花盆接收块借用 floor 实现碰撞,它的盖板不可见,不额外展示快递盒。 + if (block.floor && block.floorTime && !block.flowerReceive) { + add(block.floorMove === true ? 20 : block.floorMove === false && block.floorColor != null ? 29 : 12); + } + }); + + walls.forEach(wall => { + switch (Number(wall.special)) { + case 1: add(3); break; + case 2: add(6); break; + case 3: add(9); break; + case 4: case 5: add(10); break; // 果酱沿门移动。 + case 6: add(14); break; + case 7: add(23); break; // 箭头挡板。 + case 9: add(27); break; // 伸缩障碍杆。 + case 10: case 11: add(26); break; // 带色挡板移动时覆盖其它门。 + } + if (wall.colorArray) add(13); + if (wall.longAndShort) add(15); + if (wall.toggle) add(30); + }); + (level.risefall || []).forEach(tile => { + if (Object.prototype.hasOwnProperty.call(tile, "vine")) { + if (Number(tile.vine) > 0) add(32); + } else add(tile.unLockFall ? 30 : 8); + }); + + // 沿用介绍的配置顺序,每种玩法只留一页,不因解锁关卡而漏掉实际出现的道具。 + const seen = new Set(); + return (config || []).filter(entry => { + if (!names.has(entry.name) || seen.has(entry.name)) return false; + seen.add(entry.name); + return true; + }); +} diff --git a/assets/Script/module/Tool/LevelGameplay.ts.meta b/assets/Script/module/Tool/LevelGameplay.ts.meta new file mode 100644 index 00000000..40a9525a --- /dev/null +++ b/assets/Script/module/Tool/LevelGameplay.ts.meta @@ -0,0 +1,10 @@ +{ + "ver": "1.1.0", + "uuid": "e1c45ec8-4986-46b4-a622-609cb5e6d1d8", + "importer": "typescript", + "isPlugin": false, + "loadPluginInWeb": true, + "loadPluginInNative": true, + "loadPluginInEditor": false, + "subMetas": {} +} \ No newline at end of file diff --git a/assets/Script/seven_day_gift/SevenDayGiftBootstrapApi.ts b/assets/Script/seven_day_gift/SevenDayGiftBootstrapApi.ts index 6798bd36..b8149da0 100644 --- a/assets/Script/seven_day_gift/SevenDayGiftBootstrapApi.ts +++ b/assets/Script/seven_day_gift/SevenDayGiftBootstrapApi.ts @@ -24,6 +24,20 @@ interface SevenDayInfoResponse { /** 七日活动查询入口,与分包内的资产同步接口分开。 */ export default class SevenDayGiftBootstrapApi { + // 与 Utils.POST 的选址规则保持一致;同源地址不视为独立测试服。 + public static getTestEnvironment() { + const version = cc.fx.GameTool.getWechatGameVersion(); + const testing = version === "开发版" || version === "体验版"; + const baseUrl = testing ? Utils.testHttpip : Utils.httpip; + const origin = (url: string) => (url || "").trim().toLowerCase().match(/^https?:\/\/[^/]+/); + const testOrigin = origin(Utils.testHttpip); + const productionOrigin = origin(Utils.httpip); + return { + version, baseUrl, + allowed: testing && !!testOrigin && !!productionOrigin && testOrigin[0] !== productionOrigin[0], + }; + } + // 主包只查询活动信息,不提前加载活动资源。 public static getInfo(callback: (response: SevenDayInfoResponse) => void) { const endpoint = "signInActivityInfo"; diff --git a/assets/Script/seven_day_gift/SevenDayGiftHost.ts b/assets/Script/seven_day_gift/SevenDayGiftHost.ts index ec9ac2cf..9039ef7e 100644 --- a/assets/Script/seven_day_gift/SevenDayGiftHost.ts +++ b/assets/Script/seven_day_gift/SevenDayGiftHost.ts @@ -26,23 +26,54 @@ export default class SevenDayGiftHost extends cc.Component { private querying = false; private retryCount = 0; private testPanelNode: cc.Node = null; + private testBundle: cc.AssetManager.Bundle = null; // 监听回到前台事件,并在正式环境查询活动。 onLoad() { if (this.node.parent) this.node.setContentSize(this.node.parent.getContentSize()); cc.game.on(cc.game.EVENT_SHOW, this.onGameShow, this); - const gameTool = cc.fx && cc.fx.GameTool; - - + // 暂停加载测试面板;恢复测试时重新启用,并打开预制体 entry 节点。 + // this.loadTestEntry(); if (CC_PREVIEW) return; this.queryActivity(true); } + // 测试 UI 留在活动分包内,仅独立测试服加载;主包不导入测试脚本。 + private loadTestEntry() { + if (!SevenDayGiftBootstrapApi.getTestEnvironment().allowed) return; + const canvas = cc.find("Canvas"); + const home: any = canvas && canvas.getComponent("JiaZai"); + if (!home || typeof home.loadHomeBundleWithDependencies !== "function") return; + home.loadHomeBundleWithDependencies(BUNDLE_NAME, 5, (error: Error, bundle: cc.AssetManager.Bundle) => { + if (error || !bundle || !cc.isValid(this.node, true)) return; + bundle.load("test/SevenDayTest", cc.Prefab, (loadError: Error, prefab: cc.Prefab) => { + if (loadError || !prefab || !cc.isValid(this.node, true) || !SevenDayGiftBootstrapApi.getTestEnvironment().allowed) return; + // 测试 Prefab 仅保存内置 UI 组件,避免失效脚本引用反序列化为 null。 + const TestPanel = cc.js.getClassByName("SevenDayTest"); + if (!TestPanel) { + cc.error("[SevenDayGiftHost] SevenDayTest 脚本未注册,请重新构建七日活动分包"); + return; + } + const testNode = cc.instantiate(prefab); + testNode.active = false; + const panel: any = testNode.addComponent(TestPanel); + panel.initialize(() => this.giftLoading || this.querying || !!(this.giftNode && cc.isValid(this.giftNode) && this.giftNode.active), () => this.queryActivity(true)); + this.testPanelNode = testNode; + this.testBundle = bundle; + canvas.addChild(testNode, 3000); + testNode.active = true; + }); + }); + } + // 移除监听,同时清理弹窗和分包资源。 onDestroy() { if (this.testPanelNode && cc.isValid(this.testPanelNode)) this.testPanelNode.destroy(); + this.testPanelNode = null; cc.game.off(cc.game.EVENT_SHOW, this.onGameShow, this); this.releaseGiftAssets(true); + if (this.testBundle) this.releaseBundle(this.testBundle); + this.testBundle = null; } // 等待登录 UID 就绪后查询,避免并发重复请求。 @@ -212,6 +243,8 @@ export default class SevenDayGiftHost extends cc.Component { // 仅释放当前仍登记在资源管理器中的活动分包。 private releaseBundle(bundle: cc.AssetManager.Bundle) { + // 测试入口仍持有本包资源时保留 Bundle,随主页销毁释放。 + if (this.testPanelNode && cc.isValid(this.testPanelNode, true)) return; if (!bundle || cc.assetManager.getBundle(BUNDLE_NAME) !== bundle) return; bundle.releaseAll(); if (cc.assetManager.getBundle(BUNDLE_NAME) === bundle) { diff --git a/assets/mini_program_benefits.meta b/assets/mini_program_benefits.meta new file mode 100644 index 00000000..bf64ae73 --- /dev/null +++ b/assets/mini_program_benefits.meta @@ -0,0 +1,15 @@ +{ + "ver": "1.1.3", + "uuid": "15a3cae2-3ba9-4a53-a115-616f78ce9c4c", + "importer": "folder", + "isBundle": true, + "bundleName": "mini_program_benefits", + "priority": 1, + "compressionType": { + "wechatgame": "subpackage" + }, + "optimizeHotUpdate": {}, + "inlineSpriteFrames": {}, + "isRemoteBundle": {}, + "subMetas": {} +} \ No newline at end of file diff --git a/assets/mini_program_benefits/README.md b/assets/mini_program_benefits/README.md new file mode 100644 index 00000000..5bb22565 --- /dev/null +++ b/assets/mini_program_benefits/README.md @@ -0,0 +1,50 @@ +# 小程序福利活动 + +更新日期:2026-09-18。按当前工作区源码核对;这是文档总入口,不代表已上传发布。 + +## 文档导航 + +| 文档 | 用途 | +| --- | --- | +| [测试与验收](docs/mini-program-benefits-testing.md) | 白字面板操作、字段解释、回归步骤 | +| [接口与状态](docs/mini-program-welfare-backend.md) | 登录、领取、资产同步、失败重试限制 | +| [预制体维护](docs/mini-program-benefits-prefabs.md) | 编辑入口、节点约束、加载释放 | +| [0914 美术记录](docs/mini-program-benefits-art-0914.md) | 素材来源历史,不作为当前功能规范 | + +## 功能规则 + +| 任务 | 微信入口 scene | 内部任务 ID | 服务端 type | 每项奖励 | +| --- | --- | --- | --- | --- | +| 我的小游戏/小程序入口 | 1104 | favorite_entry | favorite | 冻结、锤子、魔法棒各 1 | +| 桌面入口 | 1023 | desktop_entry | desktop | 冻结、锤子、魔法棒各 1 | + +入口资格由客户端观察微信进入参数记录;“已添加”本身不授予资格。优先使用 getEnterOptionsSync 的有效 scene。登录前暂存资格,登录后按账号保存;普通退出重登保留,清缓存或换设备可能丢失。 + +首页仅在微信小游戏平台启用,GM_INFO.level >= 1 时展示正常福利入口。是否已领取以登录返回 miniProgramWelfare 为准,成功领取后更新内存。可领取或有待确认奖励时亮红点;两项都领取且没有待确认回执时隐藏入口。不会自动打开福利弹窗。 + +领奖先由 miniProgramWelfare 接口确认,再本地加道具并通过 userProp 上传总量。当前会话重试避免重复加奖;跨重启补偿限制见接口文档。 + +## 当前代码归属 + +| 目录/文件 | 职责 | +| --- | --- | +| script/MiniProgramBenefitsPanel.ts | 福利页面、引导、领取展示 | +| script/MiniProgramBenefitsReward.ts | 领取确认、加道具、总量上传 | +| prefab/、texture/、icons/ | 活动预制体、美术和图标 | +| test/BenefitsRuntimeTest.ts、对应 prefab | 首页白字测试面板 | +| assets/Script/module/MiniProgramBenefitsBridge.ts | 主包桥接:入口、登录、红点、分包生命周期 | +| assets/resources/texture/mini-program-benefits-entry.png | 原有 resources 分包中的首页入口图 | + +test/ 是普通目录,与活动共用 mini_program_benefits 分包;没有独立测试分包注册。独立预览场景、Mock 适配器和旧重置按钮已移除。自动化测试在 tools/,不作为游戏资源打包。 + +主要接入点为 GameManager.ts(启动/回前台、登录)、JiaZai.ts(挂载、卸载、布局补位)及 HomeScene.fire 的 Load/Top/chengxu。2026-09-18 工作区仍存在七日 Host、项目配置和四个 meta 删除等未提交变化;旧文档“已恢复”的描述不再适用,发布前需单独核对,不能全部归为福利改动。 + +## 加载与发布状态 + +正式环境点击福利入口时加载活动包,窗口销毁后释放。当前白字测试入口已暂停:Bridge.attach 中 mountTestPanel 调用已注释,BenefitsRuntimeTest.prefab 的 entry 未激活,各环境均不自动显示。测试代码仍保留在包内;恢复这两处后才按独立测试服门禁加载,并在测试面板与福利窗口都不再使用时释放共享包。 + +用户已反馈清理前的功能测试无问题。之后进行了移除 Mock、合并测试目录和共享资源释放调整,尚未重新构建、上传或完成这一版的真机回归。 + +2026-09-17 历史自动化记录:福利相关 41 项、新手礼包 37 项,共 78 项通过。测试使用隔离桩,不访问真实服务器;后续以实际运行输出为准。运行方式见测试文档。 + +2026-09-18 提交前复验:使用本机已安装的 TypeScript,福利客户端、奖励、新手礼包三个测试文件共 80 项通过;七日测试面板另 5 项通过。此前依赖缺失已通过指定模块路径解决。测试为本地隔离验证,尚不代表真机或线上验收完成。 diff --git a/assets/mini_program_benefits/README.md.meta b/assets/mini_program_benefits/README.md.meta new file mode 100644 index 00000000..2e4a36fa --- /dev/null +++ b/assets/mini_program_benefits/README.md.meta @@ -0,0 +1,6 @@ +{ + "ver": "2.0.2", + "uuid": "ea3e7d12-23cf-4df1-a2ad-7b564facf4df", + "importer": "text", + "subMetas": {} +} \ No newline at end of file diff --git a/assets/mini_program_benefits/docs.meta b/assets/mini_program_benefits/docs.meta new file mode 100644 index 00000000..dab3e896 --- /dev/null +++ b/assets/mini_program_benefits/docs.meta @@ -0,0 +1,13 @@ +{ + "ver": "1.1.3", + "uuid": "cf08b9ce-43f1-45aa-8dab-d39d5d3499c8", + "importer": "folder", + "isBundle": false, + "bundleName": "", + "priority": 1, + "compressionType": {}, + "optimizeHotUpdate": {}, + "inlineSpriteFrames": {}, + "isRemoteBundle": {}, + "subMetas": {} +} \ No newline at end of file diff --git a/assets/mini_program_benefits/docs/mini-program-benefits-art-0914.md b/assets/mini_program_benefits/docs/mini-program-benefits-art-0914.md new file mode 100644 index 00000000..6091eae7 --- /dev/null +++ b/assets/mini_program_benefits/docs/mini-program-benefits-art-0914.md @@ -0,0 +1,41 @@ +# 福利界面美术替换 · 0914(历史记录) + +归档说明(2026-09-17):本文保留 0914 素材来源及当时验证记录,不代表当前功能。当前已删除 Mock 和独立预览;guide-panel 改为预制体中的九宫格拉伸,不再运行时拆分网格。最新实现见 [活动总览](../README.md) 与 [预制体维护](mini-program-benefits-prefabs.md)。 + +替换开发包:`MiniProgramBenefits/MatchMaster`。 + +## 资源 + +福利弹窗资源位于 `assets/mini_program_benefits/texture/`。从 0914 素材包原样复制 PNG,生成独立 Cocos 2.4 SpriteFrame 元数据: + +| 文件 | 原素材 | 用途 | +| --- | --- | --- | +| panel | dikk | 主弹窗底板,九宫格拉伸 | +| guide-panel | 地块 | 指引底板,运行时分段重复网格 | +| task | dikuang | 任务行底板 | +| title-list | 小程序福利字 | 主标题 | +| title-favorite | 添加小程序字 | 小程序指引标题 | +| title-desktop | 添加到桌面大字 | 桌面指引标题 | +| guide-favorite | 添加小程序说明字 | 小程序操作说明 | +| guide-desktop | 添加桌面文字 | 桌面操作说明 | +| favorite | 图0 | 小程序图标 | +| desktop | shoujitu | 桌面图标 | +| view / claim | 查看小按钮 / 领取小按钮 | 随资格切换的按钮 | +| close | 项目 assets/res/close.png | 关闭按钮,独立副本 | + +首页入口图 `小程序福利.png` 放在 `assets/resources/texture/mini-program-benefits-entry.png`,只加载入口小图,不提前加载整个福利 Bundle。引用在离开首页时释放。 + +未导入 JPG 效果图、尺寸标注 PNG 或未使用的文字切片。 + +## 当时行为(已被当前实现替代) + +保留当前 Mock 资格、领取、确认、刷新、重置和退出逻辑。奖励仍为冻结、锤子、魔法棒各 1;效果图中的无限体力和金币未改为实际配置。美术缺失时继续显示文字占位。 + +## 当时验证记录 + +- 25 项自动测试(包含原有 23 项及入口图资源释放测试)。 +- 福利 Panel/Bridge/Mock 使用 Creator 2.4 类型定义进行类型检查。 +- Cocos Creator 2.4.15 浏览器引擎渲染四页;验证领取确认、指引返回及连续 20 次切页时运行时网格 SpriteFrame 的释放。 + +以上为 0914 当时的验证范围;当前构建及验收状态见最新测试文档。 + diff --git a/assets/mini_program_benefits/docs/mini-program-benefits-art-0914.md.meta b/assets/mini_program_benefits/docs/mini-program-benefits-art-0914.md.meta new file mode 100644 index 00000000..db7ea547 --- /dev/null +++ b/assets/mini_program_benefits/docs/mini-program-benefits-art-0914.md.meta @@ -0,0 +1,6 @@ +{ + "subMetas": {}, + "ver": "2.0.2", + "importer": "text", + "uuid": "f65f07bc-3e59-4df3-80f5-bff6770bc5c0" +} \ No newline at end of file diff --git a/assets/mini_program_benefits/docs/mini-program-benefits-prefabs.md b/assets/mini_program_benefits/docs/mini-program-benefits-prefabs.md new file mode 100644 index 00000000..93ee039c --- /dev/null +++ b/assets/mini_program_benefits/docs/mini-program-benefits-prefabs.md @@ -0,0 +1,41 @@ +# 小程序福利预制体维护 + +更新日期:2026-09-18。[返回活动总览](../README.md) + +## 编辑入口 + +活动预制体位于 assets/mini_program_benefits/prefab/,均属于 mini_program_benefits 分包。在 Cocos Creator 2.4.15 中双击编辑。 + +| 预制体 | 用途 | +| --- | --- | +| BenefitsWindow | 全屏遮罩、Motion 运动容器、控制组件及四个 prefab 属性引用 | +| BenefitsMain | 两个任务 Task0/Task1,View/Claim/Claimed 控制显示状态 | +| BenefitsFavoriteGuide | 收藏入口操作引导 | +| BenefitsDesktopGuide | 桌面入口操作引导 | +| BenefitsReward | 奖励遮罩、三种道具及数量展示 | + +四个引用属性 mainPrefab、favoritePrefab、desktopPrefab、rewardPrefab 均不可为空。保留节点名称与层级,脚本按名称绑定按钮和状态;可调整图片、尺寸、文字和位置。页面整体由脚本缩放适配,Motion 承担开关动画。 + +两个引导页的 Content/Background 引用同包 guide-panel SpriteFrame,使用九宫格拉伸;旧版运行时拆网格切片方案已不适用。 + +## 首页入口与补位 + +正式入口为 HomeScene.fire 的 Load/Top/chengxu,red 为红点。Bridge 优先使用场景已有 SpriteFrame;缺图时才动态加载 resources/texture/mini-program-benefits-entry 兜底。 + +JiaZai.refreshHomeActivityEntryLayout 控制补位:礼包可见时保持福利与礼包的相对间距;礼包隐藏但丛林宝藏可见时占礼包默认位;两者都隐藏时占丛林宝藏位。调整场景坐标后检查所有显隐组合。 + +## 测试面板 + +当前 mountTestPanel 调用被注释,测试 prefab 的 entry 未激活。以下动态挂载与共享包规则只在恢复测试入口后适用。 + +普通目录 test/ 下的 BenefitsRuntimeTest.prefab 保存内置 UI,主包桥接加载后动态添加 BenefitsRuntimeTest 组件。不要重复手动挂载该脚本。根节点下 entry 为白字入口,panel 为可关闭面板。 + +运行时会将 entry 的点击区域设置为 200 × 88,并在 lateUpdate 根据首页 Load/Top/rank 换算坐标放到排行榜左侧。调整 prefab 中 entry 的位置不能覆盖这一运行时定位逻辑。 + +## 加载与释放 + +正式入口加载 prefab/BenefitsWindow;主窗口的引用由 Cocos 加载依赖。三个内容页实例化一次,通过 active 切页;领奖时单独实例化 BenefitsReward,无 shop 或公共 RewardWindow 依赖。 + +恢复测试入口后,独立测试服先加载 test/BenefitsRuntimeTest,测试 UI 与业务 UI 共用活动 Bundle。关闭福利窗口不会释放白字仍使用的共享包;离开首页销毁测试 UI,所有持有者释放后才 releaseAll/removeBundle。释放安排在节点销毁之后,避免引用已释放资源。 + +当前各环境都不自动挂载测试面板,关闭福利窗口即可释放其活动包。代码或素材变更后须重新构建微信包,旧 build 产物不能作为当前版本验证依据。 diff --git a/assets/mini_program_benefits/docs/mini-program-benefits-prefabs.md.meta b/assets/mini_program_benefits/docs/mini-program-benefits-prefabs.md.meta new file mode 100644 index 00000000..7d374a96 --- /dev/null +++ b/assets/mini_program_benefits/docs/mini-program-benefits-prefabs.md.meta @@ -0,0 +1,6 @@ +{ + "subMetas": {}, + "ver": "2.0.2", + "importer": "text", + "uuid": "d094e0c7-81d3-47ef-a179-63eb78b97063" +} \ No newline at end of file diff --git a/assets/mini_program_benefits/docs/mini-program-benefits-testing.md b/assets/mini_program_benefits/docs/mini-program-benefits-testing.md new file mode 100644 index 00000000..1f01092c --- /dev/null +++ b/assets/mini_program_benefits/docs/mini-program-benefits-testing.md @@ -0,0 +1,70 @@ +# 小程序福利测试与验收 + +更新日期:2026-09-18。[返回活动总览](../README.md) + +## 白字入口(当前暂停) + +当前不会自动显示:MiniProgramBenefitsBridge.attach 中 mountTestPanel 调用已注释,BenefitsRuntimeTest.prefab 的 entry 未激活。以下面板操作及涉及白字的回归步骤均以恢复这两处并重新构建为前提;当前版应检查各环境白字均不出现。本次只更新文档,保留暂停状态。 + +恢复后,首页排行榜按钮左侧显示“福利测试”,点击区域为 200 × 88 设计单位,随界面缩放并跟随排行榜位置。白字入口不受首关或两项已领取的正常入口隐藏规则限制。 + +与七日活动复用同一环境判断:微信开发版/体验版,且测试地址和正式地址不同源时才加载并允许操作;正式版不显示。代码在 assets/mini_program_benefits/test/ 普通目录中,随活动分包加载,无独立测试包。重新构建后生效,不需要手动挂组件。 + +| 操作 | 效果 | +| --- | --- | +| 打开白字面板 | 刷新当前 UID、关卡、登录/领取快照、入口红点及最近微信 scene | +| 模拟收藏入口 | 给当前账号保存收藏资格,不伪造微信生命周期记录 | +| 模拟桌面入口 | 给当前账号保存桌面资格,不伪造微信生命周期记录 | +| 清本地资格 | 清当前账号两项资格,不清服务端领取标记、道具或奖励回执 | +| 清本地领取缓存 | 清当前账号两项 prop.welfareCredits 防重记录和内存领取回执;保留道具数量、入口资格、其他账号缓存及登录领取标记。需关闭福利并等待请求完成 | +| 打开福利 | 进入实际福利弹窗;要求登录完成并通过第 1 关,领取会影响测试账号 | + +修改资格或清领取缓存前须关闭福利窗口并等待释放结束。重新打开测试面板会更新快照,但不会重新请求服务器登录数据。重复测试同一账号领奖时,清本地领取缓存,由后端重置领取标记,再重新登录;清缓存不会扣回已发道具。 + +## 如何看字段 + +| 字段 | 含义 | +| --- | --- | +| 登录返回 miniProgramWelfare | favorite / desktop 为 false 表示未领取,true 表示已领取;当前会话领取成功也会更新 | +| 本地资格 {} | 当前账号尚未在本机保存对应入口资格 | +| favorite_entry / desktop_entry | 收藏福利 / 桌面福利 | +| eligibleAt | 资格时间戳;0 表示无资格 | +| claimedAt | 领取标记;0 表示未领,登录同步可能为 1,本次领取成功时为时间戳 | +| acknowledged | 奖励展示确认标记;必须结合 claimedAt 判断,单独 true 不代表领过 | +| deliveryPending | true 表示领取已确认,但道具同步尚待完成 | +| receiptId | 领奖回执,用于客户端加奖防重与展示确认 | +| scene / lifecycle / observedAt | 微信入口值、cold/show 生命周期、观察时间戳;只保留最近 24 条 | + +“当前领取状态”是客户端内存状态:资格来自本机,已领取状态来自登录/领奖结果,不是每次展示都查询服务器。普通入口如 1001 不会新增本活动资格。 + +## 建议回归顺序 + +1. 未过首关时进入首页:正常福利入口隐藏;测试服白字仍可用。 +2. 模拟两种入口资格,再通过首关:正常入口显示且红点亮。 +3. 分别打开引导与领取:确认两项各发冻结、锤子、魔法棒各 1,关闭奖励后状态更新。 +4. 两项完成:正常入口隐藏,白字仍可查看;清本地资格不会使已领取福利重新可领。 +5. 从微信实际收藏入口(1104)、桌面入口(1023)进入,核对记录;模拟按钮不能替代真实入口验证。 +6. 断网/上传失败后,在同一会话重新打开福利,确认不重复加奖;跨退出限制见接口文档。 +7. 连续打开关闭福利与白字面板、离开再回首页,检查界面和资源释放;检查正式版白字不显示。 + +## 自动化与当前验证范围 + +在项目根目录使用 Node.js 和 TypeScript 4.9+: + + node --test tools/tests/mini-program-benefits-client.test.cjs tools/tests/mini-program-benefits-reward.test.cjs tools/test-starter-pack.cjs + +可通过 TYPESCRIPT_PATH 指定 TypeScript 模块路径。测试在 tools/,使用隔离桩,不对真实服务器发请求。 + +2026-09-17 历史记录:福利 41 项、新手礼包 37 项,共 78 项通过;覆盖入口资格、登录状态、账号隔离、失败重试、重复发奖防护、资源共享释放及首页相关行为。源码检查未发现福利相关编译错误,不代表整个项目无历史编译错误。 + +用户已反馈清理前功能测试无问题。其后移除 Mock、合并测试分包等最终改动尚未重新构建/上传和完成真机回归。独立预览场景、Mock 适配器、旧重置按钮均已移除。 + +## 2026-09-18 核验与发布待办 + +首次执行因缺少 typescript 未启动。提交前使用本机已安装模块复验:上面三个文件共 80 项通过,tools/test-seven-day-debug.cjs 另 5 项通过。福利测试通过 TYPESCRIPT_PATH 指定模块;七日测试使用 NODE_PATH 指向包含 typescript 的 node_modules。package.json 已声明依赖,其他机器可安装开发依赖后运行;npm test 仍是占位命令。 + +- 已完成本次自动化复验;后续代码变动后重跑相关用例。 +- 重新构建微信包,验收真实 1104/1023 入口、登录字段、加奖及 userProp 同步。 +- 验证丛林宝藏和新手礼包显隐组合下的福利入口补位。 +- 验证双击领取、超时、切换账号、上传失败后的同会话重试;跨重启补偿限制见接口文档。 +- 留存构建版本、目标服务器、设备、验收日期和实际结果;本地源码核对不能证明线上已更新。 diff --git a/assets/mini_program_benefits/docs/mini-program-benefits-testing.md.meta b/assets/mini_program_benefits/docs/mini-program-benefits-testing.md.meta new file mode 100644 index 00000000..236891ea --- /dev/null +++ b/assets/mini_program_benefits/docs/mini-program-benefits-testing.md.meta @@ -0,0 +1,6 @@ +{ + "subMetas": {}, + "ver": "2.0.2", + "importer": "text", + "uuid": "0d1c616c-705c-48c8-a98a-cc1471ce9780" +} \ No newline at end of file diff --git a/assets/mini_program_benefits/docs/mini-program-welfare-backend.md b/assets/mini_program_benefits/docs/mini-program-welfare-backend.md new file mode 100644 index 00000000..798e50c1 --- /dev/null +++ b/assets/mini_program_benefits/docs/mini-program-welfare-backend.md @@ -0,0 +1,38 @@ +# 小程序福利接口与状态 + +更新日期:2026-09-18。以当前客户端实现为准。[返回活动总览](../README.md) + +## 状态来源 + +| 数据 | 来源与保存位置 | 说明 | +| --- | --- | --- | +| miniProgramWelfare.favorite / desktop | 登录接口返回,保存在运行时 GM_INFO | boolean;true 为已领取,领取确认成功后本会话也更新 | +| 入口资格 | 本机 mini_program_benefits_eligibility_v1: | favorite_entry、desktop_entry 对应正数时间戳;按账号隔离 | +| 当前领取状态 | Bridge 的内存 state | 登录时重建;包含资格、领取、展示确认及待同步状态 | +| prop.welfareCredits | 本地道具缓存 | 按福利回执记录已加奖,避免重试再次增加道具 | +| mini_program_benefits_rewards_v1: | 请求串行队列标识 | 当前代码不把完整领取状态写入这个同名存储键 | + +旧 Mock 数据不读取,也不迁移。清本地入口资格不改变服务器领取状态、道具数量或回执。完整运行时回执不跨登录/重启恢复。 + +## 接口流程 + +1. 登录提供 miniProgramWelfare: { favorite: boolean, desktop: boolean }。字段缺失或类型错误时,实际领取被拒绝并提示重新登录。 +2. 客户端检查已过首关、已获得对应入口资格及道具基数有效。 +3. Utils.POST("miniProgramWelfare", { uid, type }),type 为 favorite 或 desktop;Utils 自动附加 token,并按现有环境规则选址。 +4. code === 1 后更新已领取标记,生成 welfare:: 回执,设置 acknowledged=false、deliveryPending=true。 +5. 本地 prop.welfareCredits 无此回执时,冻结、锤子、魔法棒各加 1(道具 ID 2001、2002、2003),写入道具缓存并校验回执已保存。 +6. Utils.POST("userProp", { uid, action: "save", propType: 0, propData })。propData 为 JSON 字符串,包含 freeze、hammer、magic_wand 的当前总量,不是本次增加量。成功后 deliveryPending=false。 +7. 播放活动奖励展示,玩家关闭展示后 acknowledged=true。两项已领取且无未确认回执时隐藏首页入口。 + +领取确认不直接视为服务端已经加道具。当前客户端固定发放数量,不解析福利接口返回的奖励清单。完整成功/重复领取响应样本未随当前项目文档保存,客户端只使用 code === 1 和失败时的 msg;服务端必须保证已消费的领取不能再次返回可重复发奖的成功确认。 + +## 查询与重试边界 + +- 没有单独的福利状态查询接口接入。白字面板恢复启用后显示本次登录及领奖后的内存快照,当前入口已暂停。 +- 正常福利面板的 read 操作读取内存,并会重试尚未完成的道具上传;不是向服务器查询福利资格。 +- 同账号请求串行。账号切换后拒绝旧请求结果;miniProgramWelfare 和 userProp 每个请求等待上限均为 5500 ms,迟到或重复回调不重复处理。 +- 当前会话上传失败后重新打开福利可重试上传当前道具总量,已记录回执的奖励不重复增加。 +- 福利确认与道具保存是两个独立请求。确认成功响应丢失、确认后退出、重新登录或缓存丢失,可能造成“已领取但漏发/未同步”;现有客户端不能保证跨重启补偿。 +- userProp 是总量写入,不能保证多设备并发修改的原子性。可靠补发及跨设备一致性需要后端回执或原子发奖机制支持。 + +测试记录与发布状态统一见 [测试文档](mini-program-benefits-testing.md),不在此重复维护测试数量。 diff --git a/assets/mini_program_benefits/docs/mini-program-welfare-backend.md.meta b/assets/mini_program_benefits/docs/mini-program-welfare-backend.md.meta new file mode 100644 index 00000000..055d52bb --- /dev/null +++ b/assets/mini_program_benefits/docs/mini-program-welfare-backend.md.meta @@ -0,0 +1,6 @@ +{ + "subMetas": {}, + "ver": "2.0.2", + "importer": "text", + "uuid": "3bb97217-4d87-41fb-8a03-61588522e767" +} \ No newline at end of file diff --git a/assets/mini_program_benefits/icons.meta b/assets/mini_program_benefits/icons.meta new file mode 100644 index 00000000..68298e85 --- /dev/null +++ b/assets/mini_program_benefits/icons.meta @@ -0,0 +1,13 @@ +{ + "ver": "1.1.3", + "uuid": "7770e353-2f40-43bf-8ba2-4f48f2362f76", + "importer": "folder", + "isBundle": false, + "bundleName": "", + "priority": 1, + "compressionType": {}, + "optimizeHotUpdate": {}, + "inlineSpriteFrames": {}, + "isRemoteBundle": {}, + "subMetas": {} +} \ No newline at end of file diff --git a/assets/mini_program_benefits/icons/freeze.png b/assets/mini_program_benefits/icons/freeze.png new file mode 100644 index 00000000..31bf597f Binary files /dev/null and b/assets/mini_program_benefits/icons/freeze.png differ diff --git a/assets/mini_program_benefits/icons/freeze.png.meta b/assets/mini_program_benefits/icons/freeze.png.meta new file mode 100644 index 00000000..931eb253 --- /dev/null +++ b/assets/mini_program_benefits/icons/freeze.png.meta @@ -0,0 +1,38 @@ +{ + "ver": "2.3.7", + "uuid": "28686dda-a277-4ea7-8bee-15e2feffe9d0", + "importer": "texture", + "type": "sprite", + "wrapMode": "clamp", + "filterMode": "bilinear", + "premultiplyAlpha": false, + "genMipmaps": false, + "packable": true, + "width": 316, + "height": 316, + "platformSettings": {}, + "subMetas": { + "freeze": { + "ver": "1.0.6", + "uuid": "9f43f6b5-7793-4797-9b0d-ba17117898a9", + "importer": "sprite-frame", + "rawTextureUuid": "28686dda-a277-4ea7-8bee-15e2feffe9d0", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0.5, + "trimX": 38, + "trimY": 12, + "width": 240, + "height": 291, + "rawWidth": 316, + "rawHeight": 316, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/assets/mini_program_benefits/icons/hammer.png b/assets/mini_program_benefits/icons/hammer.png new file mode 100644 index 00000000..ef6b3ba0 Binary files /dev/null and b/assets/mini_program_benefits/icons/hammer.png differ diff --git a/assets/mini_program_benefits/icons/hammer.png.meta b/assets/mini_program_benefits/icons/hammer.png.meta new file mode 100644 index 00000000..b1864409 --- /dev/null +++ b/assets/mini_program_benefits/icons/hammer.png.meta @@ -0,0 +1,38 @@ +{ + "ver": "2.3.7", + "uuid": "5e88b64d-25ac-4792-8ac6-4a86197bcbc3", + "importer": "texture", + "type": "sprite", + "wrapMode": "clamp", + "filterMode": "bilinear", + "premultiplyAlpha": false, + "genMipmaps": false, + "packable": true, + "width": 316, + "height": 316, + "platformSettings": {}, + "subMetas": { + "hammer": { + "ver": "1.0.6", + "uuid": "d2016222-467a-440f-9912-a45523322466", + "importer": "sprite-frame", + "rawTextureUuid": "5e88b64d-25ac-4792-8ac6-4a86197bcbc3", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": -0.5, + "offsetY": 0, + "trimX": 6, + "trimY": 0, + "width": 303, + "height": 316, + "rawWidth": 316, + "rawHeight": 316, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/assets/mini_program_benefits/icons/magic.png b/assets/mini_program_benefits/icons/magic.png new file mode 100644 index 00000000..c47c55d5 Binary files /dev/null and b/assets/mini_program_benefits/icons/magic.png differ diff --git a/assets/mini_program_benefits/icons/magic.png.meta b/assets/mini_program_benefits/icons/magic.png.meta new file mode 100644 index 00000000..ebde0fb1 --- /dev/null +++ b/assets/mini_program_benefits/icons/magic.png.meta @@ -0,0 +1,38 @@ +{ + "ver": "2.3.7", + "uuid": "51cbf9ee-9c8b-4d2a-92dc-3d57610acc57", + "importer": "texture", + "type": "sprite", + "wrapMode": "clamp", + "filterMode": "bilinear", + "premultiplyAlpha": false, + "genMipmaps": false, + "packable": true, + "width": 316, + "height": 316, + "platformSettings": {}, + "subMetas": { + "magic": { + "ver": "1.0.6", + "uuid": "93a1c53b-7530-429e-a8dd-2e60e0ade38e", + "importer": "sprite-frame", + "rawTextureUuid": "51cbf9ee-9c8b-4d2a-92dc-3d57610acc57", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 8.5, + "offsetY": -7.5, + "trimX": 25, + "trimY": 17, + "width": 283, + "height": 297, + "rawWidth": 316, + "rawHeight": 316, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/assets/mini_program_benefits/prefab.meta b/assets/mini_program_benefits/prefab.meta new file mode 100644 index 00000000..ecb4f12c --- /dev/null +++ b/assets/mini_program_benefits/prefab.meta @@ -0,0 +1,13 @@ +{ + "ver": "1.1.3", + "uuid": "3bddd4a5-3d93-4918-a111-b2c0d1303fc9", + "importer": "folder", + "isBundle": false, + "bundleName": "", + "priority": 1, + "compressionType": {}, + "optimizeHotUpdate": {}, + "inlineSpriteFrames": {}, + "isRemoteBundle": {}, + "subMetas": {} +} \ No newline at end of file diff --git a/assets/mini_program_benefits/prefab/BenefitsDesktopGuide.prefab b/assets/mini_program_benefits/prefab/BenefitsDesktopGuide.prefab new file mode 100644 index 00000000..d940f59a --- /dev/null +++ b/assets/mini_program_benefits/prefab/BenefitsDesktopGuide.prefab @@ -0,0 +1,2617 @@ +[ + { + "__type__": "cc.Prefab", + "_name": "", + "_objFlags": 0, + "_native": "", + "data": { + "__id__": 1 + }, + "optimizationPolicy": 0, + "asyncLoadAssets": false, + "readonly": false + }, + { + "__type__": "cc.Node", + "_name": "BenefitsDesktopGuide", + "_objFlags": 0, + "_parent": null, + "_children": [ + { + "__id__": 3 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 2 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 950, + "height": 1064 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "84970782-b3d5-4bcc-a5ad-34b3bb53b523" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "bfb96269-e8ef-46d0-9e5e-a8c4289d3a1f", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Content", + "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [ + { + "__id__": 5 + }, + { + "__id__": 8 + }, + { + "__id__": 11 + }, + { + "__id__": 14 + }, + { + "__id__": 17 + }, + { + "__id__": 70 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 4 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 950, + "height": 940 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + -108, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "bcfb2198-3a02-489c-b1fc-95908347d0a8" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "7382ea1f-2c36-4f11-bee9-1d4dceddcd35", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Background", + "_objFlags": 0, + "_parent": { + "__id__": 3 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 7 + } + ], + "_prefab": { + "__id__": 6 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 902, + "height": 940 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 83, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "2655308f-b973-4b8d-ba18-12af95adc741" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "f9de784e-466b-4093-bf10-e3dbb910599a", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 5 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "77480e0d-fe09-4873-8aea-61df6b4bbf64" + }, + "_type": 1, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "6e10fd97-1df3-408f-b860-252c9509b119" + }, + { + "__type__": "cc.Node", + "_name": "Title", + "_objFlags": 0, + "_parent": { + "__id__": 3 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 10 + } + ], + "_prefab": { + "__id__": 9 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 740, + "height": 239.41176470588235 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 510, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "8989f07b-882c-4ac6-9ffc-4514e899e9d0" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "a03982e3-8e00-4ffe-a2a9-8a74c8ff7157", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 8 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "1ee4a1a7-9771-4505-8d96-3ebe899d21f5" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "b668d98e-f37c-4d33-a2b2-524d3d19f567" + }, + { + "__type__": "cc.Node", + "_name": "Close", + "_objFlags": 0, + "_parent": { + "__id__": 3 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 13 + } + ], + "_prefab": { + "__id__": 12 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 92, + "height": 92 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 403, + 443, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "e5a78636-3067-40c4-9632-2c1ca2e07446" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "40f47ac3-741e-4f8b-b1be-14874802592e", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 11 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "67398214-36f6-46c1-a5e8-5b1fc859281a" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "f902fffa-afc2-4acb-8dd3-388bfe6758f7" + }, + { + "__type__": "cc.Node", + "_name": "Instructions", + "_objFlags": 0, + "_parent": { + "__id__": 3 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 16 + } + ], + "_prefab": { + "__id__": 15 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 765, + "height": 483.54771784232366 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 12, + 88.22614107883817, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "f1f13624-7188-4263-89b5-14bdf7cd1b20" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "1023a4a9-386b-4f08-bfbc-497bb18bb85f", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 14 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "371e7dd2-4438-440b-b1b3-b599d1c325ca" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "284428ed-159f-4dfa-8b2c-e76dc92e2187" + }, + { + "__type__": "cc.Node", + "_name": "Rewards", + "_objFlags": 0, + "_parent": { + "__id__": 3 + }, + "_children": [ + { + "__id__": 19 + }, + { + "__id__": 36 + }, + { + "__id__": 53 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 18 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 0, + "height": 0 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + -240, + 0, + 0, + 0, + 0, + 1, + 1.05, + 1.05, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "c948712d-4603-42c4-81a4-234203e40883" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "9fa20512-2147-4755-8113-740c0d450968", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Item0", + "_objFlags": 0, + "_parent": { + "__id__": 17 + }, + "_children": [ + { + "__id__": 21 + }, + { + "__id__": 24 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 20 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 180, + "height": 210 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + -133, + 10, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "437974d1-5f6a-4fdd-bcee-9d978589c79e" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "0b7dd9df-329a-44e0-8f5c-9a294d277472", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Icon", + "_objFlags": 0, + "_parent": { + "__id__": 19 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 23 + } + ], + "_prefab": { + "__id__": 22 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 89.0721649484536, + "height": 108 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "eb05f630-7acd-4dab-8ae5-29c64ddb0545" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "202715d9-d505-4867-a8bb-b6293a5a92bf", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 21 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "9f43f6b5-7793-4797-9b0d-ba17117898a9" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_id": "ab5047c4-eb32-4eb7-aa0f-3033039536db" + }, + { + "__type__": "cc.Node", + "_name": "Quantity", + "_objFlags": 0, + "_parent": { + "__id__": 19 + }, + "_children": [ + { + "__id__": 26 + }, + { + "__id__": 29 + }, + { + "__id__": 32 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 25 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 0, + "height": 0 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "a59cd751-6191-47a0-a895-f78a47ddd67d" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "712045e7-818d-440f-aa3f-cf1ec1e9f08b", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Times", + "_objFlags": 0, + "_parent": { + "__id__": 24 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 28 + } + ], + "_prefab": { + "__id__": 27 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 26.15625, + "height": 27 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 9.680179696449024, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "4429f8a7-351c-4148-9280-18f864d62ee5" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "2a2ec882-33e6-4ca3-8bb3-0d227ccbbb2f", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 26 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "26ab48f6-c12d-48be-90c7-e06d6a075945" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "787fbdae-e4b6-4f58-a34c-d29f5d2f9d0f" + }, + { + "__type__": "cc.Node", + "_name": "One", + "_objFlags": 0, + "_parent": { + "__id__": 24 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 31 + } + ], + "_prefab": { + "__id__": 30 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 33.77777777777778, + "height": 38 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 37.64719358533792, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "9c16dc79-ec22-4f45-a755-94bffad9848a" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "a34d3540-5377-4ffc-a2b3-864fe98c2fb0", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 29 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "011c8cfa-9a31-4c2c-8e40-13d8ef5cba75" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "f4709f27-b6b8-47ee-ac3e-5ea3cd8de29d" + }, + { + "__type__": "cc.Node", + "_name": "Count", + "_objFlags": 0, + "_parent": { + "__id__": 24 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 34 + }, + { + "__id__": 35 + } + ], + "_prefab": { + "__id__": 33 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 90, + "height": 50 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 16.536082474226802, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "c74eda5f-17cb-4cdc-9234-fa158046b0c4" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "49f64793-523f-49eb-be03-e3ccd7eaadbb", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 32 + }, + "_enabled": true, + "_materials": [], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "×2", + "_N$string": "×2", + "_fontSize": 36, + "_lineHeight": 43, + "_enableWrapText": false, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 2, + "_N$cacheMode": 0, + "_id": "a4e448c0-b827-44db-94f2-f55576fc20bf", + "_N$fontSize": 36, + "_N$enableWrapText": true, + "_fontFamily": "Arial" + }, + { + "__type__": "cc.LabelOutline", + "_name": "", + "_objFlags": 0, + "_enabled": true, + "_id": "5efe560e-9fc6-4eb0-85de-352dd5369e17", + "node": { + "__id__": 32 + }, + "_color": { + "__type__": "cc.Color", + "r": 126, + "g": 75, + "b": 42, + "a": 255 + }, + "_width": 3 + }, + { + "__type__": "cc.Node", + "_name": "Item1", + "_objFlags": 0, + "_parent": { + "__id__": 17 + }, + "_children": [ + { + "__id__": 38 + }, + { + "__id__": 41 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 37 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 180, + "height": 210 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 10, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "08185166-5907-47a4-9154-421073eea55a" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "5addc8ae-3834-4321-b92c-fcdb60fa905e", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Icon", + "_objFlags": 0, + "_parent": { + "__id__": 36 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 40 + } + ], + "_prefab": { + "__id__": 39 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 103.55696202531645, + "height": 108 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "5d3a3585-17e0-40a4-b4e6-a040211571db" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "9d6d4578-37c3-4b5a-83a8-7f6bd20d5c0b", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 38 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "d2016222-467a-440f-9912-a45523322466" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_id": "bb0848c5-609d-4e79-b813-24f3afd697d4" + }, + { + "__type__": "cc.Node", + "_name": "Quantity", + "_objFlags": 0, + "_parent": { + "__id__": 36 + }, + "_children": [ + { + "__id__": 43 + }, + { + "__id__": 46 + }, + { + "__id__": 49 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 42 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 0, + "height": 0 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "78fa3583-6716-4d80-aaf0-77ef2bee4530" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "f7b6ec3f-c3de-45f6-b70e-779473c9509a", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Times", + "_objFlags": 0, + "_parent": { + "__id__": 41 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 45 + } + ], + "_prefab": { + "__id__": 44 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 26.15625, + "height": 27 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 16.922578234880447, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "c9b40e72-d6da-4f42-ad0b-cb832da7ef02" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "82eb5707-da52-4496-8706-71862a238907", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 43 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "26ab48f6-c12d-48be-90c7-e06d6a075945" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "bcb9df32-f84e-4c27-848e-94c4bc89fc0c" + }, + { + "__type__": "cc.Node", + "_name": "One", + "_objFlags": 0, + "_parent": { + "__id__": 41 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 48 + } + ], + "_prefab": { + "__id__": 47 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 33.77777777777778, + "height": 38 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 44.88959212376933, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "d08ccaa3-393e-4c67-b57d-f839972c7b15" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "f5c3030e-c9b2-4cb3-b2b8-b5cda3d3c8cd", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 46 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "011c8cfa-9a31-4c2c-8e40-13d8ef5cba75" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "e6b37c22-7670-4830-839d-13cd3378a612" + }, + { + "__type__": "cc.Node", + "_name": "Count", + "_objFlags": 0, + "_parent": { + "__id__": 41 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 51 + }, + { + "__id__": 52 + } + ], + "_prefab": { + "__id__": 50 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 90, + "height": 50 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 23.778481012658226, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "ffe15378-0f1d-417b-b988-04a569af8d61" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "40373bb7-6a0f-423b-a46d-ade6b798cffd", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 49 + }, + "_enabled": true, + "_materials": [], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "×2", + "_N$string": "×2", + "_fontSize": 36, + "_lineHeight": 43, + "_enableWrapText": false, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 2, + "_N$cacheMode": 0, + "_id": "f89491ec-01e4-44ae-b2a1-9f31e7fac305", + "_N$fontSize": 36, + "_N$enableWrapText": true, + "_fontFamily": "Arial" + }, + { + "__type__": "cc.LabelOutline", + "_name": "", + "_objFlags": 0, + "_enabled": true, + "_id": "cc856d8b-3795-422c-a5ac-4ef72d137a21", + "node": { + "__id__": 49 + }, + "_color": { + "__type__": "cc.Color", + "r": 126, + "g": 75, + "b": 42, + "a": 255 + }, + "_width": 3 + }, + { + "__type__": "cc.Node", + "_name": "Item2", + "_objFlags": 0, + "_parent": { + "__id__": 17 + }, + "_children": [ + { + "__id__": 55 + }, + { + "__id__": 58 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 54 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 180, + "height": 210 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 133, + 10, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "60c74025-11f4-4712-beee-3f6aeeb0e429" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "d3f13b9e-fe6b-4189-a834-7cfea1d42b4f", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Icon", + "_objFlags": 0, + "_parent": { + "__id__": 53 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 57 + } + ], + "_prefab": { + "__id__": 56 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 102.9090909090909, + "height": 108 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "cc547ced-da9b-45de-8d20-16be9748d90c" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "d7e63147-02f9-45bd-82a6-91a73eff3dcd", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 55 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "93a1c53b-7530-429e-a8dd-2e60e0ade38e" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_id": "84b04e21-4ad6-47f2-a0b9-96384a24a904" + }, + { + "__type__": "cc.Node", + "_name": "Quantity", + "_objFlags": 0, + "_parent": { + "__id__": 53 + }, + "_children": [ + { + "__id__": 60 + }, + { + "__id__": 63 + }, + { + "__id__": 66 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 59 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 0, + "height": 0 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "65e36a8a-7330-44a6-ba5c-1c5e90a17c74" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "f47164a1-edd4-47d6-96e8-36f48bfd6a9a", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Times", + "_objFlags": 0, + "_parent": { + "__id__": 58 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 62 + } + ], + "_prefab": { + "__id__": 61 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 26.15625, + "height": 27 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 16.598642676767675, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "bfe13827-90b3-499b-9297-7e9b9e61e02d" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "d848aa54-7e8f-4f00-9538-de67976f8255", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 60 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "26ab48f6-c12d-48be-90c7-e06d6a075945" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "657caf40-ea03-4943-952e-4d060a26a7ab" + }, + { + "__type__": "cc.Node", + "_name": "One", + "_objFlags": 0, + "_parent": { + "__id__": 58 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 65 + } + ], + "_prefab": { + "__id__": 64 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 33.77777777777778, + "height": 38 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 44.56565656565657, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "3c27b6ea-6e82-47f4-a8f9-c3f94f65e413" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "f1bf7632-fbad-4377-b23c-e84257ac79eb", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 63 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "011c8cfa-9a31-4c2c-8e40-13d8ef5cba75" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "4fd68ff9-1134-4487-92a7-28786e5e4888" + }, + { + "__type__": "cc.Node", + "_name": "Count", + "_objFlags": 0, + "_parent": { + "__id__": 58 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 68 + }, + { + "__id__": 69 + } + ], + "_prefab": { + "__id__": 67 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 90, + "height": 50 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 23.454545454545453, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "43786db4-2da5-4ff4-aa93-4e10c4c33dc6" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "cb1ef548-cf93-4e87-9186-d6b9deb4d474", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 66 + }, + "_enabled": true, + "_materials": [], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "×2", + "_N$string": "×2", + "_fontSize": 36, + "_lineHeight": 43, + "_enableWrapText": false, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 2, + "_N$cacheMode": 0, + "_id": "7b3a2a1f-9512-41be-99c1-3712aa58a5d0", + "_N$fontSize": 36, + "_N$enableWrapText": true, + "_fontFamily": "Arial" + }, + { + "__type__": "cc.LabelOutline", + "_name": "", + "_objFlags": 0, + "_enabled": true, + "_id": "4a662e3b-74ee-4814-8d7e-10fbdb298a41", + "node": { + "__id__": 66 + }, + "_color": { + "__type__": "cc.Color", + "r": 126, + "g": 75, + "b": 42, + "a": 255 + }, + "_width": 3 + }, + { + "__type__": "cc.Node", + "_name": "Message", + "_objFlags": 0, + "_parent": { + "__id__": 3 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 72 + } + ], + "_prefab": { + "__id__": 71 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 760, + "height": 38 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + -351, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "789eb5e0-17f3-4f80-b44a-f8a348fc7951" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "6ab4650d-4ee4-45a3-b180-68edb392756d", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 70 + }, + "_enabled": true, + "_materials": [], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "", + "_N$string": "", + "_fontSize": 23, + "_lineHeight": 30, + "_enableWrapText": false, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 2, + "_N$cacheMode": 0, + "_id": "6039fb39-0d87-47d3-b1d7-33fa0ba4d479", + "_N$fontSize": 23, + "_N$enableWrapText": true, + "_fontFamily": "Arial" + } +] diff --git a/assets/mini_program_benefits/prefab/BenefitsDesktopGuide.prefab.meta b/assets/mini_program_benefits/prefab/BenefitsDesktopGuide.prefab.meta new file mode 100644 index 00000000..e49fdda8 --- /dev/null +++ b/assets/mini_program_benefits/prefab/BenefitsDesktopGuide.prefab.meta @@ -0,0 +1,9 @@ +{ + "ver": "1.3.2", + "uuid": "18d25094-31fe-4576-be2a-36b8733c0b70", + "importer": "prefab", + "optimizationPolicy": "AUTO", + "asyncLoadAssets": false, + "readonly": false, + "subMetas": {} +} \ No newline at end of file diff --git a/assets/mini_program_benefits/prefab/BenefitsFavoriteGuide.prefab b/assets/mini_program_benefits/prefab/BenefitsFavoriteGuide.prefab new file mode 100644 index 00000000..2dbb1a78 --- /dev/null +++ b/assets/mini_program_benefits/prefab/BenefitsFavoriteGuide.prefab @@ -0,0 +1,2617 @@ +[ + { + "__type__": "cc.Prefab", + "_name": "", + "_objFlags": 0, + "_native": "", + "data": { + "__id__": 1 + }, + "optimizationPolicy": 0, + "asyncLoadAssets": false, + "readonly": false + }, + { + "__type__": "cc.Node", + "_name": "BenefitsFavoriteGuide", + "_objFlags": 0, + "_parent": null, + "_children": [ + { + "__id__": 3 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 2 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 950, + "height": 1234 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "658a5b6c-5e6b-405e-8bf4-81ee4794c9ea" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "06c47b89-b1ea-4d4b-8446-385c08964b34", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Content", + "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [ + { + "__id__": 5 + }, + { + "__id__": 8 + }, + { + "__id__": 11 + }, + { + "__id__": 14 + }, + { + "__id__": 17 + }, + { + "__id__": 70 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 4 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 950, + "height": 1110 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + -23, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "a474e10f-6256-44b1-94bd-47c7a0bfe370" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "7b72a190-aafe-4248-9f59-158ddb5fbc2b", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Background", + "_objFlags": 0, + "_parent": { + "__id__": 3 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 7 + } + ], + "_prefab": { + "__id__": 6 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 902, + "height": 1110 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + -2, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "fb5eecc6-99b6-4180-9237-b6973cb5dfd0" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "8cb8334d-5427-42e4-ab4c-c25cedef2956", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 5 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "77480e0d-fe09-4873-8aea-61df6b4bbf64" + }, + "_type": 1, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "db0759af-f8ad-4e81-b738-9cba4e9ced16" + }, + { + "__type__": "cc.Node", + "_name": "Title", + "_objFlags": 0, + "_parent": { + "__id__": 3 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 10 + } + ], + "_prefab": { + "__id__": 9 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 740, + "height": 239.41176470588235 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 510, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "23e6e4d4-472a-4452-81a8-e1c20a43217b" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "eb3e7262-1120-4245-b62e-4f1eb6828c9c", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 8 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "6df5bfb7-df44-4981-b6cf-b183290a991e" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "9b608b60-9c30-4ba6-b925-8932aa9edead" + }, + { + "__type__": "cc.Node", + "_name": "Close", + "_objFlags": 0, + "_parent": { + "__id__": 3 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 13 + } + ], + "_prefab": { + "__id__": 12 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 92, + "height": 92 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 403, + 443, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "b3885962-3c84-439e-bb3f-206eef1db56c" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "2e7ea12c-1542-4f6f-b0e5-e1dec199d55b", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 11 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "67398214-36f6-46c1-a5e8-5b1fc859281a" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "2e8be91d-d633-492e-8edd-49bf08561772" + }, + { + "__type__": "cc.Node", + "_name": "Instructions", + "_objFlags": 0, + "_parent": { + "__id__": 3 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 16 + } + ], + "_prefab": { + "__id__": 15 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 765, + "height": 622 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 12, + 19, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "6c37a581-4fc5-4f44-9f9b-cd8d7d5ea775" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "dca00160-5bf2-4af4-8712-a711f5f366e9", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 14 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "c2ef578d-39d4-44a6-a2c5-5af635ae1492" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "29f1acbc-4c7a-4e05-989e-0056df906bc8" + }, + { + "__type__": "cc.Node", + "_name": "Rewards", + "_objFlags": 0, + "_parent": { + "__id__": 3 + }, + "_children": [ + { + "__id__": 19 + }, + { + "__id__": 36 + }, + { + "__id__": 53 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 18 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 0, + "height": 0 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + -410, + 0, + 0, + 0, + 0, + 1, + 1.05, + 1.05, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "776a0a70-680e-4b5a-a929-512ca11e0b22" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "dfd13f68-e234-42c8-ab47-51ad2fc3585b", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Item0", + "_objFlags": 0, + "_parent": { + "__id__": 17 + }, + "_children": [ + { + "__id__": 21 + }, + { + "__id__": 24 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 20 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 180, + "height": 210 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + -133, + 10, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "1ad57e62-ef4a-4f66-83b9-e2c872d359de" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "3af2280b-388c-45c1-8cd0-cb38ed4f5ec0", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Icon", + "_objFlags": 0, + "_parent": { + "__id__": 19 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 23 + } + ], + "_prefab": { + "__id__": 22 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 89.0721649484536, + "height": 108 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "0263e641-220e-4d33-bc31-80f27d078ec7" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "78ca57e0-e571-4793-a241-43f41566cd63", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 21 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "9f43f6b5-7793-4797-9b0d-ba17117898a9" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_id": "11af22c1-59c7-4047-a3b5-ad33d5eb8af5" + }, + { + "__type__": "cc.Node", + "_name": "Quantity", + "_objFlags": 0, + "_parent": { + "__id__": 19 + }, + "_children": [ + { + "__id__": 26 + }, + { + "__id__": 29 + }, + { + "__id__": 32 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 25 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 0, + "height": 0 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "bff314cd-6932-4b03-a20b-fadbbed28391" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "3db13c60-6f4f-40c4-a3bd-d8d778a554d9", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Times", + "_objFlags": 0, + "_parent": { + "__id__": 24 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 28 + } + ], + "_prefab": { + "__id__": 27 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 26.15625, + "height": 27 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 9.680179696449024, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "8287394c-041d-4ecd-ada1-2bbf404c5dbb" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "82e8f299-4418-488a-97e7-4246a8a0eb5b", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 26 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "26ab48f6-c12d-48be-90c7-e06d6a075945" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "bb3ecf89-01c3-4b1f-8312-9478644f3df8" + }, + { + "__type__": "cc.Node", + "_name": "One", + "_objFlags": 0, + "_parent": { + "__id__": 24 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 31 + } + ], + "_prefab": { + "__id__": 30 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 33.77777777777778, + "height": 38 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 37.64719358533792, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "5dd25d3f-a70f-4531-bfc6-e53fd1861456" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "a8b442cc-c794-4974-a089-4fde6d47b332", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 29 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "011c8cfa-9a31-4c2c-8e40-13d8ef5cba75" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "079ff473-1cbb-4015-98e8-decd0c0346b4" + }, + { + "__type__": "cc.Node", + "_name": "Count", + "_objFlags": 0, + "_parent": { + "__id__": 24 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 34 + }, + { + "__id__": 35 + } + ], + "_prefab": { + "__id__": 33 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 90, + "height": 50 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 16.536082474226802, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "bb0b3650-9d2a-4d0f-a210-278ac954b9d1" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "62020936-e60e-4b9a-928a-6e594759e898", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 32 + }, + "_enabled": true, + "_materials": [], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "×2", + "_N$string": "×2", + "_fontSize": 36, + "_lineHeight": 43, + "_enableWrapText": false, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 2, + "_N$cacheMode": 0, + "_id": "c8896f48-8128-496e-b925-d26a1ff3fd30", + "_N$fontSize": 36, + "_N$enableWrapText": true, + "_fontFamily": "Arial" + }, + { + "__type__": "cc.LabelOutline", + "_name": "", + "_objFlags": 0, + "_enabled": true, + "_id": "a6b0e280-4369-43e6-bb0e-8434e480bf8e", + "node": { + "__id__": 32 + }, + "_color": { + "__type__": "cc.Color", + "r": 126, + "g": 75, + "b": 42, + "a": 255 + }, + "_width": 3 + }, + { + "__type__": "cc.Node", + "_name": "Item1", + "_objFlags": 0, + "_parent": { + "__id__": 17 + }, + "_children": [ + { + "__id__": 38 + }, + { + "__id__": 41 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 37 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 180, + "height": 210 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 10, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "467e2c19-420c-4a93-b46c-705f7f7a1684" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "cf750f97-b2cf-4324-9ee4-e0442bfc3f6c", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Icon", + "_objFlags": 0, + "_parent": { + "__id__": 36 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 40 + } + ], + "_prefab": { + "__id__": 39 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 103.55696202531645, + "height": 108 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "782d4128-30f0-49d8-91fd-fe71e03b0e20" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "77c73dd3-a9a7-4c83-839d-38347d186c83", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 38 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "d2016222-467a-440f-9912-a45523322466" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_id": "cd79645e-c982-4496-8cdb-3c4909cdc5cb" + }, + { + "__type__": "cc.Node", + "_name": "Quantity", + "_objFlags": 0, + "_parent": { + "__id__": 36 + }, + "_children": [ + { + "__id__": 43 + }, + { + "__id__": 46 + }, + { + "__id__": 49 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 42 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 0, + "height": 0 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "bedfd6c0-4fed-4868-b106-dc93f5f2a46a" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "b173e2f1-21a9-40b8-8c1b-25fcfbcb813b", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Times", + "_objFlags": 0, + "_parent": { + "__id__": 41 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 45 + } + ], + "_prefab": { + "__id__": 44 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 26.15625, + "height": 27 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 16.922578234880447, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "1d1727fc-d976-40b0-b217-cddc6bf41fb4" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "e183f5e6-9798-4948-b885-a54f040d803a", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 43 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "26ab48f6-c12d-48be-90c7-e06d6a075945" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "7fcfa6d4-4cfb-4abf-8aea-79f1758eeaba" + }, + { + "__type__": "cc.Node", + "_name": "One", + "_objFlags": 0, + "_parent": { + "__id__": 41 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 48 + } + ], + "_prefab": { + "__id__": 47 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 33.77777777777778, + "height": 38 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 44.88959212376933, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "20513e00-4462-4e5c-ad03-8a5eda8071f4" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "51f2c4dc-436b-4a8c-9f85-4cfb7fc392e7", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 46 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "011c8cfa-9a31-4c2c-8e40-13d8ef5cba75" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "06bd3e4f-7588-49e3-bb5a-8e37095c05c5" + }, + { + "__type__": "cc.Node", + "_name": "Count", + "_objFlags": 0, + "_parent": { + "__id__": 41 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 51 + }, + { + "__id__": 52 + } + ], + "_prefab": { + "__id__": 50 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 90, + "height": 50 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 23.778481012658226, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "9c2aa8a8-5025-4410-a378-7ba59c3c5e80" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "426d6f1d-c525-49ce-864f-9584e1dfcd28", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 49 + }, + "_enabled": true, + "_materials": [], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "×2", + "_N$string": "×2", + "_fontSize": 36, + "_lineHeight": 43, + "_enableWrapText": false, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 2, + "_N$cacheMode": 0, + "_id": "2e0dda25-00d4-4d75-ad08-323577230806", + "_N$fontSize": 36, + "_N$enableWrapText": true, + "_fontFamily": "Arial" + }, + { + "__type__": "cc.LabelOutline", + "_name": "", + "_objFlags": 0, + "_enabled": true, + "_id": "bca355e8-6208-4a0a-a29a-d5e4eb8eff40", + "node": { + "__id__": 49 + }, + "_color": { + "__type__": "cc.Color", + "r": 126, + "g": 75, + "b": 42, + "a": 255 + }, + "_width": 3 + }, + { + "__type__": "cc.Node", + "_name": "Item2", + "_objFlags": 0, + "_parent": { + "__id__": 17 + }, + "_children": [ + { + "__id__": 55 + }, + { + "__id__": 58 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 54 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 180, + "height": 210 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 133, + 10, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "5d01c633-1fef-4930-baba-925792eb5567" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "ec6c16d3-7244-4806-a51e-82266b419e51", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Icon", + "_objFlags": 0, + "_parent": { + "__id__": 53 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 57 + } + ], + "_prefab": { + "__id__": 56 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 102.9090909090909, + "height": 108 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "21ebb3f5-8f4a-4e3c-a223-fed9baa1d208" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "b3a36366-d067-4ade-8f1b-d4c4597ce83a", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 55 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "93a1c53b-7530-429e-a8dd-2e60e0ade38e" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_id": "830ed874-3527-4b21-9d8e-62df4bc6b6a5" + }, + { + "__type__": "cc.Node", + "_name": "Quantity", + "_objFlags": 0, + "_parent": { + "__id__": 53 + }, + "_children": [ + { + "__id__": 60 + }, + { + "__id__": 63 + }, + { + "__id__": 66 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 59 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 0, + "height": 0 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "c451c937-f294-43a0-bfa9-b836e3b7ff0a" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "30e1aaa0-b5ea-4746-862b-c5bef5abbfa5", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Times", + "_objFlags": 0, + "_parent": { + "__id__": 58 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 62 + } + ], + "_prefab": { + "__id__": 61 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 26.15625, + "height": 27 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 16.598642676767675, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "d7a656ba-52c4-40b3-9cc4-a438975d4fa8" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "31501246-e02a-4f7f-b8eb-8c8706e8c37f", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 60 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "26ab48f6-c12d-48be-90c7-e06d6a075945" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "39821276-303f-4b4e-ae8b-7a1657788ed8" + }, + { + "__type__": "cc.Node", + "_name": "One", + "_objFlags": 0, + "_parent": { + "__id__": 58 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 65 + } + ], + "_prefab": { + "__id__": 64 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 33.77777777777778, + "height": 38 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 44.56565656565657, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "474b927a-0ff2-414c-8a21-1142083cecb7" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "417fc77c-caae-4fc3-8088-871fb3d75ae0", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 63 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "011c8cfa-9a31-4c2c-8e40-13d8ef5cba75" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "7b8c61df-ec11-4a4b-8975-d3a6f8154c6a" + }, + { + "__type__": "cc.Node", + "_name": "Count", + "_objFlags": 0, + "_parent": { + "__id__": 58 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 68 + }, + { + "__id__": 69 + } + ], + "_prefab": { + "__id__": 67 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 90, + "height": 50 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 23.454545454545453, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "702f99cb-b3e3-46d0-85a2-69bca81a7c55" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "5cfefae4-aeb5-4436-bbf1-5a738ba713f8", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 66 + }, + "_enabled": true, + "_materials": [], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "×2", + "_N$string": "×2", + "_fontSize": 36, + "_lineHeight": 43, + "_enableWrapText": false, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 2, + "_N$cacheMode": 0, + "_id": "21fee24b-1804-469c-8997-984189b605ec", + "_N$fontSize": 36, + "_N$enableWrapText": true, + "_fontFamily": "Arial" + }, + { + "__type__": "cc.LabelOutline", + "_name": "", + "_objFlags": 0, + "_enabled": true, + "_id": "eb9e5ed9-dc69-4b0a-9741-5ef982c63d9f", + "node": { + "__id__": 66 + }, + "_color": { + "__type__": "cc.Color", + "r": 126, + "g": 75, + "b": 42, + "a": 255 + }, + "_width": 3 + }, + { + "__type__": "cc.Node", + "_name": "Message", + "_objFlags": 0, + "_parent": { + "__id__": 3 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 72 + } + ], + "_prefab": { + "__id__": 71 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 760, + "height": 38 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + -521, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "90191243-a317-4a9e-ace6-488c099ef0ab" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "f31c5ebb-60e2-4668-8eb3-d008fac170cd", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 70 + }, + "_enabled": true, + "_materials": [], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "", + "_N$string": "", + "_fontSize": 23, + "_lineHeight": 30, + "_enableWrapText": false, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 2, + "_N$cacheMode": 0, + "_id": "ed55d017-61f8-4949-9709-96652d00abc5", + "_N$fontSize": 23, + "_N$enableWrapText": true, + "_fontFamily": "Arial" + } +] diff --git a/assets/mini_program_benefits/prefab/BenefitsFavoriteGuide.prefab.meta b/assets/mini_program_benefits/prefab/BenefitsFavoriteGuide.prefab.meta new file mode 100644 index 00000000..6fdf805f --- /dev/null +++ b/assets/mini_program_benefits/prefab/BenefitsFavoriteGuide.prefab.meta @@ -0,0 +1,9 @@ +{ + "ver": "1.3.2", + "uuid": "53f2f7a7-d02a-4b8f-9e3b-a982e80e65b9", + "importer": "prefab", + "optimizationPolicy": "AUTO", + "asyncLoadAssets": false, + "readonly": false, + "subMetas": {} +} \ No newline at end of file diff --git a/assets/mini_program_benefits/prefab/BenefitsMain.prefab b/assets/mini_program_benefits/prefab/BenefitsMain.prefab new file mode 100644 index 00000000..db81de88 --- /dev/null +++ b/assets/mini_program_benefits/prefab/BenefitsMain.prefab @@ -0,0 +1,5662 @@ +[ + { + "__type__": "cc.Prefab", + "_name": "", + "_objFlags": 0, + "_native": "", + "data": { + "__id__": 1 + }, + "optimizationPolicy": 0, + "asyncLoadAssets": false, + "readonly": false + }, + { + "__type__": "cc.Node", + "_name": "BenefitsMain", + "_objFlags": 0, + "_parent": null, + "_children": [ + { + "__id__": 3 + }, + { + "__id__": 6 + }, + { + "__id__": 9 + }, + { + "__id__": 12 + }, + { + "__id__": 83 + }, + { + "__id__": 154 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 2 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 950, + "height": 1280 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "e203a1e2-3efe-4d9c-a62a-4727a7666579" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "7290563f-2297-40f0-a2b1-4c4b585e8282", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Background", + "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 5 + } + ], + "_prefab": { + "__id__": 4 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 950, + "height": 1010 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "8a88fe10-2721-4271-83ea-91bcd9036259" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "dd1cb62e-02dc-4a43-9aa1-cf106983bf38", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 3 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "2562cef8-4823-429f-adc9-5a757340942d" + }, + "_type": 1, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "16d2b0f7-d960-4035-a42e-74584b08d245" + }, + { + "__type__": "cc.Node", + "_name": "Title", + "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 8 + } + ], + "_prefab": { + "__id__": 7 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 740, + "height": 193.31460674157304 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 260, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "0914c09b-2563-43c4-92b5-d8de4ac10972" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "b6992482-d2a8-4785-a22c-9a54b079ddab", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 6 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "0877f183-4746-46f2-a2fb-d2b19f680af9" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "642967fd-b4ff-4ce4-a69c-1d3e775f9a8c" + }, + { + "__type__": "cc.Node", + "_name": "Close", + "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 11 + } + ], + "_prefab": { + "__id__": 10 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 92, + "height": 92 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 403, + 480, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "fb199b5f-374f-4a46-88f7-27156be59f73" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "d686d85b-96ab-45ed-aabb-ef10778a4229", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 9 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "67398214-36f6-46c1-a5e8-5b1fc859281a" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "1c26dcd0-50fa-4ca0-818f-f7a3b8b9cea0" + }, + { + "__type__": "cc.Node", + "_name": "Task0", + "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [ + { + "__id__": 15 + }, + { + "__id__": 18 + }, + { + "__id__": 21 + }, + { + "__id__": 74 + }, + { + "__id__": 77 + }, + { + "__id__": 80 + } + ], + "_active": true, + "_components": [ + { + "__id__": 14 + } + ], + "_prefab": { + "__id__": 13 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 818, + "height": 222 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + -30, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "bf38b116-706a-40d6-b9f9-5e56298c7eac" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "f6a5ce8e-3cfd-4312-b74d-5dd04d57fb5a", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 12 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "db3bc0a7-ec60-4031-9692-f32d157dae7e" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "fbe2c949-0808-4d5b-bad0-82dbc8c5fea2" + }, + { + "__type__": "cc.Node", + "_name": "TaskIcon", + "_objFlags": 0, + "_parent": { + "__id__": 12 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 17 + } + ], + "_prefab": { + "__id__": 16 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 166, + "height": 166 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + -300, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "a5124705-c552-42d1-8594-ed95c8b2f75d" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "e5bff326-39fd-470b-a068-1ac80f21d3b3", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 15 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "dc83d9bc-5368-4d53-917b-58607f6f24c0" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "af4ca1bf-c7a2-41e6-a1d6-ac37da55eb38" + }, + { + "__type__": "cc.Node", + "_name": "TaskTitle", + "_objFlags": 0, + "_parent": { + "__id__": 12 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 20 + } + ], + "_prefab": { + "__id__": 19 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 332, + "height": 39 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + -24, + 68, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "31c73417-cdf3-4d87-9a68-e2aadc273b9c" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "67baf54e-2812-4087-8bf3-5e130d99ebb1", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 18 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "8c702fbc-5dcf-4208-ba4e-d268bab82455" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "665b8513-ce21-4c86-a3a6-2d15451c4db4" + }, + { + "__type__": "cc.Node", + "_name": "Rewards", + "_objFlags": 0, + "_parent": { + "__id__": 12 + }, + "_children": [ + { + "__id__": 23 + }, + { + "__id__": 40 + }, + { + "__id__": 57 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 22 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 0, + "height": 0 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + -20, + -22, + 0, + 0, + 0, + 0, + 1, + 0.84, + 0.84, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "a950b8e6-65ca-4183-9e32-eca312dc26c2" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "d68fc619-8514-41c5-ade9-c5b2a406ffbf", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Item0", + "_objFlags": 0, + "_parent": { + "__id__": 21 + }, + "_children": [ + { + "__id__": 25 + }, + { + "__id__": 28 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 24 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 180, + "height": 210 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + -133, + 10, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "5335e123-78bb-4cf3-be5f-fcc68231c288" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "9751c502-ece4-4c7b-b74a-e62816a09e4a", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Icon", + "_objFlags": 0, + "_parent": { + "__id__": 23 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 27 + } + ], + "_prefab": { + "__id__": 26 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 89.0721649484536, + "height": 108 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "1412f9fc-7e4e-473f-be18-235e517096ba" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "5a7695fa-1e4b-4493-82de-b48abca23a96", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 25 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "9f43f6b5-7793-4797-9b0d-ba17117898a9" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_id": "10c63b67-8ad0-44a8-aa91-5add92f23c6a" + }, + { + "__type__": "cc.Node", + "_name": "Quantity", + "_objFlags": 0, + "_parent": { + "__id__": 23 + }, + "_children": [ + { + "__id__": 30 + }, + { + "__id__": 33 + }, + { + "__id__": 36 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 29 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 0, + "height": 0 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "ab96a287-e278-4b0f-bdba-aef94530cd1a" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "fe93f6ef-65aa-4ef1-b4f8-28b374001dcd", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Times", + "_objFlags": 0, + "_parent": { + "__id__": 28 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 32 + } + ], + "_prefab": { + "__id__": 31 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 26.15625, + "height": 27 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 9.680179696449024, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "8ff7b976-f6b6-458f-ac3c-fc4ecb877805" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "dadd277b-9291-46c3-9bd3-01ff1b5bf76e", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 30 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "26ab48f6-c12d-48be-90c7-e06d6a075945" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "7149569d-7d2d-4658-bdd2-8b44dea957e0" + }, + { + "__type__": "cc.Node", + "_name": "One", + "_objFlags": 0, + "_parent": { + "__id__": 28 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 35 + } + ], + "_prefab": { + "__id__": 34 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 33.77777777777778, + "height": 38 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 37.64719358533792, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "d6ad312e-4d97-4223-9f6d-5476e2756794" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "87236ecc-c31d-45b4-9482-ea34a08fd7e3", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 33 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "011c8cfa-9a31-4c2c-8e40-13d8ef5cba75" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "0eb171ac-0315-4d74-9f1e-27c7d9cb4681" + }, + { + "__type__": "cc.Node", + "_name": "Count", + "_objFlags": 0, + "_parent": { + "__id__": 28 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 38 + }, + { + "__id__": 39 + } + ], + "_prefab": { + "__id__": 37 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 90, + "height": 50 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 16.536082474226802, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "c4189767-b3df-4b0c-95d4-ea22363d133b" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "3b533255-278f-4c70-848c-5da91e2f9000", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 36 + }, + "_enabled": true, + "_materials": [], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "×2", + "_N$string": "×2", + "_fontSize": 36, + "_lineHeight": 43, + "_enableWrapText": false, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 2, + "_N$cacheMode": 0, + "_id": "4a6a6131-3b32-4118-ac95-3bb4b4b6a6de", + "_N$fontSize": 36, + "_N$enableWrapText": true, + "_fontFamily": "Arial" + }, + { + "__type__": "cc.LabelOutline", + "_name": "", + "_objFlags": 0, + "_enabled": true, + "_id": "e9d967d3-56bf-48fd-8bd8-f0e6bfc1f935", + "node": { + "__id__": 36 + }, + "_color": { + "__type__": "cc.Color", + "r": 126, + "g": 75, + "b": 42, + "a": 255 + }, + "_width": 3 + }, + { + "__type__": "cc.Node", + "_name": "Item1", + "_objFlags": 0, + "_parent": { + "__id__": 21 + }, + "_children": [ + { + "__id__": 42 + }, + { + "__id__": 45 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 41 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 180, + "height": 210 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 10, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "73bfc304-803f-40cf-ba9e-71230d225fa5" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "8873e9ec-0f61-479b-8c30-c7a8a1caef95", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Icon", + "_objFlags": 0, + "_parent": { + "__id__": 40 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 44 + } + ], + "_prefab": { + "__id__": 43 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 103.55696202531645, + "height": 108 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "91fbca15-4560-4764-8bfb-83eec0b5eea1" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "0a52c9ef-19f2-476f-b14f-2b1f5d6e90b6", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 42 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "d2016222-467a-440f-9912-a45523322466" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_id": "2ca842cc-01fd-41b3-8ce2-a129a6638be6" + }, + { + "__type__": "cc.Node", + "_name": "Quantity", + "_objFlags": 0, + "_parent": { + "__id__": 40 + }, + "_children": [ + { + "__id__": 47 + }, + { + "__id__": 50 + }, + { + "__id__": 53 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 46 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 0, + "height": 0 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "df75ec72-75d1-48b6-b885-7f1872107b30" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "a6a80d5a-9d37-410b-ae50-6d6fc6e1b008", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Times", + "_objFlags": 0, + "_parent": { + "__id__": 45 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 49 + } + ], + "_prefab": { + "__id__": 48 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 26.15625, + "height": 27 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 16.922578234880447, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "fffc98b0-6abb-4f87-a719-15bc94cc86e6" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "1496e09d-04ca-495a-a9c0-7602c4f51485", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 47 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "26ab48f6-c12d-48be-90c7-e06d6a075945" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "1635a76f-5294-42fe-9670-14ecfc70a76f" + }, + { + "__type__": "cc.Node", + "_name": "One", + "_objFlags": 0, + "_parent": { + "__id__": 45 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 52 + } + ], + "_prefab": { + "__id__": 51 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 33.77777777777778, + "height": 38 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 44.88959212376933, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "c7380a62-1fc2-44a2-b041-f5dda0353ee4" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "84f514c3-9956-47e4-afed-a9f2be467f5d", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 50 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "011c8cfa-9a31-4c2c-8e40-13d8ef5cba75" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "68a42a9d-e945-4871-8db3-b957c22ea4e2" + }, + { + "__type__": "cc.Node", + "_name": "Count", + "_objFlags": 0, + "_parent": { + "__id__": 45 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 55 + }, + { + "__id__": 56 + } + ], + "_prefab": { + "__id__": 54 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 90, + "height": 50 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 23.778481012658226, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "9283a2df-4b6b-46c5-b3f7-10c444b6695b" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "aba1a431-26dc-4238-9674-2daba1a6a754", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 53 + }, + "_enabled": true, + "_materials": [], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "×2", + "_N$string": "×2", + "_fontSize": 36, + "_lineHeight": 43, + "_enableWrapText": false, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 2, + "_N$cacheMode": 0, + "_id": "daa6b09e-76c4-4cb9-ba45-7536ae9c87b4", + "_N$fontSize": 36, + "_N$enableWrapText": true, + "_fontFamily": "Arial" + }, + { + "__type__": "cc.LabelOutline", + "_name": "", + "_objFlags": 0, + "_enabled": true, + "_id": "c870c9fa-3302-40d2-987e-b226c65584d2", + "node": { + "__id__": 53 + }, + "_color": { + "__type__": "cc.Color", + "r": 126, + "g": 75, + "b": 42, + "a": 255 + }, + "_width": 3 + }, + { + "__type__": "cc.Node", + "_name": "Item2", + "_objFlags": 0, + "_parent": { + "__id__": 21 + }, + "_children": [ + { + "__id__": 59 + }, + { + "__id__": 62 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 58 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 180, + "height": 210 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 133, + 10, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "c1dce968-c73b-415f-9fd5-87a9980e6321" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "7285e9ae-ab1a-4c62-8d84-95bd9d013e09", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Icon", + "_objFlags": 0, + "_parent": { + "__id__": 57 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 61 + } + ], + "_prefab": { + "__id__": 60 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 102.9090909090909, + "height": 108 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "bd041e48-d3e3-4de2-b18b-6b90178111c2" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "6b5f985a-9cb9-4606-b642-9f4f5ab772e2", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 59 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "93a1c53b-7530-429e-a8dd-2e60e0ade38e" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_id": "724253f8-647f-41fc-8e2b-63710139608e" + }, + { + "__type__": "cc.Node", + "_name": "Quantity", + "_objFlags": 0, + "_parent": { + "__id__": 57 + }, + "_children": [ + { + "__id__": 64 + }, + { + "__id__": 67 + }, + { + "__id__": 70 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 63 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 0, + "height": 0 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "410ef00a-7e12-4af9-9239-9fa3f62089a8" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "8e6df91f-ea6e-4a70-9818-215e051c84d3", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Times", + "_objFlags": 0, + "_parent": { + "__id__": 62 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 66 + } + ], + "_prefab": { + "__id__": 65 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 26.15625, + "height": 27 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 16.598642676767675, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "96711e3a-98b1-4dde-ad2e-35d0cb8c72ad" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "154d019a-3453-4936-bbf9-d765e5d67228", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 64 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "26ab48f6-c12d-48be-90c7-e06d6a075945" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "5e147e15-0ec7-4e22-8817-390935d9dd9c" + }, + { + "__type__": "cc.Node", + "_name": "One", + "_objFlags": 0, + "_parent": { + "__id__": 62 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 69 + } + ], + "_prefab": { + "__id__": 68 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 33.77777777777778, + "height": 38 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 44.56565656565657, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "202ab998-eeb5-4030-8110-c722b9a2cc82" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "183b3c01-efe4-4f57-a00d-edffab74b94b", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 67 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "011c8cfa-9a31-4c2c-8e40-13d8ef5cba75" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "0e9cbe6d-1082-4c1a-bd41-fbf72197a7ed" + }, + { + "__type__": "cc.Node", + "_name": "Count", + "_objFlags": 0, + "_parent": { + "__id__": 62 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 72 + }, + { + "__id__": 73 + } + ], + "_prefab": { + "__id__": 71 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 90, + "height": 50 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 23.454545454545453, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "729ba464-3806-47e2-89d6-98764156b056" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "db518db0-c53c-4baa-b4f3-7d2d5c86e248", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 70 + }, + "_enabled": true, + "_materials": [], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "×2", + "_N$string": "×2", + "_fontSize": 36, + "_lineHeight": 43, + "_enableWrapText": false, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 2, + "_N$cacheMode": 0, + "_id": "e7fe6782-e0ef-4e9b-a76d-459319b467db", + "_N$fontSize": 36, + "_N$enableWrapText": true, + "_fontFamily": "Arial" + }, + { + "__type__": "cc.LabelOutline", + "_name": "", + "_objFlags": 0, + "_enabled": true, + "_id": "73cbfd4d-acae-44bd-8f3e-7b7dd9ca334d", + "node": { + "__id__": 70 + }, + "_color": { + "__type__": "cc.Color", + "r": 126, + "g": 75, + "b": 42, + "a": 255 + }, + "_width": 3 + }, + { + "__type__": "cc.Node", + "_name": "View", + "_objFlags": 0, + "_parent": { + "__id__": 12 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 76 + } + ], + "_prefab": { + "__id__": 75 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 200, + "height": 96 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 282, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "bb5e1106-7836-4fee-a3ec-e908ce08051a" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "b661013f-29be-49b2-92b9-a9e6c8ba6362", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 74 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "8791583b-79b5-48ee-ba2f-27988ec87c3c" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "fbc945ca-92c7-4bfb-b83b-872b6819abd5" + }, + { + "__type__": "cc.Node", + "_name": "Claim", + "_objFlags": 0, + "_parent": { + "__id__": 12 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 79 + } + ], + "_prefab": { + "__id__": 78 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 200, + "height": 96 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 282, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "d712ee94-50f1-4cca-9c02-811346de1e68" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "f1a30041-9fac-4cc8-a54c-a40bddd615ff", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 77 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "f55f5c8c-5140-4ce2-8b7c-52c8cf519714" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "05bf2e4d-5d0b-4c6b-adde-44fb30048ec9" + }, + { + "__type__": "cc.Node", + "_name": "Claimed", + "_objFlags": 0, + "_parent": { + "__id__": 12 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 82 + } + ], + "_prefab": { + "__id__": 81 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 117.07317073170731, + "height": 96 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 282, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "374f87b7-1377-48f5-ac7a-9fc18a76f3e2" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "1df40ac6-94c1-4ade-93cf-26f86bf33ace", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 80 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "91ab9ed1-902b-4062-9e65-cecc117d4e50" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "0b4484db-3289-480b-a93f-0d53766a09d9" + }, + { + "__type__": "cc.Node", + "_name": "Task1", + "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [ + { + "__id__": 86 + }, + { + "__id__": 89 + }, + { + "__id__": 92 + }, + { + "__id__": 145 + }, + { + "__id__": 148 + }, + { + "__id__": 151 + } + ], + "_active": true, + "_components": [ + { + "__id__": 85 + } + ], + "_prefab": { + "__id__": 84 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 818, + "height": 222 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + -272, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "e1936c31-2f69-4c6d-9d6e-cf636c4ea8f1" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "1c5ab04a-38d5-4ca3-a6d8-eb5cf45c8ceb", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 83 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "db3bc0a7-ec60-4031-9692-f32d157dae7e" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "ad08c2a0-1f71-4598-a3af-429347a2df28" + }, + { + "__type__": "cc.Node", + "_name": "TaskIcon", + "_objFlags": 0, + "_parent": { + "__id__": 83 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 88 + } + ], + "_prefab": { + "__id__": 87 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 166, + "height": 166 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + -300, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "fac538dd-6d12-47e4-abfb-e6849964a5ba" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "bbf2b9e7-080a-4bfe-80ec-4acdd67c91b8", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 86 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "11350710-460d-4637-8e97-62d6ce0dfc94" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "3ae57798-9e5f-4870-a05b-5f65a16ae1ef" + }, + { + "__type__": "cc.Node", + "_name": "TaskTitle", + "_objFlags": 0, + "_parent": { + "__id__": 83 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 91 + } + ], + "_prefab": { + "__id__": 90 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 206, + "height": 38 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + -87, + 68, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "27447be0-0e12-4f8c-a1e5-a35a239ec200" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "296a107f-c57d-401b-9b57-ecc55de3d25e", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 89 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "6195066d-ffde-42dd-946a-98391261422d" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "8c7f67eb-3527-4639-89c0-53fc343d789d" + }, + { + "__type__": "cc.Node", + "_name": "Rewards", + "_objFlags": 0, + "_parent": { + "__id__": 83 + }, + "_children": [ + { + "__id__": 94 + }, + { + "__id__": 111 + }, + { + "__id__": 128 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 93 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 0, + "height": 0 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + -20, + -22, + 0, + 0, + 0, + 0, + 1, + 0.84, + 0.84, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "5d1632ce-8917-4b2c-8d44-d9a41b631c32" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "c292b6bf-e107-4673-b873-8a717c4afa1b", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Item0", + "_objFlags": 0, + "_parent": { + "__id__": 92 + }, + "_children": [ + { + "__id__": 96 + }, + { + "__id__": 99 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 95 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 180, + "height": 210 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + -133, + 10, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "7e98187a-514b-4a3f-b781-cbd88dcbad8e" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "c375dc29-bf42-429f-a25f-d7b7206fa91d", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Icon", + "_objFlags": 0, + "_parent": { + "__id__": 94 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 98 + } + ], + "_prefab": { + "__id__": 97 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 89.0721649484536, + "height": 108 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "263dae79-9843-4303-ae9c-793bde876e89" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "39da7e46-ee6e-42a7-8071-361b433ec08f", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 96 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "9f43f6b5-7793-4797-9b0d-ba17117898a9" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_id": "9822ba7d-c9aa-477a-81d1-382f31146466" + }, + { + "__type__": "cc.Node", + "_name": "Quantity", + "_objFlags": 0, + "_parent": { + "__id__": 94 + }, + "_children": [ + { + "__id__": 101 + }, + { + "__id__": 104 + }, + { + "__id__": 107 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 100 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 0, + "height": 0 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "04a30ab3-0691-442f-acfa-384829d849e3" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "f872cfe1-7380-4a24-b2a9-14ee59b0ed89", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Times", + "_objFlags": 0, + "_parent": { + "__id__": 99 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 103 + } + ], + "_prefab": { + "__id__": 102 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 26.15625, + "height": 27 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 9.680179696449024, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "86892240-4b36-4c89-9600-dc4282af4cae" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "aa00797d-cba7-494f-bea8-aa84adbd2aa0", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 101 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "26ab48f6-c12d-48be-90c7-e06d6a075945" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "d1c2e778-5ebc-4e99-bc37-34fe96b2ac12" + }, + { + "__type__": "cc.Node", + "_name": "One", + "_objFlags": 0, + "_parent": { + "__id__": 99 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 106 + } + ], + "_prefab": { + "__id__": 105 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 33.77777777777778, + "height": 38 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 37.64719358533792, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "f6c54f75-e374-489b-a606-d505a58c61d3" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "97f2a91b-b045-40a4-8158-aa5ee9c126dc", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 104 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "011c8cfa-9a31-4c2c-8e40-13d8ef5cba75" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "f8567c61-8b64-453d-b361-a48cd0479d3d" + }, + { + "__type__": "cc.Node", + "_name": "Count", + "_objFlags": 0, + "_parent": { + "__id__": 99 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 109 + }, + { + "__id__": 110 + } + ], + "_prefab": { + "__id__": 108 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 90, + "height": 50 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 16.536082474226802, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "83f1939d-2969-4c6e-864c-5397c428e141" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "4bdc0f64-0a27-4895-9671-a83ef30e7fdf", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 107 + }, + "_enabled": true, + "_materials": [], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "×2", + "_N$string": "×2", + "_fontSize": 36, + "_lineHeight": 43, + "_enableWrapText": false, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 2, + "_N$cacheMode": 0, + "_id": "94299c72-cc73-43f0-87fa-1fd085214217", + "_N$fontSize": 36, + "_N$enableWrapText": true, + "_fontFamily": "Arial" + }, + { + "__type__": "cc.LabelOutline", + "_name": "", + "_objFlags": 0, + "_enabled": true, + "_id": "cfd9056b-8580-4723-9c84-731eec2b7ad0", + "node": { + "__id__": 107 + }, + "_color": { + "__type__": "cc.Color", + "r": 126, + "g": 75, + "b": 42, + "a": 255 + }, + "_width": 3 + }, + { + "__type__": "cc.Node", + "_name": "Item1", + "_objFlags": 0, + "_parent": { + "__id__": 92 + }, + "_children": [ + { + "__id__": 113 + }, + { + "__id__": 116 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 112 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 180, + "height": 210 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 10, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "74e1342f-d8fb-4a49-b6db-97ef9aa75fb4" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "efbc656f-4893-4577-9991-65d08ac79ec9", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Icon", + "_objFlags": 0, + "_parent": { + "__id__": 111 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 115 + } + ], + "_prefab": { + "__id__": 114 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 103.55696202531645, + "height": 108 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "6d0d96a0-6db9-4762-b562-1212c0727453" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "e2e002e6-8bed-4a1f-a326-c1e9db745e12", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 113 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "d2016222-467a-440f-9912-a45523322466" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_id": "89b3acac-1213-4953-9e23-c5460cb105f6" + }, + { + "__type__": "cc.Node", + "_name": "Quantity", + "_objFlags": 0, + "_parent": { + "__id__": 111 + }, + "_children": [ + { + "__id__": 118 + }, + { + "__id__": 121 + }, + { + "__id__": 124 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 117 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 0, + "height": 0 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "ed332840-8d73-407e-af14-0293fcb796ee" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "85dc709f-bf97-49e0-afb8-1224a9a87456", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Times", + "_objFlags": 0, + "_parent": { + "__id__": 116 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 120 + } + ], + "_prefab": { + "__id__": 119 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 26.15625, + "height": 27 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 16.922578234880447, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "b2467aa6-592f-4e37-bfcf-845706b1fbc3" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "69abf8b5-0839-4b7e-850d-7371a6cc51b4", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 118 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "26ab48f6-c12d-48be-90c7-e06d6a075945" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "a4e3566c-5583-4a23-8f0f-45b8dcdd6809" + }, + { + "__type__": "cc.Node", + "_name": "One", + "_objFlags": 0, + "_parent": { + "__id__": 116 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 123 + } + ], + "_prefab": { + "__id__": 122 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 33.77777777777778, + "height": 38 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 44.88959212376933, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "61d9e2b8-5293-4253-aec5-9bde962a2e9e" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "db1ff890-354b-4c01-a9ec-357897ba8677", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 121 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "011c8cfa-9a31-4c2c-8e40-13d8ef5cba75" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "6242641c-2f7e-4909-a1ff-73c16c4f4238" + }, + { + "__type__": "cc.Node", + "_name": "Count", + "_objFlags": 0, + "_parent": { + "__id__": 116 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 126 + }, + { + "__id__": 127 + } + ], + "_prefab": { + "__id__": 125 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 90, + "height": 50 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 23.778481012658226, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "cfa2cd90-c57c-493f-bbad-0629f83d7647" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "018f6364-ef40-4c5d-882c-5666eaec7ade", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 124 + }, + "_enabled": true, + "_materials": [], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "×2", + "_N$string": "×2", + "_fontSize": 36, + "_lineHeight": 43, + "_enableWrapText": false, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 2, + "_N$cacheMode": 0, + "_id": "74a67f12-289c-4e6b-9391-5bcdb01a0008", + "_N$fontSize": 36, + "_N$enableWrapText": true, + "_fontFamily": "Arial" + }, + { + "__type__": "cc.LabelOutline", + "_name": "", + "_objFlags": 0, + "_enabled": true, + "_id": "40113568-3819-4234-acaa-0e06e3052648", + "node": { + "__id__": 124 + }, + "_color": { + "__type__": "cc.Color", + "r": 126, + "g": 75, + "b": 42, + "a": 255 + }, + "_width": 3 + }, + { + "__type__": "cc.Node", + "_name": "Item2", + "_objFlags": 0, + "_parent": { + "__id__": 92 + }, + "_children": [ + { + "__id__": 130 + }, + { + "__id__": 133 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 129 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 180, + "height": 210 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 133, + 10, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "62782b89-5bed-4b9d-a4aa-07672561d500" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "4e44bed2-b0b1-469d-ba87-f8b459307b03", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Icon", + "_objFlags": 0, + "_parent": { + "__id__": 128 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 132 + } + ], + "_prefab": { + "__id__": 131 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 102.9090909090909, + "height": 108 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "3a849df8-a571-4a83-98df-95ec9f1a6776" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "0ed8a873-03b3-4bf6-95fc-d2f0f314d7ff", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 130 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "93a1c53b-7530-429e-a8dd-2e60e0ade38e" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_id": "9912b0c1-5f3b-4f88-b98f-4bbaf0bbefd1" + }, + { + "__type__": "cc.Node", + "_name": "Quantity", + "_objFlags": 0, + "_parent": { + "__id__": 128 + }, + "_children": [ + { + "__id__": 135 + }, + { + "__id__": 138 + }, + { + "__id__": 141 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 134 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 0, + "height": 0 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "2fcd7c10-3f0e-4a1b-ae19-5266999e90ae" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "9d7bafb1-ee07-4aaa-a9b0-9538b749dc68", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Times", + "_objFlags": 0, + "_parent": { + "__id__": 133 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 137 + } + ], + "_prefab": { + "__id__": 136 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 26.15625, + "height": 27 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 16.598642676767675, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "07a4360f-2dd0-4fb6-8f0c-8b16d6d9b965" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "c8ecd655-0e8e-421d-9209-3b726b279556", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 135 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "26ab48f6-c12d-48be-90c7-e06d6a075945" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "1e3b9943-e134-4372-b734-c320d4eca05b" + }, + { + "__type__": "cc.Node", + "_name": "One", + "_objFlags": 0, + "_parent": { + "__id__": 133 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 140 + } + ], + "_prefab": { + "__id__": 139 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 33.77777777777778, + "height": 38 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 44.56565656565657, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "f79fc7ef-4e5f-467f-b7ff-6a99af74549e" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "d84913a7-998d-4382-9c38-db338870b6fe", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 138 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "011c8cfa-9a31-4c2c-8e40-13d8ef5cba75" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "eaa573e3-d4b7-48ff-ae54-c11c825785b1" + }, + { + "__type__": "cc.Node", + "_name": "Count", + "_objFlags": 0, + "_parent": { + "__id__": 133 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 143 + }, + { + "__id__": 144 + } + ], + "_prefab": { + "__id__": 142 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 90, + "height": 50 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 23.454545454545453, + -46, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "a566ad21-eaa8-4191-8e10-30fdbf3e3aee" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "fb4e5f02-f9f6-4b78-86eb-516cc08c3e6d", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 141 + }, + "_enabled": true, + "_materials": [], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "×2", + "_N$string": "×2", + "_fontSize": 36, + "_lineHeight": 43, + "_enableWrapText": false, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 2, + "_N$cacheMode": 0, + "_id": "6bfcbdc1-42ad-45c2-9f11-55ae9a28180c", + "_N$fontSize": 36, + "_N$enableWrapText": true, + "_fontFamily": "Arial" + }, + { + "__type__": "cc.LabelOutline", + "_name": "", + "_objFlags": 0, + "_enabled": true, + "_id": "560e970c-46b8-4391-9ac5-4ea0d6dda38a", + "node": { + "__id__": 141 + }, + "_color": { + "__type__": "cc.Color", + "r": 126, + "g": 75, + "b": 42, + "a": 255 + }, + "_width": 3 + }, + { + "__type__": "cc.Node", + "_name": "View", + "_objFlags": 0, + "_parent": { + "__id__": 83 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 147 + } + ], + "_prefab": { + "__id__": 146 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 200, + "height": 96 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 282, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "60a6b123-47fa-4997-87f5-a957b14b5803" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "2d091626-e1c1-45ea-954d-eb37c660e634", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 145 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "8791583b-79b5-48ee-ba2f-27988ec87c3c" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "6c5eb4c1-d245-4bd6-bee8-0721f6220319" + }, + { + "__type__": "cc.Node", + "_name": "Claim", + "_objFlags": 0, + "_parent": { + "__id__": 83 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 150 + } + ], + "_prefab": { + "__id__": 149 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 200, + "height": 96 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 282, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "2c9e6c2d-4b97-4012-999e-cfe3c148d74c" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "0fa84b7c-0394-4b50-b9ea-a66807e67931", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 148 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "f55f5c8c-5140-4ce2-8b7c-52c8cf519714" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "8994c577-9045-4bd8-892a-3167290e6aeb" + }, + { + "__type__": "cc.Node", + "_name": "Claimed", + "_objFlags": 0, + "_parent": { + "__id__": 83 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 153 + } + ], + "_prefab": { + "__id__": 152 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 117.07317073170731, + "height": 96 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 282, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "7578523a-bc64-4ddc-974a-7205dacc0361" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "b16a8fe7-5866-42c9-8297-9c68819ba8b5", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 151 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "91ab9ed1-902b-4062-9e65-cecc117d4e50" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "8eccf172-291e-4de8-a80c-129838e97d87" + }, + { + "__type__": "cc.Node", + "_name": "Message", + "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 156 + } + ], + "_prefab": { + "__id__": 155 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 760, + "height": 38 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + -485, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "d5dc4628-2b1d-42d6-b2b5-bacc60152078" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "fee2f809-8c28-469a-a9fa-cff0d269c848", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 154 + }, + "_enabled": true, + "_materials": [], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "", + "_N$string": "", + "_fontSize": 23, + "_lineHeight": 30, + "_enableWrapText": false, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 2, + "_N$cacheMode": 0, + "_id": "59ce3cfb-88e7-40ce-b37d-b48a5028ec2c", + "_N$fontSize": 23, + "_N$enableWrapText": true, + "_fontFamily": "Arial" + } +] \ No newline at end of file diff --git a/assets/mini_program_benefits/prefab/BenefitsMain.prefab.meta b/assets/mini_program_benefits/prefab/BenefitsMain.prefab.meta new file mode 100644 index 00000000..bc4cda2a --- /dev/null +++ b/assets/mini_program_benefits/prefab/BenefitsMain.prefab.meta @@ -0,0 +1,9 @@ +{ + "ver": "1.3.2", + "uuid": "35246572-2373-43fe-9657-71199e7ec388", + "importer": "prefab", + "optimizationPolicy": "AUTO", + "asyncLoadAssets": false, + "readonly": false, + "subMetas": {} +} \ No newline at end of file diff --git a/assets/mini_program_benefits/prefab/BenefitsReward.prefab b/assets/mini_program_benefits/prefab/BenefitsReward.prefab new file mode 100644 index 00000000..197854a5 --- /dev/null +++ b/assets/mini_program_benefits/prefab/BenefitsReward.prefab @@ -0,0 +1,2182 @@ +[ + { + "__type__": "cc.Prefab", + "_name": "", + "_objFlags": 0, + "_native": "", + "data": { + "__id__": 1 + }, + "optimizationPolicy": 0, + "asyncLoadAssets": false, + "readonly": false + }, + { + "__type__": "cc.Node", + "_name": "BenefitsReward", + "_objFlags": 0, + "_parent": null, + "_children": [ + { + "__id__": 2 + }, + { + "__id__": 5 + } + ], + "_active": true, + "_components": [ + { + "__id__": 60 + } + ], + "_prefab": { + "__id__": 61 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 1080, + "height": 1920 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "Mask", + "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 3 + } + ], + "_prefab": { + "__id__": 4 + }, + "_opacity": 140, + "_color": { + "__type__": "cc.Color", + "r": 0, + "g": 0, + "b": 0, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 1080, + "height": 1920 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 2 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "01b3819b-d35e-4e1d-a37b-88ab4e33a15c" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "2dd64a1b-0203-4da2-a41c-651792d89241", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Board", + "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [ + { + "__id__": 6 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 59 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 680, + "height": 700 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "Rewards", + "_objFlags": 0, + "_parent": { + "__id__": 5 + }, + "_children": [ + { + "__id__": 7 + }, + { + "__id__": 24 + }, + { + "__id__": 41 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 58 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 0, + "height": 0 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "Item0", + "_objFlags": 0, + "_parent": { + "__id__": 6 + }, + "_children": [ + { + "__id__": 8 + }, + { + "__id__": 11 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 23 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 180, + "height": 210 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + -205, + 30, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "Icon", + "_objFlags": 0, + "_parent": { + "__id__": 7 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 9 + } + ], + "_prefab": { + "__id__": 10 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 119.58762886597938, + "height": 145 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 8 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "9f43f6b5-7793-4797-9b0d-ba17117898a9" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "b3537610-8a2b-4352-8d26-edac6be18cad", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Quantity", + "_objFlags": 0, + "_parent": { + "__id__": 7 + }, + "_children": [ + { + "__id__": 12 + }, + { + "__id__": 15 + }, + { + "__id__": 18 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 22 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 0, + "height": 0 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "Times", + "_objFlags": 0, + "_parent": { + "__id__": 11 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 13 + } + ], + "_prefab": { + "__id__": 14 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 31.96875, + "height": 33 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 18.920550544100806, + -67.5, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 12 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "26ab48f6-c12d-48be-90c7-e06d6a075945" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "c5595ca2-c9ab-4c3f-97da-8148c32f6e05", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "One", + "_objFlags": 0, + "_parent": { + "__id__": 11 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 16 + } + ], + "_prefab": { + "__id__": 17 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 40.888888888888886, + "height": 46 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 53.34936998854525, + -67.5, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 15 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "011c8cfa-9a31-4c2c-8e40-13d8ef5cba75" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "d1ff7162-a460-4c2f-a6d1-264da387519f", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Count", + "_objFlags": 0, + "_parent": { + "__id__": 11 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 19 + }, + { + "__id__": 20 + } + ], + "_prefab": { + "__id__": 21 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 90, + "height": 50 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 35.79381443298969, + -67.5, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 18 + }, + "_enabled": true, + "_materials": [], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "×2", + "_N$string": "×2", + "_fontSize": 36, + "_lineHeight": 43, + "_enableWrapText": false, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 2, + "_N$cacheMode": 0, + "_id": "" + }, + { + "__type__": "cc.LabelOutline", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 18 + }, + "_enabled": true, + "_color": { + "__type__": "cc.Color", + "r": 126, + "g": 75, + "b": 42, + "a": 255 + }, + "_width": 3, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "26f0f8f1-1a6a-446b-8030-913cea663a82", + "sync": false + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "e7834adc-91d9-4b53-be8c-a0b300f2286b", + "sync": false + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "73e9e059-74d9-409a-8989-ef70af872e6c", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Item1", + "_objFlags": 0, + "_parent": { + "__id__": 6 + }, + "_children": [ + { + "__id__": 25 + }, + { + "__id__": 28 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 40 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 180, + "height": 210 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 30, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "Icon", + "_objFlags": 0, + "_parent": { + "__id__": 24 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 26 + } + ], + "_prefab": { + "__id__": 27 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 139.03481012658227, + "height": 145 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 25 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "d2016222-467a-440f-9912-a45523322466" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "d2aeadd4-94f3-4adf-b218-8ce285927875", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Quantity", + "_objFlags": 0, + "_parent": { + "__id__": 24 + }, + "_children": [ + { + "__id__": 29 + }, + { + "__id__": 32 + }, + { + "__id__": 35 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 39 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 0, + "height": 0 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "Times", + "_objFlags": 0, + "_parent": { + "__id__": 28 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 30 + } + ], + "_prefab": { + "__id__": 31 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 31.96875, + "height": 33 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 28.64414117440225, + -67.5, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 29 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "26ab48f6-c12d-48be-90c7-e06d6a075945" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "6065e54c-1993-46f7-8b82-3103f42b9462", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "One", + "_objFlags": 0, + "_parent": { + "__id__": 28 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 33 + } + ], + "_prefab": { + "__id__": 34 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 40.888888888888886, + "height": 46 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 63.07296061884669, + -67.5, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 32 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "011c8cfa-9a31-4c2c-8e40-13d8ef5cba75" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "46cb016c-b43a-4224-9cce-508c34308f8e", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Count", + "_objFlags": 0, + "_parent": { + "__id__": 28 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 36 + }, + { + "__id__": 37 + } + ], + "_prefab": { + "__id__": 38 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 90, + "height": 50 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 45.517405063291136, + -67.5, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 35 + }, + "_enabled": true, + "_materials": [], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "×2", + "_N$string": "×2", + "_fontSize": 36, + "_lineHeight": 43, + "_enableWrapText": false, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 2, + "_N$cacheMode": 0, + "_id": "" + }, + { + "__type__": "cc.LabelOutline", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 35 + }, + "_enabled": true, + "_color": { + "__type__": "cc.Color", + "r": 126, + "g": 75, + "b": 42, + "a": 255 + }, + "_width": 3, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "bc7d450b-3345-4994-933c-35499a24faaa", + "sync": false + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "7e6184c2-cc41-43f8-a235-66b1b311cf2e", + "sync": false + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "5788558d-dd09-4f59-8c06-7431e7233f83", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Item2", + "_objFlags": 0, + "_parent": { + "__id__": 6 + }, + "_children": [ + { + "__id__": 42 + }, + { + "__id__": 45 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 57 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 180, + "height": 210 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 205, + 30, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "Icon", + "_objFlags": 0, + "_parent": { + "__id__": 41 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 43 + } + ], + "_prefab": { + "__id__": 44 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 138.16498316498317, + "height": 145 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 42 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "93a1c53b-7530-429e-a8dd-2e60e0ade38e" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": true, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "7de6d897-aa0d-4838-8670-028ded65daf0", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Quantity", + "_objFlags": 0, + "_parent": { + "__id__": 41 + }, + "_children": [ + { + "__id__": 46 + }, + { + "__id__": 49 + }, + { + "__id__": 52 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 56 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 0, + "height": 0 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "Times", + "_objFlags": 0, + "_parent": { + "__id__": 45 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 47 + } + ], + "_prefab": { + "__id__": 48 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 31.96875, + "height": 33 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 28.2092276936027, + -67.5, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 46 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "26ab48f6-c12d-48be-90c7-e06d6a075945" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "4996b723-6f27-49f3-b3f0-4857bad37272", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "One", + "_objFlags": 0, + "_parent": { + "__id__": 45 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 50 + } + ], + "_prefab": { + "__id__": 51 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 40.888888888888886, + "height": 46 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 62.63804713804714, + -67.5, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 49 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "011c8cfa-9a31-4c2c-8e40-13d8ef5cba75" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "b174f78d-ab25-4cf5-9a27-52e12bfcab5a", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Count", + "_objFlags": 0, + "_parent": { + "__id__": 45 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 53 + }, + { + "__id__": 54 + } + ], + "_prefab": { + "__id__": 55 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 90, + "height": 50 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 45.082491582491585, + -67.5, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 52 + }, + "_enabled": true, + "_materials": [], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "×2", + "_N$string": "×2", + "_fontSize": 36, + "_lineHeight": 43, + "_enableWrapText": false, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 2, + "_N$cacheMode": 0, + "_id": "" + }, + { + "__type__": "cc.LabelOutline", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 52 + }, + "_enabled": true, + "_color": { + "__type__": "cc.Color", + "r": 126, + "g": 75, + "b": 42, + "a": 255 + }, + "_width": 3, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "faa8bbdf-7076-4a50-b648-264a03100f33", + "sync": false + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "54aab2e5-ec94-4080-9c6e-29cabe0a5a9a", + "sync": false + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "f81f86e6-0e98-4466-a64b-0d5d42a7c9ce", + "sync": false + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "227c0081-e03c-459d-af13-46132a68a86a", + "sync": false + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "e3c30546-a4af-4970-b0d0-d03f23fd4071", + "sync": false + }, + { + "__type__": "cc.BlockInputEvents", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 1 + }, + "_enabled": true, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "", + "sync": false + } +] \ No newline at end of file diff --git a/assets/mini_program_benefits/prefab/BenefitsReward.prefab.meta b/assets/mini_program_benefits/prefab/BenefitsReward.prefab.meta new file mode 100644 index 00000000..09a64003 --- /dev/null +++ b/assets/mini_program_benefits/prefab/BenefitsReward.prefab.meta @@ -0,0 +1,9 @@ +{ + "ver": "1.3.2", + "uuid": "ed22cca6-aecf-4707-b134-729ac6799a1e", + "importer": "prefab", + "optimizationPolicy": "AUTO", + "asyncLoadAssets": false, + "readonly": false, + "subMetas": {} +} \ No newline at end of file diff --git a/assets/mini_program_benefits/prefab/BenefitsWindow.prefab b/assets/mini_program_benefits/prefab/BenefitsWindow.prefab new file mode 100644 index 00000000..6e8ed061 --- /dev/null +++ b/assets/mini_program_benefits/prefab/BenefitsWindow.prefab @@ -0,0 +1,382 @@ +[ + { + "__type__": "cc.Prefab", + "_name": "", + "_objFlags": 0, + "_native": "", + "data": { + "__id__": 1 + }, + "optimizationPolicy": 0, + "asyncLoadAssets": false, + "readonly": false + }, + { + "__type__": "cc.Node", + "_name": "MiniProgramBenefitsPanel", + "_objFlags": 0, + "_parent": null, + "_children": [ + { + "__id__": 3 + }, + { + "__id__": 7 + } + ], + "_active": true, + "_components": [ + { + "__id__": 11 + } + ], + "_prefab": { + "__id__": 2 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 1080, + "height": 1920 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "28aeb831-bb17-4cc7-ae35-0eff80a6705f" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "7f4d80d6-c5b5-4a16-8b88-ba1d67766552", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Mask", + "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 5 + }, + { + "__id__": 6 + } + ], + "_prefab": { + "__id__": 4 + }, + "_opacity": 140, + "_color": { + "__type__": "cc.Color", + "r": 0, + "g": 0, + "b": 0, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 1080, + "height": 1920 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "25ea0918-6ff1-47c8-83ba-260d8ef858da" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "74430445-4f98-400c-8bf9-0744b538bb9f", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 3 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "01b3819b-d35e-4e1d-a37b-88ab4e33a15c" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "3c9fe01e-3845-4fbf-a160-4e2e939b8c54" + }, + { + "__type__": "cc.BlockInputEvents", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 3 + }, + "_enabled": true, + "_id": "3ee656fe-fc70-4970-b94d-46f6aad93ec1" + }, + { + "__type__": "cc.Node", + "_name": "Motion", + "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [ + { + "__id__": 9 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 8 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 1080, + "height": 1920 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "2a90a50b-bbdb-4133-899f-11899b61f54c" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "6e52e663-f5c6-4474-949b-417fb36cb50f", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "Pages", + "_objFlags": 0, + "_parent": { + "__id__": 7 + }, + "_children": [], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 10 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 950, + "height": 1280 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "d24889d7-beb5-41a2-89a0-243f133757f8" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "1a00c0bc-1521-44d5-89d7-5f21c853b30e", + "sync": false + }, + { + "__type__": "5beddgtO2xJa7pgWeAnhNxK", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 1 + }, + "_enabled": true, + "_id": "7cd6fa76-57a8-48dc-b595-9164ce0339bb", + "mainPrefab": { + "__uuid__": "35246572-2373-43fe-9657-71199e7ec388" + }, + "favoritePrefab": { + "__uuid__": "53f2f7a7-d02a-4b8f-9e3b-a982e80e65b9" + }, + "desktopPrefab": { + "__uuid__": "18d25094-31fe-4576-be2a-36b8733c0b70" + }, + "rewardPrefab": { + "__uuid__": "ed22cca6-aecf-4707-b134-729ac6799a1e" + } + } +] \ No newline at end of file diff --git a/assets/mini_program_benefits/prefab/BenefitsWindow.prefab.meta b/assets/mini_program_benefits/prefab/BenefitsWindow.prefab.meta new file mode 100644 index 00000000..7c04dda6 --- /dev/null +++ b/assets/mini_program_benefits/prefab/BenefitsWindow.prefab.meta @@ -0,0 +1,9 @@ +{ + "ver": "1.3.2", + "uuid": "c98f228a-466e-41d0-921a-422ce8895712", + "importer": "prefab", + "optimizationPolicy": "AUTO", + "asyncLoadAssets": false, + "readonly": false, + "subMetas": {} +} \ No newline at end of file diff --git a/assets/mini_program_benefits/script.meta b/assets/mini_program_benefits/script.meta new file mode 100644 index 00000000..c66de1b4 --- /dev/null +++ b/assets/mini_program_benefits/script.meta @@ -0,0 +1,13 @@ +{ + "ver": "1.1.3", + "uuid": "ff630dbc-066b-4f2e-bb6f-9e26e5220577", + "importer": "folder", + "isBundle": false, + "bundleName": "", + "priority": 1, + "compressionType": {}, + "optimizeHotUpdate": {}, + "inlineSpriteFrames": {}, + "isRemoteBundle": {}, + "subMetas": {} +} \ No newline at end of file diff --git a/assets/mini_program_benefits/script/MiniProgramBenefitsPanel.ts b/assets/mini_program_benefits/script/MiniProgramBenefitsPanel.ts new file mode 100644 index 00000000..a038b30d --- /dev/null +++ b/assets/mini_program_benefits/script/MiniProgramBenefitsPanel.ts @@ -0,0 +1,183 @@ +import MiniProgramBenefitsReward from "./MiniProgramBenefitsReward"; +const { ccclass, property } = cc._decorator; +const TASKS = ["favorite_entry", "desktop_entry"]; + +/** Layout and artwork live in bundle prefabs. This component only binds state, events and motion. */ +@ccclass +export default class MiniProgramBenefitsPanel extends cc.Component { + @property(cc.Prefab) mainPrefab: cc.Prefab = null; + @property(cc.Prefab) favoritePrefab: cc.Prefab = null; + @property(cc.Prefab) desktopPrefab: cc.Prefab = null; + @property(cc.Prefab) rewardPrefab: cc.Prefab = null; + private host: any; + private motion: cc.Node; + private mask: cc.Node; + private pages: cc.Node; + private views: { [key: string]: cc.Node } = {}; + private page = "list"; + private message = ""; + private busy = false; + private claiming = false; + private closing = false; + private generation = 0; + private unsubscribe: () => void; + private cancelReward: () => void; + private shownReceipts = new Set(); + + init(host: any): void { + this.host = host; + host.bindRewardApi(new MiniProgramBenefitsReward(host.getRewardStorageKey(), host.getUid(), () => host.getState())); + const canvas = cc.find("Canvas"); + this.node.setContentSize(canvas ? canvas.getContentSize() : cc.view.getVisibleSize()); + this.mask = this.node.getChildByName("Mask"); + this.mask.setContentSize(this.node.getContentSize()); + this.motion = this.node.getChildByName("Motion"); this.pages = this.motion.getChildByName("Pages"); + [this.mainPrefab, this.favoritePrefab, this.desktopPrefab].forEach((prefab, index) => { + if (!prefab) throw new Error("福利页面预制体缺失"); + const key = index === 0 ? "list" : TASKS[index - 1]; + const view = this.views[key] = cc.instantiate(prefab); view.parent = this.pages; + const content = view.getChildByName("Content") || view; + content.getChildByName("Close").on(cc.Node.EventType.TOUCH_END, () => { + if (this.closing || this.busy) return; + if (key === "list") this.closeWithAnimation(); + else { this.page = "list"; this.message = ""; this.render(); } + }); + if (key === "list") TASKS.forEach((task, i) => { + const row = view.getChildByName("Task" + i); + row.getChildByName("View").on(cc.Node.EventType.TOUCH_END, () => { + if (this.busy || this.closing) return; + this.page = task; this.message = ""; this.render(); + }); + row.getChildByName("Claim").on(cc.Node.EventType.TOUCH_END, () => this.claim(task)); + }); + }); + this.unsubscribe = host.subscribe(() => { if (!this.busy) this.render(); }); + this.render(); this.refresh(); this.playOpenAnimation(); + } + private playOpenAnimation(): void { + this.motion.scale = 0.86; + cc.tween(this.motion).to(0.20, { scale: 1.035 }, { easing: "quadOut" }) + .to(0.12, { scale: 1 }, { easing: "sineOut" }).start(); + } + private closeWithAnimation(): void { + if (this.closing || this.claiming) return; + this.closing = true; + cc.Tween.stopAllByTarget(this.motion); + cc.Tween.stopAllByTarget(this.mask); + cc.tween(this.motion) + .to(0.15, { scale: 0.90 }, { easing: "sineIn" }) + .call(() => { + if (cc.isValid(this.node, true) && this.host) this.host.close(); + }) + .start(); + } + + private alive(token: number): boolean { return cc.isValid(this.node, true) && this.generation === token; } + private async refresh(): Promise { + const token = this.generation; + this.busy = true; this.message = "正在查询福利…"; this.render(); + try { + await this.host.refresh(); + if (!this.alive(token)) return; + this.message = ""; + await this.showPendingReceipt(); + } catch (error) { + if (this.alive(token)) this.message = error && error.message || "查询失败,请点击刷新重试"; + } finally { + if (this.alive(token)) { this.busy = false; this.render(); } + } + } + private async showPendingReceipt(): Promise { + const token = this.generation; + const state = this.host.getState(); + const pending = TASKS.filter(task => state[task] && state[task].claimedAt && !state[task].acknowledged) + .map(task => ({ task, id: state[task].receiptId })); + const unseen = pending.filter(receipt => !this.shownReceipts.has(receipt.id)); + this.page = "list"; + if (unseen.length) { + await this.showRewardAnimation(unseen.length); + if (!this.alive(token)) return; + unseen.forEach(receipt => this.shownReceipts.add(receipt.id)); + } + for (const receipt of pending) { + if (!this.alive(token)) return; + await this.host.acknowledge(receipt.task, receipt.id); + } + } + + + private render(): void { + if (this.closing || !this.pages) return; + Object.keys(this.views).forEach(key => { + const view = this.views[key]; view.active = key === this.page; + if (!view.active) return; + // Keep editor-authored local positions and sizes; only fit the complete page to the screen. + view.scale = Math.min(1.45, (this.node.width - 64) / view.width, (this.node.height - 70) / view.height); + const content = view.getChildByName("Content") || view; + content.getChildByName("Message").getComponent(cc.Label).string = this.message; + }); + const state = this.host.getState(); + TASKS.forEach((task, index) => { + const item = state[task] || {}, row = this.views.list.getChildByName("Task" + index); + row.getChildByName("View").active = !item.claimedAt && !item.eligibleAt; + row.getChildByName("Claim").active = !item.claimedAt && !!item.eligibleAt; + row.getChildByName("Claimed").active = !!item.claimedAt; + }); + } + private showRewardAnimation(count: number): Promise { + return new Promise((resolve, reject) => { + if (!this.rewardPrefab) { reject(new Error("领取展示预制体缺失")); return; } + const overlay = cc.instantiate(this.rewardPrefab); overlay.parent = this.node; overlay.zIndex = 4000; + overlay.setContentSize(this.node.getContentSize()); + overlay.getChildByName("Mask").setContentSize(overlay.getContentSize()); + const board = overlay.getChildByName("Board"); + board.scale = Math.min(1.4, (overlay.width - 40) / board.width, (overlay.height - 40) / board.height); + const animated: cc.Node[] = [overlay]; let ready = false, finished = false; + const finish = (cancelled: boolean) => { + if (finished) return; finished = true; this.cancelReward = null; + animated.forEach(node => cc.Tween.stopAllByTarget(node)); + overlay.active = false; overlay.destroy(); + if (cancelled) reject(new Error("领取展示已关闭,请重新打开福利查看")); else resolve(); + }; + this.cancelReward = () => finish(true); + overlay.on(cc.Node.EventType.TOUCH_END, () => { if (ready) finish(false); }); + const rewards = board.getChildByName("Rewards"); + [0, 1, 2].forEach(index => { + const item = rewards.getChildByName("Item" + index), badge = item.getChildByName("Quantity"); + badge.getChildByName("Times").active = count === 1; + badge.getChildByName("One").active = count === 1; + const number = badge.getChildByName("Count"); number.active = count !== 1; + number.getComponent(cc.Label).string = "×" + count; + const scale = item.scale; animated.push(item, badge); item.scale = 0; + cc.tween(item).delay(0.12 + index * 0.13).to(0.22, { scale: scale * 1.12 }, { easing: "quadOut" }) + .to(0.12, { scale }, { easing: "sineOut" }).start(); + }); + cc.tween(overlay).delay(1.08).call(() => { ready = true; }).start(); + }); + } + private async claim(task: string): Promise { + if (this.closing || this.busy || this.claiming) return; + const token = this.generation; + this.claiming = true; this.busy = true; this.message = "正在领取…"; this.render(); + try { + await this.host.claim(task); + if (!this.alive(token)) return; + this.message = ""; + await this.showPendingReceipt(); + } catch (error) { + if (this.alive(token)) this.message = error && error.message || "领取结果待确认,请刷新状态"; + } finally { + if (this.alive(token)) { this.claiming = false; this.busy = false; this.render(); } + } + } + + + onDestroy(): void { + this.generation++; if (this.cancelReward) this.cancelReward(); + if (this.motion) cc.Tween.stopAllByTarget(this.motion); + if (this.mask) cc.Tween.stopAllByTarget(this.mask); + if (this.unsubscribe) this.unsubscribe(); + if (this.host) this.host.onPanelDestroyed(this.node); + this.unsubscribe = null; this.host = null; this.views = {}; this.shownReceipts.clear(); + } +} diff --git a/assets/mini_program_benefits/script/MiniProgramBenefitsPanel.ts.meta b/assets/mini_program_benefits/script/MiniProgramBenefitsPanel.ts.meta new file mode 100644 index 00000000..60d6ea61 --- /dev/null +++ b/assets/mini_program_benefits/script/MiniProgramBenefitsPanel.ts.meta @@ -0,0 +1,10 @@ +{ + "ver": "1.1.0", + "uuid": "5bedd82d-3b6c-496b-ba60-59e02784dc4a", + "importer": "typescript", + "isPlugin": false, + "loadPluginInWeb": true, + "loadPluginInNative": true, + "loadPluginInEditor": false, + "subMetas": {} +} \ No newline at end of file diff --git a/assets/mini_program_benefits/script/MiniProgramBenefitsReward.ts b/assets/mini_program_benefits/script/MiniProgramBenefitsReward.ts new file mode 100644 index 00000000..ac7faf60 --- /dev/null +++ b/assets/mini_program_benefits/script/MiniProgramBenefitsReward.ts @@ -0,0 +1,108 @@ +import Utils from "../../Script/module/Pay/Utils"; + +const TYPES = { favorite_entry: "favorite", desktop_entry: "desktop" }; + +/** Server authorizes each task once; the client grants the fixed reward and syncs totals. */ +export default class MiniProgramBenefitsReward { + private static queues: { [key: string]: Promise } = {}; + constructor(private storageKey: string, private uid: string, private getState: () => any) { } + + request(action: string, params: any = {}, level = 0): Promise { + const previous = MiniProgramBenefitsReward.queues[this.storageKey] || Promise.resolve(); + const result = previous.catch(() => {}).then(() => this.run(action, params, level)); + const settled = result.then(() => {}, () => {}); + MiniProgramBenefitsReward.queues[this.storageKey] = settled; + settled.then(() => { + if (MiniProgramBenefitsReward.queues[this.storageKey] === settled) delete MiniProgramBenefitsReward.queues[this.storageKey]; + }); + return result; + } + + private assertAccount(): void { + if (!this.uid || String(cc.fx.GameConfig.GM_INFO.uid) !== this.uid) throw new Error("账号已切换,请重新打开福利"); + } + + private async run(action: string, params: any, level: number): Promise { + this.assertAccount(); + if (!["read", "claim", "ack"].includes(action)) throw new Error("真实奖励不支持模拟或重置"); + if (action !== "read" && !Object.prototype.hasOwnProperty.call(TYPES, params.task)) throw new Error("未知福利任务"); + const state = this.getState(); + // Finish an authorized delivery before starting another one. + for (const task of Object.keys(state)) { + if (state[task].deliveryPending) await this.deliver(task, state[task]); + } + if (action === "claim") { + const item = state[params.task] || {}; + if (!item.claimedAt) { + if (level < 1) throw new Error("通过第 1 关后才能领取"); + if (!item.eligibleAt) throw new Error("请从对应入口进入后领取"); + // Missing login contract must not silently turn into an unclaimed account. + const info: any = cc.fx.GameConfig.GM_INFO; + const flags = info.miniProgramWelfare; + if (!flags || typeof flags.favorite !== "boolean" || typeof flags.desktop !== "boolean") { + throw new Error("福利状态未同步,请重新登录后重试"); + } + const type = TYPES[params.task]; + this.totals(); + await this.post("miniProgramWelfare", { uid: this.uid, type }); + this.assertAccount(); + // Authorization is consumed even if the following inventory save fails. + info.miniProgramWelfare = { ...flags, [type]: true }; + state[params.task] = { ...item, claimedAt: Date.now(), receiptId: "welfare:" + this.uid + ":" + type, acknowledged: false, deliveryPending: true }; + await this.deliver(params.task, state[params.task]); + } + } else if (action === "ack") { + const item = state[params.task]; + if (!item || !item.claimedAt || item.receiptId !== params.receiptId) throw new Error("领奖回执不匹配"); + item.acknowledged = true; + } + return { state, rewards: [2001, 2002, 2003].map(id => ({ id, amount: 1 })) }; + } + + private totals(): any { + const values: any = {}; + ["freezeAmount", "hammerAmount", "magicAmount"].forEach(key => { + const value = cc.fx.GameConfig.GM_INFO[key]; + if (typeof value !== "number" || !Number.isSafeInteger(value) || value < 0 || value >= Number.MAX_SAFE_INTEGER) throw new Error("道具数据尚未准备好,请稍后重试"); + values[key] = value; + }); + return values; + } + + private async deliver(task: string, item: any): Promise { + this.assertAccount(); + const prop = cc.fx.StorageMessage.getStorage("prop") || {}; + const credits = { ...(prop.welfareCredits || {}) }; + if (!credits[item.receiptId]) { + const values = this.totals(); + Object.keys(values).forEach(key => values[key] += 1); + credits[item.receiptId] = true; + cc.fx.StorageMessage.setStorage("prop", { ...prop, ...values, welfareCredits: credits, timestamp: Date.now() }); + const saved = cc.fx.StorageMessage.getStorage("prop"); + if (!saved || !saved.welfareCredits || !saved.welfareCredits[item.receiptId]) throw new Error("奖励保存失败,请重新打开福利重试"); + Object.assign(cc.fx.GameConfig.GM_INFO, values); + } + // A retry only uploads current totals; it never adds the fixed reward twice. + const totals = this.totals(); + await this.post("userProp", { uid: this.uid, action: "save", propType: 0, + propData: JSON.stringify({ freeze: totals.freezeAmount, hammer: totals.hammerAmount, magic_wand: totals.magicAmount }) }); + this.assertAccount(); + item.deliveryPending = false; + } + + private post(endpoint: string, params: any): Promise { + return new Promise((resolve, reject) => { + let completed = false; + const finish = (response: any) => { + if (completed) return; + completed = true; clearTimeout(timeout); + try { this.assertAccount(); } catch (error) { reject(error); return; } + if (response && response.code === 1) resolve(response); + else reject(new Error(response && response.msg || "请求失败;如已扣发奖励,请重新登录确认领取状态")); + }; + const timeout = setTimeout(() => finish({ msg: "领取结果待确认,请重新登录同步状态" }), 5500); + try { Utils.POST(endpoint, params, finish); } + catch (error) { finish({ msg: error && error.message }); } + }); + } +} diff --git a/assets/mini_program_benefits/script/MiniProgramBenefitsReward.ts.meta b/assets/mini_program_benefits/script/MiniProgramBenefitsReward.ts.meta new file mode 100644 index 00000000..cd7a5362 --- /dev/null +++ b/assets/mini_program_benefits/script/MiniProgramBenefitsReward.ts.meta @@ -0,0 +1,10 @@ +{ + "ver": "1.1.0", + "uuid": "3b75cd91-1669-4eea-971a-a87cf1421c90", + "importer": "typescript", + "isPlugin": false, + "loadPluginInWeb": true, + "loadPluginInNative": true, + "loadPluginInEditor": false, + "subMetas": {} +} \ No newline at end of file diff --git a/assets/mini_program_benefits/test.meta b/assets/mini_program_benefits/test.meta new file mode 100644 index 00000000..af379d33 --- /dev/null +++ b/assets/mini_program_benefits/test.meta @@ -0,0 +1,13 @@ +{ + "ver": "1.1.3", + "uuid": "2d2cb45e-c8ca-438a-9086-11de775ce4da", + "importer": "folder", + "isBundle": false, + "bundleName": "", + "priority": 1, + "compressionType": {}, + "optimizeHotUpdate": {}, + "inlineSpriteFrames": {}, + "isRemoteBundle": {}, + "subMetas": {} +} \ No newline at end of file diff --git a/assets/mini_program_benefits/test/BenefitsRuntimeTest.prefab b/assets/mini_program_benefits/test/BenefitsRuntimeTest.prefab new file mode 100644 index 00000000..c06da00f --- /dev/null +++ b/assets/mini_program_benefits/test/BenefitsRuntimeTest.prefab @@ -0,0 +1,1467 @@ +[ + { + "__type__": "cc.Prefab", + "_name": "", + "_objFlags": 0, + "_native": "", + "data": { + "__id__": 1 + }, + "optimizationPolicy": 0, + "asyncLoadAssets": false, + "readonly": false + }, + { + "__type__": "cc.Node", + "_name": "BenefitsRuntimeTest", + "_objFlags": 0, + "_parent": null, + "_children": [ + { + "__id__": 4 + }, + { + "__id__": 8 + } + ], + "_active": true, + "_components": [ + { + "__id__": 3 + } + ], + "_prefab": { + "__id__": 2 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 1080, + "height": 1920 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "7ca97b5bbbc24dbab2e1aa", + "sync": false + }, + { + "__type__": "cc.Widget", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 1 + }, + "_enabled": true, + "_id": "0a5XlUuGZCprz0fwaiG835", + "alignMode": 1, + "_target": null, + "_alignFlags": 45, + "_left": 0, + "_right": 0, + "_top": 0, + "_bottom": 0, + "_verticalCenter": 0, + "_horizontalCenter": 0, + "_isAbsLeft": true, + "_isAbsRight": true, + "_isAbsTop": true, + "_isAbsBottom": true, + "_isAbsHorizontalCenter": true, + "_isAbsVerticalCenter": true, + "_originalWidth": 1080, + "_originalHeight": 10000 + }, + { + "__type__": "cc.Node", + "_name": "entry", + "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 6 + }, + { + "__id__": 7 + } + ], + "_prefab": { + "__id__": 5 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 160, + "height": 64 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 420, + 620, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "22c732bc24344f7d989298", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 4 + }, + "_enabled": true, + "_id": "", + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "福利测试", + "_N$string": "福利测试", + "_fontSize": 26, + "_lineHeight": 35, + "_enableWrapText": true, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 1, + "_N$cacheMode": 0 + }, + { + "__type__": "cc.Widget", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 4 + }, + "_enabled": true, + "_id": "0a5XlUuGZCprz0fwaiG835", + "alignMode": 1, + "_target": null, + "_alignFlags": 33, + "_left": 0, + "_right": 25, + "_top": 180, + "_bottom": 0, + "_verticalCenter": 0, + "_horizontalCenter": 0, + "_isAbsLeft": true, + "_isAbsRight": true, + "_isAbsTop": true, + "_isAbsBottom": true, + "_isAbsHorizontalCenter": true, + "_isAbsVerticalCenter": true, + "_originalWidth": 1080, + "_originalHeight": 10000 + }, + { + "__type__": "cc.Node", + "_name": "panel", + "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [ + { + "__id__": 11 + }, + { + "__id__": 14 + }, + { + "__id__": 17 + }, + { + "__id__": 20 + }, + { + "__id__": 23 + }, + { + "__id__": 26 + }, + { + "__id__": 29 + }, + { + "__id__": 32 + }, + { + "__id__": 39 + } + ], + "_active": false, + "_components": [ + { + "__id__": 10 + } + ], + "_prefab": { + "__id__": 9 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 1000, + "height": 1400 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "f80601a50a6c4875a2ea35", + "sync": false + }, + { + "__type__": "cc.BlockInputEvents", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 8 + }, + "_enabled": true, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "title", + "_objFlags": 0, + "_parent": { + "__id__": 8 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 13 + } + ], + "_prefab": { + "__id__": 12 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 800, + "height": 60 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 640, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "21405b02d9bb42119ad723", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 11 + }, + "_enabled": true, + "_id": "", + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "小程序福利 · 测试面板", + "_N$string": "小程序福利 · 测试面板", + "_fontSize": 32, + "_lineHeight": 41, + "_enableWrapText": true, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 1, + "_N$cacheMode": 0 + }, + { + "__type__": "cc.Node", + "_name": "close", + "_objFlags": 0, + "_parent": { + "__id__": 8 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 16 + } + ], + "_prefab": { + "__id__": 15 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 140, + "height": 60 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 410, + 640, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "db25837270dc4c06b6fffc", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 14 + }, + "_enabled": true, + "_id": "", + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "关闭", + "_N$string": "关闭", + "_fontSize": 28, + "_lineHeight": 37, + "_enableWrapText": true, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 1, + "_N$cacheMode": 0 + }, + { + "__type__": "cc.Node", + "_name": "query", + "_objFlags": 0, + "_parent": { + "__id__": 8 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 19 + } + ], + "_prefab": { + "__id__": 18 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 220, + "height": 64 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + -330, + 560, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "7eb65395f86f4521af85d3", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 17 + }, + "_enabled": true, + "_id": "", + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "打开福利", + "_N$string": "打开福利", + "_fontSize": 28, + "_lineHeight": 37, + "_enableWrapText": true, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 1, + "_N$cacheMode": 0 + }, + { + "__type__": "cc.Node", + "_name": "clearClaim", + "_objFlags": 0, + "_parent": { + "__id__": 8 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 22 + } + ], + "_prefab": { + "__id__": 21 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 220, + "height": 64 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + -110, + 560, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "409ffb232ae74a039bf513", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 20 + }, + "_enabled": true, + "_id": "", + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "模拟收藏入口", + "_N$string": "模拟收藏入口", + "_fontSize": 28, + "_lineHeight": 37, + "_enableWrapText": true, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 1, + "_N$cacheMode": 0 + }, + { + "__type__": "cc.Node", + "_name": "clearAuto", + "_objFlags": 0, + "_parent": { + "__id__": 8 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 25 + } + ], + "_prefab": { + "__id__": 24 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 220, + "height": 64 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 110, + 560, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "2ab695c9b5ad4ecd9c3a7a", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 23 + }, + "_enabled": true, + "_id": "", + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "模拟桌面入口", + "_N$string": "模拟桌面入口", + "_fontSize": 28, + "_lineHeight": 37, + "_enableWrapText": true, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 1, + "_N$cacheMode": 0 + }, + { + "__type__": "cc.Node", + "_name": "recheck", + "_objFlags": 0, + "_parent": { + "__id__": 8 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 28 + } + ], + "_prefab": { + "__id__": 27 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 220, + "height": 64 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 330, + 560, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "6553c815e49a4ba699843f", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 26 + }, + "_enabled": true, + "_id": "", + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "清本地资格", + "_N$string": "清本地资格", + "_fontSize": 24, + "_lineHeight": 33, + "_enableWrapText": true, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 1, + "_N$cacheMode": 0 + }, + { + "__type__": "cc.Node", + "_name": "notice", + "_objFlags": 0, + "_parent": { + "__id__": 8 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 31 + } + ], + "_prefab": { + "__id__": 30 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 930, + "height": 50 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 410, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "e02108dda30f45d492f7e4", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 29 + }, + "_enabled": true, + "_id": "", + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "仅独立测试服 · 领取影响测试账号 · 不重置服务端记录", + "_N$string": "仅独立测试服 · 领取影响测试账号 · 不重置服务端记录", + "_fontSize": 24, + "_lineHeight": 33, + "_enableWrapText": true, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 1, + "_N$cacheMode": 0 + }, + { + "__type__": "cc.Node", + "_name": "viewport", + "_objFlags": 0, + "_parent": { + "__id__": 8 + }, + "_children": [ + { + "__id__": 35 + } + ], + "_active": true, + "_components": [ + { + "__id__": 34 + }, + { + "__id__": 38 + } + ], + "_prefab": { + "__id__": 33 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 920, + "height": 1000 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + -120, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "0a8eb381e3d64d9d8d665a", + "sync": false + }, + { + "__type__": "cc.Mask", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 32 + }, + "_enabled": true, + "_id": "", + "_type": 0, + "_segments": 64, + "_N$alphaThreshold": 0.1, + "_N$inverted": false, + "_spriteFrame": null + }, + { + "__type__": "cc.Node", + "_name": "content", + "_objFlags": 0, + "_parent": { + "__id__": 32 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 37 + } + ], + "_prefab": { + "__id__": 36 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 900, + "height": 1080 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 1 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 500, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "38e85521dde94c058f4951", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 35 + }, + "_enabled": true, + "_id": "", + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "点击查询接口查看状态", + "_N$string": "点击查询接口查看状态", + "_fontSize": 24, + "_lineHeight": 33, + "_enableWrapText": true, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 0, + "_N$verticalAlign": 0, + "_N$fontFamily": "Arial", + "_N$overflow": 3, + "_N$cacheMode": 0 + }, + { + "__type__": "cc.ScrollView", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 32 + }, + "_enabled": true, + "_id": "2a8hyyK7lCELB7KL3Sr3ZQ", + "horizontal": false, + "vertical": true, + "inertia": true, + "brake": 0.75, + "elastic": false, + "bounceDuration": 0.23, + "scrollEvents": [], + "cancelInnerEvents": true, + "_N$content": { + "__id__": 35 + }, + "content": { + "__id__": 35 + }, + "_N$horizontalScrollBar": null, + "_N$verticalScrollBar": null + }, + { + "__type__": "cc.Node", + "_name": "clearLocalClaims", + "_objFlags": 0, + "_parent": { + "__id__": 8 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 41 + } + ], + "_prefab": { + "__id__": 40 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 400, + "height": 64 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 480, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "d4cafc0b-87fa-4a4e-b968-4ff35ea3c2d4" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "5c59b70d-fc1e-481d-8ded-8ae35e52500a", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 39 + }, + "_enabled": true, + "_id": "41a0190a-839d-49a3-91f3-52fe136e4a9d", + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "清本地领取缓存", + "_N$string": "清本地资格", + "_fontSize": 24, + "_lineHeight": 33, + "_enableWrapText": true, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 1, + "_N$cacheMode": 0 + } +] diff --git a/assets/mini_program_benefits/test/BenefitsRuntimeTest.prefab.meta b/assets/mini_program_benefits/test/BenefitsRuntimeTest.prefab.meta new file mode 100644 index 00000000..09934ff1 --- /dev/null +++ b/assets/mini_program_benefits/test/BenefitsRuntimeTest.prefab.meta @@ -0,0 +1,9 @@ +{ + "ver": "1.3.2", + "uuid": "b1389518-e0ad-423b-a85f-c116ab39080d", + "importer": "prefab", + "optimizationPolicy": "AUTO", + "asyncLoadAssets": false, + "readonly": false, + "subMetas": {} +} \ No newline at end of file diff --git a/assets/mini_program_benefits/test/BenefitsRuntimeTest.ts b/assets/mini_program_benefits/test/BenefitsRuntimeTest.ts new file mode 100644 index 00000000..04ea5dfa --- /dev/null +++ b/assets/mini_program_benefits/test/BenefitsRuntimeTest.ts @@ -0,0 +1,90 @@ +const { ccclass } = cc._decorator; + +/** 首页真实流程诊断;可清理测试账号的本地资格和领取缓存。 */ +@ccclass +export default class BenefitsRuntimeTest extends cc.Component { + private bridge: any; + private panel: cc.Node; + private output: cc.Label; + private unsubscribe: () => void; + private entry: cc.Node; + private rank: cc.Node; + private message = "选择入口资格后打开福利,手动测试领取。"; + + initialize(bridge: any): void { this.bridge = bridge; } + onLoad(): void { + if (!this.bridge || !this.bridge.getTestEnvironment().allowed) { this.node.destroy(); return; } + const size = this.node.parent.getContentSize(); + this.node.scale = Math.min(1, size.width / 1080, size.height / 1920); + this.entry = this.node.getChildByName("entry"); + this.entry.setContentSize(200, 88); + this.rank = cc.find("Load/Top/rank", this.node.parent); + this.lateUpdate(); + this.panel = this.node.getChildByName("panel"); + const background = this.panel.addComponent(cc.Graphics); + background.fillColor = cc.color(25, 30, 42, 245); + background.roundRect(-500, -700, 1000, 1400, 18); background.fill(); + this.output = this.panel.getChildByName("viewport").getChildByName("content").getComponent(cc.Label); + this.bind(this.node.getChildByName("entry"), () => { this.panel.active = true; this.render(); }); + this.bind(this.panel.getChildByName("close"), () => this.panel.active = false); + this.bind(this.panel.getChildByName("query"), () => { + if (!this.bridge.getUid()) throw new Error("请等待登录完成"); + if (Number(this.bridge.getTestSnapshot().level) < 1) throw new Error("请先通过第 1 关"); + this.panel.active = false; + this.bridge.open(); + }); + this.bind(this.panel.getChildByName("clearClaim"), () => this.setEligibility("favorite_entry")); + this.bind(this.panel.getChildByName("clearAuto"), () => this.setEligibility("desktop_entry")); + this.bind(this.panel.getChildByName("recheck"), () => this.setEligibility()); + this.bind(this.panel.getChildByName("clearLocalClaims"), () => { + this.bridge.clearTestClaimCache(); + this.message = "已清本地领取缓存,道具数量不变。重新领奖需后台重置领取标记后重新登录。"; + this.render(); + }); + this.unsubscribe = this.bridge.subscribe(() => { if (this.panel.active) this.render(); }); + } + lateUpdate(): void { + if (!this.entry || !this.rank || !cc.isValid(this.rank, true)) return; + // Follow the actual ranking button after Widgets/layout have moved the home bar. + const left = this.rank.convertToWorldSpaceAR(cc.v2(-this.rank.width * this.rank.anchorX, 0)); + const position = this.node.convertToNodeSpaceAR(left); + this.entry.setPosition(position.x - this.entry.width / 2 - 24, position.y); + } + private bind(node: cc.Node, action: () => void): void { + node.on(cc.Node.EventType.TOUCH_END, (event: cc.Event) => { + event.stopPropagation(); + if (!this.bridge.getTestEnvironment().allowed) { this.node.active = false; return; } + try { action(); } + catch (error) { this.message = error && error.message || "操作失败"; this.render(); } + }, this); + } + private setEligibility(task?: string): void { + this.bridge.setTestEligibility(task); + this.message = task ? "已模拟本地入口资格;点击“打开福利”手动领取。" : "已清除当前账号的两项本地入口资格。"; + this.render(); + } + private render(): void { + const s = this.bridge.getTestSnapshot(); + const describe = (id: string) => { + const item = s.state[id] || {}; + return item.claimedAt ? (item.deliveryPending ? "已确认 / 道具同步待重试" : "已领取") : item.eligibleAt ? "可领取(仍需通过首关)" : "未获得入口资格"; + }; + this.output.string = [this.message, + "环境:" + s.environment.version + "\n地址:" + s.environment.baseUrl, + "UID:" + (s.uid || "未登录") + "\n关卡:" + s.level, + "我的小程序(1104):" + describe("favorite_entry"), + "桌面入口(1023):" + describe("desktop_entry"), + "首页入口:" + (s.entryVisible ? "显示" : "隐藏") + " / 红点:" + (s.redDot ? "亮" : "灭"), + "福利弹窗:" + (s.panelBusy ? "打开或加载/释放中" : "已关闭"), + "登录返回 miniProgramWelfare:\n" + JSON.stringify(s.loginWelfare || null, null, 2), + "本地资格:\n" + JSON.stringify(s.eligibility, null, 2), + "当前领取状态:\n" + JSON.stringify(s.state, null, 2), + "最近入口记录(模拟按钮不伪造微信记录):\n" + JSON.stringify(s.diagnostics, null, 2), + "领取会调用测试服 miniProgramWelfare 和 userProp,影响测试账号道具。\n清资格不会重置服务端已领取状态;重复测试领奖请换测试账号或由后端重置。\n此处展示当前登录快照,不额外请求领奖接口。" + ].join("\n\n"); + this.scheduleOnce(() => { + if (cc.isValid(this.node, true)) this.panel.getChildByName("viewport").getComponent(cc.ScrollView).scrollToTop(0); + }, 0); + } + onDestroy(): void { if (this.unsubscribe) this.unsubscribe(); } +} diff --git a/assets/mini_program_benefits/test/BenefitsRuntimeTest.ts.meta b/assets/mini_program_benefits/test/BenefitsRuntimeTest.ts.meta new file mode 100644 index 00000000..832d8cdd --- /dev/null +++ b/assets/mini_program_benefits/test/BenefitsRuntimeTest.ts.meta @@ -0,0 +1,10 @@ +{ + "ver": "1.1.0", + "uuid": "8863c6ad-bd36-4784-a03a-a86446697f2d", + "importer": "typescript", + "isPlugin": false, + "loadPluginInWeb": true, + "loadPluginInNative": true, + "loadPluginInEditor": false, + "subMetas": {} +} \ No newline at end of file diff --git a/assets/mini_program_benefits/test/README.md b/assets/mini_program_benefits/test/README.md new file mode 100644 index 00000000..47a46624 --- /dev/null +++ b/assets/mini_program_benefits/test/README.md @@ -0,0 +1,10 @@ +# 福利测试面板 + +更新日期:2026-09-18。 + +本目录是普通目录,与父目录 mini_program_benefits 共用活动分包,没有独立分包注册。保留白字入口和测试面板实现,但当前挂载调用已注释、prefab entry 已关闭,各环境均不自动显示。恢复时须同时启用两处,并满足独立测试服门禁;正式版仍不显示。 + +- [操作、字段和验收步骤](../docs/mini-program-benefits-testing.md) +- [活动总览](../README.md) + +面板动态挂载组件;位置由代码跟随排行榜。独立场景、Mock 和旧重置按钮已移除。 diff --git a/assets/mini_program_benefits/test/README.md.meta b/assets/mini_program_benefits/test/README.md.meta new file mode 100644 index 00000000..80fd3fce --- /dev/null +++ b/assets/mini_program_benefits/test/README.md.meta @@ -0,0 +1,6 @@ +{ + "ver": "2.0.2", + "uuid": "d3198d0e-c7fc-4446-9e1d-81abbcf1bded", + "importer": "text", + "subMetas": {} +} \ No newline at end of file diff --git a/assets/pause/texture.meta b/assets/mini_program_benefits/texture.meta similarity index 81% rename from assets/pause/texture.meta rename to assets/mini_program_benefits/texture.meta index 8c745268..8e29cef9 100644 --- a/assets/pause/texture.meta +++ b/assets/mini_program_benefits/texture.meta @@ -1,6 +1,6 @@ { "ver": "1.1.3", - "uuid": "01f08362-9057-410e-bafd-82f453df7c93", + "uuid": "e9c190bb-fa97-4c63-aeb2-e5c9dddc56d3", "importer": "folder", "isBundle": false, "bundleName": "", diff --git a/assets/mini_program_benefits/texture/claim.png b/assets/mini_program_benefits/texture/claim.png new file mode 100644 index 00000000..8082c67e Binary files /dev/null and b/assets/mini_program_benefits/texture/claim.png differ diff --git a/assets/mini_program_benefits/texture/claim.png.meta b/assets/mini_program_benefits/texture/claim.png.meta new file mode 100644 index 00000000..dd24faae --- /dev/null +++ b/assets/mini_program_benefits/texture/claim.png.meta @@ -0,0 +1,38 @@ +{ + "ver": "2.3.7", + "uuid": "ce30001a-f22b-4148-8216-b94a6396e887", + "importer": "texture", + "type": "sprite", + "wrapMode": "clamp", + "filterMode": "bilinear", + "premultiplyAlpha": false, + "genMipmaps": false, + "packable": false, + "width": 198, + "height": 94, + "platformSettings": {}, + "subMetas": { + "claim": { + "ver": "1.0.6", + "uuid": "f55f5c8c-5140-4ce2-8b7c-52c8cf519714", + "importer": "sprite-frame", + "rawTextureUuid": "ce30001a-f22b-4148-8216-b94a6396e887", + "trimType": "custom", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "width": 198, + "height": 94, + "rawWidth": 198, + "rawHeight": 94, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/assets/mini_program_benefits/texture/close.png b/assets/mini_program_benefits/texture/close.png new file mode 100644 index 00000000..3892af4f Binary files /dev/null and b/assets/mini_program_benefits/texture/close.png differ diff --git a/assets/mini_program_benefits/texture/close.png.meta b/assets/mini_program_benefits/texture/close.png.meta new file mode 100644 index 00000000..72dc8634 --- /dev/null +++ b/assets/mini_program_benefits/texture/close.png.meta @@ -0,0 +1,38 @@ +{ + "ver": "2.3.7", + "uuid": "e743086f-8c48-4c72-bb7c-78f72fc0fe45", + "importer": "texture", + "type": "sprite", + "wrapMode": "clamp", + "filterMode": "bilinear", + "premultiplyAlpha": false, + "genMipmaps": false, + "packable": false, + "width": 103, + "height": 112, + "platformSettings": {}, + "subMetas": { + "close": { + "ver": "1.0.6", + "uuid": "67398214-36f6-46c1-a5e8-5b1fc859281a", + "importer": "sprite-frame", + "rawTextureUuid": "e743086f-8c48-4c72-bb7c-78f72fc0fe45", + "trimType": "custom", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "width": 103, + "height": 112, + "rawWidth": 103, + "rawHeight": 112, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/assets/mini_program_benefits/texture/desktop.png b/assets/mini_program_benefits/texture/desktop.png new file mode 100644 index 00000000..874f8a76 Binary files /dev/null and b/assets/mini_program_benefits/texture/desktop.png differ diff --git a/assets/mini_program_benefits/texture/desktop.png.meta b/assets/mini_program_benefits/texture/desktop.png.meta new file mode 100644 index 00000000..96eed598 --- /dev/null +++ b/assets/mini_program_benefits/texture/desktop.png.meta @@ -0,0 +1,38 @@ +{ + "ver": "2.3.7", + "uuid": "4e3998d1-427b-4e80-bdc9-3ec66053e47a", + "importer": "texture", + "type": "sprite", + "wrapMode": "clamp", + "filterMode": "bilinear", + "premultiplyAlpha": false, + "genMipmaps": false, + "packable": false, + "width": 166, + "height": 166, + "platformSettings": {}, + "subMetas": { + "desktop": { + "ver": "1.0.6", + "uuid": "11350710-460d-4637-8e97-62d6ce0dfc94", + "importer": "sprite-frame", + "rawTextureUuid": "4e3998d1-427b-4e80-bdc9-3ec66053e47a", + "trimType": "custom", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "width": 166, + "height": 166, + "rawWidth": 166, + "rawHeight": 166, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/assets/mini_program_benefits/texture/favorite.png b/assets/mini_program_benefits/texture/favorite.png new file mode 100644 index 00000000..18b1cc04 Binary files /dev/null and b/assets/mini_program_benefits/texture/favorite.png differ diff --git a/assets/mini_program_benefits/texture/favorite.png.meta b/assets/mini_program_benefits/texture/favorite.png.meta new file mode 100644 index 00000000..34faffc4 --- /dev/null +++ b/assets/mini_program_benefits/texture/favorite.png.meta @@ -0,0 +1,38 @@ +{ + "ver": "2.3.7", + "uuid": "2d76e130-a28e-47fd-b6de-26425bc7d24b", + "importer": "texture", + "type": "sprite", + "wrapMode": "clamp", + "filterMode": "bilinear", + "premultiplyAlpha": false, + "genMipmaps": false, + "packable": false, + "width": 166, + "height": 166, + "platformSettings": {}, + "subMetas": { + "favorite": { + "ver": "1.0.6", + "uuid": "dc83d9bc-5368-4d53-917b-58607f6f24c0", + "importer": "sprite-frame", + "rawTextureUuid": "2d76e130-a28e-47fd-b6de-26425bc7d24b", + "trimType": "custom", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "width": 166, + "height": 166, + "rawWidth": 166, + "rawHeight": 166, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/assets/mini_program_benefits/texture/get.png b/assets/mini_program_benefits/texture/get.png new file mode 100644 index 00000000..2dbf0659 Binary files /dev/null and b/assets/mini_program_benefits/texture/get.png differ diff --git a/assets/mini_program_benefits/texture/get.png.meta b/assets/mini_program_benefits/texture/get.png.meta new file mode 100644 index 00000000..d803b792 --- /dev/null +++ b/assets/mini_program_benefits/texture/get.png.meta @@ -0,0 +1,38 @@ +{ + "ver": "2.3.7", + "uuid": "f4ca4dcb-a437-430d-9376-0163b24a6ba3", + "importer": "texture", + "type": "sprite", + "wrapMode": "clamp", + "filterMode": "bilinear", + "premultiplyAlpha": false, + "genMipmaps": false, + "packable": true, + "width": 100, + "height": 82, + "platformSettings": {}, + "subMetas": { + "get": { + "ver": "1.0.6", + "uuid": "91ab9ed1-902b-4062-9e65-cecc117d4e50", + "importer": "sprite-frame", + "rawTextureUuid": "f4ca4dcb-a437-430d-9376-0163b24a6ba3", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "width": 100, + "height": 82, + "rawWidth": 100, + "rawHeight": 82, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/assets/mini_program_benefits/texture/guide-desktop.png b/assets/mini_program_benefits/texture/guide-desktop.png new file mode 100644 index 00000000..897d13b1 Binary files /dev/null and b/assets/mini_program_benefits/texture/guide-desktop.png differ diff --git a/assets/mini_program_benefits/texture/guide-desktop.png.meta b/assets/mini_program_benefits/texture/guide-desktop.png.meta new file mode 100644 index 00000000..a1c944f9 --- /dev/null +++ b/assets/mini_program_benefits/texture/guide-desktop.png.meta @@ -0,0 +1,38 @@ +{ + "ver": "2.3.7", + "uuid": "beddcd13-7991-4d9c-9df4-be6d36f67ad7", + "importer": "texture", + "type": "sprite", + "wrapMode": "clamp", + "filterMode": "bilinear", + "premultiplyAlpha": false, + "genMipmaps": false, + "packable": false, + "width": 723, + "height": 457, + "platformSettings": {}, + "subMetas": { + "guide-desktop": { + "ver": "1.0.6", + "uuid": "371e7dd2-4438-440b-b1b3-b599d1c325ca", + "importer": "sprite-frame", + "rawTextureUuid": "beddcd13-7991-4d9c-9df4-be6d36f67ad7", + "trimType": "custom", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "width": 723, + "height": 457, + "rawWidth": 723, + "rawHeight": 457, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/assets/mini_program_benefits/texture/guide-favorite.png b/assets/mini_program_benefits/texture/guide-favorite.png new file mode 100644 index 00000000..f6d3364e Binary files /dev/null and b/assets/mini_program_benefits/texture/guide-favorite.png differ diff --git a/assets/mini_program_benefits/texture/guide-favorite.png.meta b/assets/mini_program_benefits/texture/guide-favorite.png.meta new file mode 100644 index 00000000..12b23680 --- /dev/null +++ b/assets/mini_program_benefits/texture/guide-favorite.png.meta @@ -0,0 +1,38 @@ +{ + "ver": "2.3.7", + "uuid": "ca0020cd-5a02-43d8-b646-8021f413ec3f", + "importer": "texture", + "type": "sprite", + "wrapMode": "clamp", + "filterMode": "bilinear", + "premultiplyAlpha": false, + "genMipmaps": false, + "packable": false, + "width": 765, + "height": 622, + "platformSettings": {}, + "subMetas": { + "guide-favorite": { + "ver": "1.0.6", + "uuid": "c2ef578d-39d4-44a6-a2c5-5af635ae1492", + "importer": "sprite-frame", + "rawTextureUuid": "ca0020cd-5a02-43d8-b646-8021f413ec3f", + "trimType": "custom", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "width": 765, + "height": 622, + "rawWidth": 765, + "rawHeight": 622, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/assets/mini_program_benefits/texture/guide-panel.png b/assets/mini_program_benefits/texture/guide-panel.png new file mode 100644 index 00000000..795ee908 Binary files /dev/null and b/assets/mini_program_benefits/texture/guide-panel.png differ diff --git a/assets/mini_program_benefits/texture/guide-panel.png.meta b/assets/mini_program_benefits/texture/guide-panel.png.meta new file mode 100644 index 00000000..2ed6eef6 --- /dev/null +++ b/assets/mini_program_benefits/texture/guide-panel.png.meta @@ -0,0 +1,38 @@ +{ + "ver": "2.3.7", + "uuid": "0dd82e81-7969-4ab1-b3d7-6826ea3382ea", + "importer": "texture", + "type": "sprite", + "wrapMode": "clamp", + "filterMode": "bilinear", + "premultiplyAlpha": false, + "genMipmaps": false, + "packable": false, + "width": 902, + "height": 548, + "platformSettings": {}, + "subMetas": { + "guide-panel": { + "ver": "1.0.6", + "uuid": "77480e0d-fe09-4873-8aea-61df6b4bbf64", + "importer": "sprite-frame", + "rawTextureUuid": "0dd82e81-7969-4ab1-b3d7-6826ea3382ea", + "trimType": "custom", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "width": 902, + "height": 548, + "rawWidth": 902, + "rawHeight": 548, + "borderTop": 365, + "borderBottom": 95, + "borderLeft": 100, + "borderRight": 100, + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/assets/mini_program_benefits/texture/panel.png b/assets/mini_program_benefits/texture/panel.png new file mode 100644 index 00000000..fd20c006 Binary files /dev/null and b/assets/mini_program_benefits/texture/panel.png differ diff --git a/assets/mini_program_benefits/texture/panel.png.meta b/assets/mini_program_benefits/texture/panel.png.meta new file mode 100644 index 00000000..ec8787c3 --- /dev/null +++ b/assets/mini_program_benefits/texture/panel.png.meta @@ -0,0 +1,38 @@ +{ + "ver": "2.3.7", + "uuid": "986837cb-81e5-4a6a-9187-1b1b277422cf", + "importer": "texture", + "type": "sprite", + "wrapMode": "clamp", + "filterMode": "bilinear", + "premultiplyAlpha": false, + "genMipmaps": false, + "packable": false, + "width": 950, + "height": 650, + "platformSettings": {}, + "subMetas": { + "panel": { + "ver": "1.0.6", + "uuid": "2562cef8-4823-429f-adc9-5a757340942d", + "importer": "sprite-frame", + "rawTextureUuid": "986837cb-81e5-4a6a-9187-1b1b277422cf", + "trimType": "custom", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "width": 950, + "height": 650, + "rawWidth": 950, + "rawHeight": 650, + "borderTop": 390, + "borderBottom": 110, + "borderLeft": 105, + "borderRight": 105, + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/assets/mini_program_benefits/texture/quantity-1.png b/assets/mini_program_benefits/texture/quantity-1.png new file mode 100644 index 00000000..7cf8ffbe Binary files /dev/null and b/assets/mini_program_benefits/texture/quantity-1.png differ diff --git a/assets/mini_program_benefits/texture/quantity-1.png.meta b/assets/mini_program_benefits/texture/quantity-1.png.meta new file mode 100644 index 00000000..a56d7c90 --- /dev/null +++ b/assets/mini_program_benefits/texture/quantity-1.png.meta @@ -0,0 +1,38 @@ +{ + "ver": "2.3.7", + "uuid": "6ffa87a6-4661-4023-bdd1-dc89940eaa62", + "importer": "texture", + "type": "sprite", + "wrapMode": "clamp", + "filterMode": "bilinear", + "premultiplyAlpha": false, + "genMipmaps": false, + "packable": false, + "width": 48, + "height": 54, + "platformSettings": {}, + "subMetas": { + "quantity-1": { + "ver": "1.0.6", + "uuid": "011c8cfa-9a31-4c2c-8e40-13d8ef5cba75", + "importer": "sprite-frame", + "rawTextureUuid": "6ffa87a6-4661-4023-bdd1-dc89940eaa62", + "trimType": "custom", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "width": 48, + "height": 54, + "rawWidth": 48, + "rawHeight": 54, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/assets/mini_program_benefits/texture/quantity-times.png b/assets/mini_program_benefits/texture/quantity-times.png new file mode 100644 index 00000000..e64134fd Binary files /dev/null and b/assets/mini_program_benefits/texture/quantity-times.png differ diff --git a/assets/mini_program_benefits/texture/quantity-times.png.meta b/assets/mini_program_benefits/texture/quantity-times.png.meta new file mode 100644 index 00000000..ad82de09 --- /dev/null +++ b/assets/mini_program_benefits/texture/quantity-times.png.meta @@ -0,0 +1,38 @@ +{ + "ver": "2.3.7", + "uuid": "d309c915-049b-4fa7-a6bf-eaa1f951c2ee", + "importer": "texture", + "type": "sprite", + "wrapMode": "clamp", + "filterMode": "bilinear", + "premultiplyAlpha": false, + "genMipmaps": false, + "packable": false, + "width": 31, + "height": 32, + "platformSettings": {}, + "subMetas": { + "quantity-times": { + "ver": "1.0.6", + "uuid": "26ab48f6-c12d-48be-90c7-e06d6a075945", + "importer": "sprite-frame", + "rawTextureUuid": "d309c915-049b-4fa7-a6bf-eaa1f951c2ee", + "trimType": "custom", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "width": 31, + "height": 32, + "rawWidth": 31, + "rawHeight": 32, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/assets/mini_program_benefits/texture/solid-white.png b/assets/mini_program_benefits/texture/solid-white.png new file mode 100644 index 00000000..e98c4d0a Binary files /dev/null and b/assets/mini_program_benefits/texture/solid-white.png differ diff --git a/assets/mini_program_benefits/texture/solid-white.png.meta b/assets/mini_program_benefits/texture/solid-white.png.meta new file mode 100644 index 00000000..8e5daa60 --- /dev/null +++ b/assets/mini_program_benefits/texture/solid-white.png.meta @@ -0,0 +1,38 @@ +{ + "ver": "2.3.7", + "uuid": "013482f3-92ed-4d6d-9b95-437fe03acb31", + "importer": "texture", + "type": "sprite", + "wrapMode": "clamp", + "filterMode": "bilinear", + "premultiplyAlpha": false, + "genMipmaps": false, + "packable": false, + "width": 2, + "height": 2, + "platformSettings": {}, + "subMetas": { + "solid-white": { + "ver": "1.0.6", + "uuid": "01b3819b-d35e-4e1d-a37b-88ab4e33a15c", + "importer": "sprite-frame", + "rawTextureUuid": "013482f3-92ed-4d6d-9b95-437fe03acb31", + "trimType": "custom", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "width": 2, + "height": 2, + "rawWidth": 2, + "rawHeight": 2, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/assets/mini_program_benefits/texture/task-title-desktop.png b/assets/mini_program_benefits/texture/task-title-desktop.png new file mode 100644 index 00000000..324b424f Binary files /dev/null and b/assets/mini_program_benefits/texture/task-title-desktop.png differ diff --git a/assets/mini_program_benefits/texture/task-title-desktop.png.meta b/assets/mini_program_benefits/texture/task-title-desktop.png.meta new file mode 100644 index 00000000..4bb3f13c --- /dev/null +++ b/assets/mini_program_benefits/texture/task-title-desktop.png.meta @@ -0,0 +1,38 @@ +{ + "ver": "2.3.7", + "uuid": "50010b71-3937-4613-9fc8-9e697e0f84a7", + "importer": "texture", + "type": "sprite", + "wrapMode": "clamp", + "filterMode": "bilinear", + "premultiplyAlpha": false, + "genMipmaps": false, + "packable": false, + "width": 206, + "height": 38, + "platformSettings": {}, + "subMetas": { + "task-title-desktop": { + "ver": "1.0.6", + "uuid": "6195066d-ffde-42dd-946a-98391261422d", + "importer": "sprite-frame", + "rawTextureUuid": "50010b71-3937-4613-9fc8-9e697e0f84a7", + "trimType": "custom", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "width": 206, + "height": 38, + "rawWidth": 206, + "rawHeight": 38, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/assets/mini_program_benefits/texture/task-title-favorite.png b/assets/mini_program_benefits/texture/task-title-favorite.png new file mode 100644 index 00000000..ec29f518 Binary files /dev/null and b/assets/mini_program_benefits/texture/task-title-favorite.png differ diff --git a/assets/mini_program_benefits/texture/task-title-favorite.png.meta b/assets/mini_program_benefits/texture/task-title-favorite.png.meta new file mode 100644 index 00000000..36d9dbb2 --- /dev/null +++ b/assets/mini_program_benefits/texture/task-title-favorite.png.meta @@ -0,0 +1,38 @@ +{ + "ver": "2.3.7", + "uuid": "b7589df2-004b-446c-b045-9c1afb1f87ed", + "importer": "texture", + "type": "sprite", + "wrapMode": "clamp", + "filterMode": "bilinear", + "premultiplyAlpha": false, + "genMipmaps": false, + "packable": false, + "width": 332, + "height": 39, + "platformSettings": {}, + "subMetas": { + "task-title-favorite": { + "ver": "1.0.6", + "uuid": "8c702fbc-5dcf-4208-ba4e-d268bab82455", + "importer": "sprite-frame", + "rawTextureUuid": "b7589df2-004b-446c-b045-9c1afb1f87ed", + "trimType": "custom", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "width": 332, + "height": 39, + "rawWidth": 332, + "rawHeight": 39, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/assets/mini_program_benefits/texture/task.png b/assets/mini_program_benefits/texture/task.png new file mode 100644 index 00000000..96b712a6 Binary files /dev/null and b/assets/mini_program_benefits/texture/task.png differ diff --git a/assets/mini_program_benefits/texture/task.png.meta b/assets/mini_program_benefits/texture/task.png.meta new file mode 100644 index 00000000..cbf5e2db --- /dev/null +++ b/assets/mini_program_benefits/texture/task.png.meta @@ -0,0 +1,38 @@ +{ + "ver": "2.3.7", + "uuid": "85a0bbf5-5475-4c56-a022-0689f0fabe75", + "importer": "texture", + "type": "sprite", + "wrapMode": "clamp", + "filterMode": "bilinear", + "premultiplyAlpha": false, + "genMipmaps": false, + "packable": false, + "width": 818, + "height": 222, + "platformSettings": {}, + "subMetas": { + "task": { + "ver": "1.0.6", + "uuid": "db3bc0a7-ec60-4031-9692-f32d157dae7e", + "importer": "sprite-frame", + "rawTextureUuid": "85a0bbf5-5475-4c56-a022-0689f0fabe75", + "trimType": "custom", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "width": 818, + "height": 222, + "rawWidth": 818, + "rawHeight": 222, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/assets/mini_program_benefits/texture/title-desktop.png b/assets/mini_program_benefits/texture/title-desktop.png new file mode 100644 index 00000000..e68313f9 Binary files /dev/null and b/assets/mini_program_benefits/texture/title-desktop.png differ diff --git a/assets/mini_program_benefits/texture/title-desktop.png.meta b/assets/mini_program_benefits/texture/title-desktop.png.meta new file mode 100644 index 00000000..16149eba --- /dev/null +++ b/assets/mini_program_benefits/texture/title-desktop.png.meta @@ -0,0 +1,38 @@ +{ + "ver": "2.3.7", + "uuid": "5fb2be42-33ca-4474-a0f2-aeafe2919797", + "importer": "texture", + "type": "sprite", + "wrapMode": "clamp", + "filterMode": "bilinear", + "premultiplyAlpha": false, + "genMipmaps": false, + "packable": false, + "width": 680, + "height": 220, + "platformSettings": {}, + "subMetas": { + "title-desktop": { + "ver": "1.0.6", + "uuid": "1ee4a1a7-9771-4505-8d96-3ebe899d21f5", + "importer": "sprite-frame", + "rawTextureUuid": "5fb2be42-33ca-4474-a0f2-aeafe2919797", + "trimType": "custom", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "width": 680, + "height": 220, + "rawWidth": 680, + "rawHeight": 220, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/assets/mini_program_benefits/texture/title-favorite.png b/assets/mini_program_benefits/texture/title-favorite.png new file mode 100644 index 00000000..c70f828f Binary files /dev/null and b/assets/mini_program_benefits/texture/title-favorite.png differ diff --git a/assets/mini_program_benefits/texture/title-favorite.png.meta b/assets/mini_program_benefits/texture/title-favorite.png.meta new file mode 100644 index 00000000..1b801535 --- /dev/null +++ b/assets/mini_program_benefits/texture/title-favorite.png.meta @@ -0,0 +1,38 @@ +{ + "ver": "2.3.7", + "uuid": "48317e24-0e1b-4f55-a1b1-cfc2c9f15450", + "importer": "texture", + "type": "sprite", + "wrapMode": "clamp", + "filterMode": "bilinear", + "premultiplyAlpha": false, + "genMipmaps": false, + "packable": false, + "width": 680, + "height": 220, + "platformSettings": {}, + "subMetas": { + "title-favorite": { + "ver": "1.0.6", + "uuid": "6df5bfb7-df44-4981-b6cf-b183290a991e", + "importer": "sprite-frame", + "rawTextureUuid": "48317e24-0e1b-4f55-a1b1-cfc2c9f15450", + "trimType": "custom", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "width": 680, + "height": 220, + "rawWidth": 680, + "rawHeight": 220, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/assets/mini_program_benefits/texture/title-list.png b/assets/mini_program_benefits/texture/title-list.png new file mode 100644 index 00000000..4a3635d5 Binary files /dev/null and b/assets/mini_program_benefits/texture/title-list.png differ diff --git a/assets/mini_program_benefits/texture/title-list.png.meta b/assets/mini_program_benefits/texture/title-list.png.meta new file mode 100644 index 00000000..a7a2f0ac --- /dev/null +++ b/assets/mini_program_benefits/texture/title-list.png.meta @@ -0,0 +1,38 @@ +{ + "ver": "2.3.7", + "uuid": "824d5d91-18c0-4fb6-be24-bec5e522d192", + "importer": "texture", + "type": "sprite", + "wrapMode": "clamp", + "filterMode": "bilinear", + "premultiplyAlpha": false, + "genMipmaps": false, + "packable": false, + "width": 712, + "height": 186, + "platformSettings": {}, + "subMetas": { + "title-list": { + "ver": "1.0.6", + "uuid": "0877f183-4746-46f2-a2fb-d2b19f680af9", + "importer": "sprite-frame", + "rawTextureUuid": "824d5d91-18c0-4fb6-be24-bec5e522d192", + "trimType": "custom", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "width": 712, + "height": 186, + "rawWidth": 712, + "rawHeight": 186, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/assets/mini_program_benefits/texture/view.png b/assets/mini_program_benefits/texture/view.png new file mode 100644 index 00000000..eb2a771a Binary files /dev/null and b/assets/mini_program_benefits/texture/view.png differ diff --git a/assets/mini_program_benefits/texture/view.png.meta b/assets/mini_program_benefits/texture/view.png.meta new file mode 100644 index 00000000..e582b01d --- /dev/null +++ b/assets/mini_program_benefits/texture/view.png.meta @@ -0,0 +1,38 @@ +{ + "ver": "2.3.7", + "uuid": "58e02ceb-9f35-48bb-afa3-79149d463175", + "importer": "texture", + "type": "sprite", + "wrapMode": "clamp", + "filterMode": "bilinear", + "premultiplyAlpha": false, + "genMipmaps": false, + "packable": false, + "width": 198, + "height": 94, + "platformSettings": {}, + "subMetas": { + "view": { + "ver": "1.0.6", + "uuid": "8791583b-79b5-48ee-ba2f-27988ec87c3c", + "importer": "sprite-frame", + "rawTextureUuid": "58e02ceb-9f35-48bb-afa3-79149d463175", + "trimType": "custom", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "width": 198, + "height": 94, + "rawWidth": 198, + "rawHeight": 94, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/assets/resources/texture.meta b/assets/resources/texture.meta new file mode 100644 index 00000000..1fc701d2 --- /dev/null +++ b/assets/resources/texture.meta @@ -0,0 +1,13 @@ +{ + "ver": "1.1.3", + "uuid": "d0a4df6e-8927-4ab3-8129-484cd1710177", + "importer": "folder", + "isBundle": false, + "bundleName": "", + "priority": 1, + "compressionType": {}, + "optimizeHotUpdate": {}, + "inlineSpriteFrames": {}, + "isRemoteBundle": {}, + "subMetas": {} +} \ No newline at end of file diff --git a/assets/resources/texture/mini-program-benefits-entry.png b/assets/resources/texture/mini-program-benefits-entry.png new file mode 100644 index 00000000..1c0ddfb7 Binary files /dev/null and b/assets/resources/texture/mini-program-benefits-entry.png differ diff --git a/assets/resources/texture/mini-program-benefits-entry.png.meta b/assets/resources/texture/mini-program-benefits-entry.png.meta new file mode 100644 index 00000000..69510122 --- /dev/null +++ b/assets/resources/texture/mini-program-benefits-entry.png.meta @@ -0,0 +1,38 @@ +{ + "ver": "2.3.7", + "uuid": "5ce422a1-01fc-4223-a376-2293caa400bd", + "importer": "texture", + "type": "sprite", + "wrapMode": "clamp", + "filterMode": "bilinear", + "premultiplyAlpha": false, + "genMipmaps": false, + "packable": false, + "width": 193, + "height": 179, + "platformSettings": {}, + "subMetas": { + "mini-program-benefits-entry": { + "ver": "1.0.6", + "uuid": "6f59a7ab-37f7-4e9f-b703-f4a3a548801a", + "importer": "sprite-frame", + "rawTextureUuid": "5ce422a1-01fc-4223-a376-2293caa400bd", + "trimType": "custom", + "trimThreshold": 1, + "rotated": false, + "offsetX": 0, + "offsetY": 0, + "trimX": 0, + "trimY": 0, + "width": 193, + "height": 179, + "rawWidth": 193, + "rawHeight": 179, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/assets/seven_day_gift/CatRewardGlow.anim b/assets/seven_day_gift/CatRewardGlow.anim new file mode 100644 index 00000000..cf78d348 --- /dev/null +++ b/assets/seven_day_gift/CatRewardGlow.anim @@ -0,0 +1,62 @@ +{ + "__type__": "cc.AnimationClip", + "_name": "CatRewardGlow", + "_objFlags": 0, + "_native": "", + "_duration": 6, + "sample": 60, + "speed": 1, + "wrapMode": 2, + "curveData": { + "props": { + "angle": [ + { + "frame": 0, + "value": 0 + }, + { + "frame": 6, + "value": 360 + } + ], + "opacity": [ + { + "frame": 0, + "value": 170, + "curve": "sineInOut" + }, + { + "frame": 1, + "value": 255, + "curve": "sineInOut" + }, + { + "frame": 2, + "value": 170, + "curve": "sineInOut" + }, + { + "frame": 3, + "value": 255, + "curve": "sineInOut" + }, + { + "frame": 4, + "value": 170, + "curve": "sineInOut" + }, + { + "frame": 5, + "value": 255, + "curve": "sineInOut" + }, + { + "frame": 6, + "value": 170, + "curve": "sineInOut" + } + ] + } + }, + "events": [] +} diff --git a/assets/seven_day_gift/CatRewardGlow.anim.meta b/assets/seven_day_gift/CatRewardGlow.anim.meta new file mode 100644 index 00000000..222e0fec --- /dev/null +++ b/assets/seven_day_gift/CatRewardGlow.anim.meta @@ -0,0 +1,6 @@ +{ + "ver": "2.1.2", + "uuid": "8a9c1d91-8e81-4b7c-ade7-3437979273a0", + "importer": "animation-clip", + "subMetas": {} +} \ No newline at end of file diff --git a/assets/seven_day_gift/SevenDayGift.ts b/assets/seven_day_gift/SevenDayGift.ts index c3426584..9f898af2 100644 --- a/assets/seven_day_gift/SevenDayGift.ts +++ b/assets/seven_day_gift/SevenDayGift.ts @@ -41,7 +41,6 @@ export default class SevenDayGift extends cc.Component { private effectPlaying = false; // 也覆盖测试面板单独预览效果的情况。 private panel: cc.Node = null; private mask: cc.Node = null; - private closeNode: cc.Node = null; private closeEnabled = true; private closeHandler: CloseHandler = null; private runtime: SevenDayGiftRuntime = null; @@ -121,19 +120,15 @@ export default class SevenDayGift extends cc.Component { }); } - // 按 Prefab 约定找到卡片,关闭按钮始终隐藏。 + // 按 Prefab 约定找到卡片。 private cacheView(): boolean { this.panel = this.node.getChildByName("panel"); this.mask = this.node.getChildByName("mask"); - this.closeNode = this.panel && this.panel.getChildByName("close"); const cards = this.panel && this.panel.getChildByName("cards"); - const message = this.panel && this.panel.getChildByName("message"); if (!this.panel || !this.mask || !cards) { cc.error("[SevenDayGift] prefab structure is incomplete"); return false; } - if (message) message.active = false; - if (this.closeNode) this.closeNode.active = false; for (let day = 1; day <= TOTAL_DAYS; day++) { const card = cards.getChildByName("giftDay" + day); if (!card) { @@ -189,19 +184,13 @@ export default class SevenDayGift extends cc.Component { const claimed = !!(reward && reward.claimed); const available = !!this.info.canClaim && day === Number(this.info.nextRewardDay); const special = day === TOTAL_DAYS; - const cardFrame = claimed && !special - ? this.claimedOverlay - : special ? this.cardSpecial : available ? this.cardYellow : this.cardBlue; + const cardFrame = special ? this.cardSpecial : available ? this.cardYellow : this.cardBlue; this.setSprite(card, cardFrame); // 白色不改变贴图颜色,保留美术资源的原色。 card.color = cc.Color.WHITE; card.opacity = 255; const dayLabel = card.getChildByName("dayLabel").getComponent(cc.Label); - dayLabel.string = day === TOTAL_DAYS ? "第7天" : "第" + day + "天"; - dayLabel.fontSize = 32; - dayLabel.lineHeight = 38; - dayLabel.node.color = cc.Color.WHITE; const dayOutline = dayLabel.node.getComponent(cc.LabelOutline); if (dayOutline) { dayOutline.color = special @@ -210,19 +199,25 @@ export default class SevenDayGift extends cc.Component { } const items = reward && Array.isArray(reward.items) ? reward.items : []; - this.refreshRewardItems(card, items, special, available || claimed); - - let badge = card.getChildByName("claimedBadge"); - if (!badge) { - badge = new cc.Node("claimedBadge"); - badge.addComponent(cc.Sprite); - card.addChild(badge); - badge.zIndex = 10; + this.refreshRewardItems(card, items, available || claimed); + if (special) { + const glow = card.getChildByName("catGlow"); + glow.active = !claimed && items.some(item => item.type === "cat_skin"); + const animation = glow.getComponent(cc.Animation); + if (glow.active) { + const state = animation.getAnimationState("CatRewardGlow"); + if (!state || !state.isPlaying) animation.play("CatRewardGlow"); + } else { + animation.stop(); + } } - badge.setContentSize(118, 99); - badge.setPosition(0, 0); + + // 保留原卡片,遮罩压暗日期和奖励,印章绘制在遮罩上方。 + const overlay = card.getChildByName("claimedOverlay"); + overlay.active = claimed; + + const badge = card.getChildByName("claimedBadge"); badge.active = claimed; - this.setSprite(badge, this.claimedBadge); card.stopAllActions(); card.scale = 1; @@ -261,7 +256,6 @@ export default class SevenDayGift extends cc.Component { // 控制是否允许关闭,不再显示关闭按钮。 private setCloseEnabled(enabled: boolean) { this.closeEnabled = enabled; - if (this.closeNode) this.closeNode.active = false; } // 从对应道具位置生成图标和数量,播放期间锁住交互。 @@ -294,68 +288,51 @@ export default class SevenDayGift extends cc.Component { return null; } - // 重建卡片道具图标,多奖励横向重叠显示。 - private refreshRewardItems(card: cc.Node, items: SevenDayRewardItem[], special: boolean, unlocked: boolean) { - const originalIcon = card.getChildByName("rewardIcon"); - if (originalIcon) originalIcon.active = false; - - let container = card.getChildByName("rewardItems"); - if (!container) { - container = new cc.Node("rewardItems"); - container.zIndex = 2; - card.addChild(container); - } - - container.children.slice().forEach(child => { - child.removeFromParent(); - child.destroy(); + // 更新固定奖励槽位,不创建、销毁或重排节点。 + private refreshRewardItems(card: cc.Node, items: SevenDayRewardItem[], unlocked: boolean) { + const container = card.getChildByName("rewardItems"); + if (items.length > container.childrenCount) cc.warn("[SevenDayGift] 奖励数量超出预制体槽位,请更新预制体"); + container.children.forEach((icon, index) => { + const item = items[index]; + icon.active = !!item; + if (!item) return; + this.setSprite(icon, this.getRewardIcon(item, unlocked)); + this.refreshAmount(icon, item); }); - container.active = items.length > 0; - if (!items.length) return; + } - const count = items.length; - const availableWidth = special ? 220 : 184; - // 图标略微缩小,为下方图片数量留出空间。 - const iconSize = special ? 116 : 92; - const step = count === 1 ? 0 : Math.min(iconSize + 8, (availableWidth - iconSize) / (count - 1)); - const totalWidth = iconSize + step * (count - 1); - const startX = -totalWidth / 2 + iconSize / 2; - const centerY = -4; // 道具和数量整体下移 12px。 - - container.setContentSize(availableWidth, special ? 210 : 130); - container.setPosition(0, special ? -8 : -4); - - items.forEach((item, index) => { - const itemNode = new cc.Node("rewardItem" + index); - // 第七天突出小猫,爱心缩小;按实际尺寸限制位置,避免超出卡片。 - const baseSize = special && item.type === "cat_skin" ? 140 - : special && item.type === "infinite_health" ? 78 : iconSize; - const size = count === 1 ? Math.round(baseSize * 1.15) : baseSize; - const maxX = (availableWidth - size) / 2; - const x = Math.max(-maxX, Math.min(maxX, startX + step * index)); - itemNode.setContentSize(size, size); - // 爱心略微下移,形成高低层次,让小猫成为视觉重点。 - const y = special && item.type === "infinite_health" ? centerY - 24 : centerY; - itemNode.setPosition(special && item.type === "infinite_health" ? x - 12 : x, y); - itemNode.zIndex = index; - container.addChild(itemNode); - - const sprite = itemNode.addComponent(cc.Sprite); - sprite.sizeMode = cc.Sprite.SizeMode.CUSTOM; - sprite.spriteFrame = this.getRewardIcon(item, unlocked); - // 按原图比例收进目标尺寸,避免非正方形道具被拉伸。 - sprite.trim = false; - if (sprite.spriteFrame) { - const original = sprite.spriteFrame.getOriginalSize(); - const scale = size / Math.max(original.width, original.height, 1); - itemNode.setContentSize(original.width * scale, original.height * scale); - } - // 数量紧跟各自图标;双奖励各占自己的宽度,避免文字相互挤压。 - RewardClaimEffect.createAmount(itemNode, { - count: Math.max(0, Number(item.count !== undefined ? item.count : item.amount) || 0), - prefix: item.type === "coin" || item.type === "infinite_health" ? "" : "×", - isTime: item.type === "infinite_health", - }, this.rewardNumberFrames, count > 1 ? Math.min(88, step) : 100, 26, itemNode); + // 只更新预制体中已有的图片字位,无文字兜底。 + private refreshAmount(icon: cc.Node, item: SevenDayRewardItem) { + const amount = icon.getChildByName("amount"); + const count = Math.max(0, Number(item.count !== undefined ? item.count : item.amount) || 0); + const isTime = item.type === "infinite_health"; + const prefix = isTime || item.type === "coin" ? "" : "×"; + const value = isTime ? Number((count / 60).toFixed(2)) : count; + const text = prefix + value; + const glyphs = text.split("").map(char => this.rewardNumberFrames[char === "×" ? 11 : Number(char)]); + if (isTime) glyphs.push(this.rewardNumberFrames[12]); + const useImages = /^×?\d+$/.test(text) && glyphs.length <= amount.childrenCount && glyphs.every(Boolean); + amount.children.forEach((digit, index) => digit.active = useImages && index < glyphs.length); + if (!useImages) { + cc.warn("[SevenDayGift] 数量图片或字位不足,请更新预制体:" + text); + return; + } + const numberFrames = isTime ? glyphs.slice(0, -1) : glyphs; + const scale = amount.height / Math.max(...numberFrames.map(frame => frame.getOriginalSize().height)); + // 分钟贴图原始高度较小,单独按数字的可见高度等比放大。 + const numberHeight = Math.max(...numberFrames.map(frame => frame.getRect().height)) * scale; + const scales = glyphs.map((frame, index) => isTime && index === glyphs.length - 1 + ? numberHeight / frame.getRect().height : scale); + const widths = glyphs.map((frame, index) => frame.getOriginalSize().width * scales[index]); + const total = widths.reduce((sum, width) => sum + width, 0) + glyphs.length - 1; + const fit = Math.min(1, amount.width / total); + let x = -total / 2; + glyphs.forEach((frame, index) => { + const digit = amount.getChildByName("digit" + index); + this.setSprite(digit, frame); + digit.setContentSize(widths[index] * fit, frame.getOriginalSize().height * scales[index] * fit); + digit.setPosition((x + widths[index] / 2) * fit, 0); + x += widths[index] + 1; }); } diff --git a/assets/seven_day_gift/SevenDayHitTest.ts b/assets/seven_day_gift/SevenDayHitTest.ts index 5ded82df..a8163410 100644 --- a/assets/seven_day_gift/SevenDayHitTest.ts +++ b/assets/seven_day_gift/SevenDayHitTest.ts @@ -4,6 +4,8 @@ import masks from "./SevenDayHitMasks"; export default class SevenDayHitTest { // 从上层子节点往背景检查,透明处继续寻找下方的可见 UI。 public static findVisible(node: cc.Node, screenPoint: cc.Vec2): cc.Node { + // 装饰光芒不扩大卡片的可点击范围。 + if (node.name === "catGlow") return null; if (!node.activeInHierarchy || node.opacity === 0) return null; for (let i = node.children.length - 1; i >= 0; i--) { const hit = this.findVisible(node.children[i], screenPoint); diff --git a/assets/seven_day_gift/docs.meta b/assets/seven_day_gift/docs.meta new file mode 100644 index 00000000..6385b0aa --- /dev/null +++ b/assets/seven_day_gift/docs.meta @@ -0,0 +1,13 @@ +{ + "ver": "1.1.3", + "uuid": "b7667484-67b8-4318-be2f-7e79a9e13d96", + "importer": "folder", + "isBundle": false, + "bundleName": "", + "priority": 1, + "compressionType": {}, + "optimizeHotUpdate": {}, + "inlineSpriteFrames": {}, + "isRemoteBundle": {}, + "subMetas": {} +} \ No newline at end of file diff --git a/assets/seven_day_gift/docs/seven-day-gift-maintenance.md b/assets/seven_day_gift/docs/seven-day-gift-maintenance.md new file mode 100644 index 00000000..05f3acb1 --- /dev/null +++ b/assets/seven_day_gift/docs/seven-day-gift-maintenance.md @@ -0,0 +1,164 @@ +# 七日活动实现与维护说明 + +核对日期:2026-09-16。本文以当前工作区代码和资源为准,不代表已发布版本或后端实时配置。测试步骤见 [预览与测试说明](testSeven-local-preview.md)。 + +## 当前流程 + +1. `HomeScene` 的 `SevenDayGiftHost` 等待 UID,调用 `signInActivityInfo` 查询活动;UID 未就绪最多按一秒间隔重试十次。 +2. 满足自动展示条件后,以键 `sevenDayGift`、优先级 `10` 加入 `HomePopupQueue`。 +3. 通过主页的 `loadHomeBundleWithDependencies("seven_day_gift", 5, ...)` 加载分包及依赖,再加载并实例化 `prefab/sevenDayGift`。 +4. 将查询快照交给活动视图,成功显示后才记录当天已弹。加载或初始化失败不会写已弹记录。 +5. 打开后等待点击,不自动领取。点击当天卡片或弹窗外部,使用快照中当天的奖励执行发奖;成功后更新本地领取状态并播放上浮效果。 +6. 领取后再次点击外部关闭。销毁活动节点,通常下一帧释放活动 Bundle;宿主销毁时立即释放。测试入口恢复且实际存在时保留 Bundle,退出主页时一并释放。2026-09-18 核对:Host 已暂停加载白字测试入口,详见测试说明。 + +没有手动入口或关闭按钮。代码中的 `autoClaim` 是保留的旧参数名,目前表示自动展示来源,不代表自动领取。 + +### 自动展示条件 + +- 存在 `activityId`,且 `triggerReached` 为真。 +- `status` 不是 `expired` 或 `completed`。 +- 时间可解析时要求 `serverNow < endAt`;当前代码遇到不可解析时间不会因此阻止展示。 +- `canClaim` 为真,`todayClaimed` 为假,当前账号、活动、服务器日期尚未成功显示过。 + +触发等级、开始时间和期限由后端决定;前端不硬编码 23 关或 14 天,也不单独检查 `startAt` 是否已经到达。 + +自动弹窗记录键为 `seven_day_gift_auto_open_v1::`,值为 UTC+8 自然日编号字符串;缺少有效服务器时间时使用设备时间。已弹记录不代表已领取,领取失败不会清除该记录。 + +主页进入和回到前台会查询。弹窗加载中或显示中不重复查询;Cocos `CC_PREVIEW` 环境不会自动查询或自动打开活动。 + +## 文件职责 + +以下路径均相对于项目根目录。 + +| 文件 | 职责 | +| --- | --- | +| `assets/Script/seven_day_gift/SevenDayGiftHost.ts` | 展示条件、主页队列、分包加载与释放 | +| `assets/Script/seven_day_gift/SevenDayGiftBootstrapApi.ts` | 主包活动查询 | +| `assets/seven_day_gift/SevenDayGift.ts` | 预制体节点绑定、数据刷新、点击和动画调用 | +| `assets/seven_day_gift/SevenDayGiftRuntime.ts` | 领取流程、Loading、状态更新 | +| `assets/seven_day_gift/SevenDayGiftApi.ts` | 数据类型、猫皮肤与道具保存接口 | +| `assets/seven_day_gift/SevenDayGiftReward.ts` | 本地资产增加、同步及成功记录防重 | +| `assets/seven_day_gift/prefab/sevenDayGift.prefab` | 面板最终布局 | +| `assets/seven_day_gift/texture/reward_numbers_medium/` | 数字、乘号、加号、分钟图片 | +| `assets/seven_day_gift/SevenDayHitTest.ts`、`SevenDayHitMasks.ts` | 透明区域点击判定及离线命中数据 | +| `assets/reward_claim_effect/RewardClaimEffect.ts` | 独立领取上浮特效 | +| `assets/Script/ActivityPopupAnimator.ts` | 面板开关动画 | +| `assets/home_popup_queue/HomePopupQueue.ts` | 主页活动弹窗协调 | +| `assets/seven_day_gift/test/SevenDayTest.ts`、`SevenDayTest.prefab` | 独立测试服白字入口、接口字段查看、当前账号活动缓存清理 | + +主包宿主通过接口调用活动组件,不静态导入活动实现。维护时保留资源 `.meta` 和 UUID,避免场景直接引用活动资源而破坏按需加载。 + +## 预制体与美术维护 + +面板共 85 个节点,奖励节点全部存放在预制体中。运行时不创建或销毁面板奖励节点,只更新图片、数量字位和状态,播放动画。 + +```text +sevenDayGift +├─ mask +└─ panel + ├─ header + └─ cards + └─ giftDay1 … giftDay7 + ├─ dayLabel + ├─ rewardItems + │ └─ rewardItem0 / rewardItem1 + │ └─ amount + │ └─ digit0 … 实际需要的字位 + ├─ claimedOverlay + └─ claimedBadge +``` + +默认展示第 1 天可领取。仅 `claimedOverlay` 和 `claimedBadge` 默认未激活,领取后显示。备用布局、额外字位、文字兜底、旧关闭按钮、提示和重复标题文字均已删除。 + +### 当前编辑器展示值与容量 + +下表是预制体默认展示和测试基线,不是服务端奖励配置的证明。实际发奖仍以接口 `rewards` 为准。 + +| 天数 | 默认展示 | 奖励槽位数 | 各奖励数量字位数 | +| --- | --- | ---: | --- | +| 1 | 无限体力 15 分钟 | 1 | 3 | +| 2 | 锤子 ×1 | 1 | 2 | +| 3 | 无限体力 30 分钟 | 1 | 3 | +| 4 | 冻结 ×1、魔法棒 ×1 | 2 | 2、2 | +| 5 | 金币 600 | 1 | 3 | +| 6 | 锤子 ×1、冻结 ×1 | 2 | 2、2 | +| 7 | 无限体力 60 分钟、猫皮肤 ×1 | 2 | 3、2 | + +“分钟”整张图片占一个字位,乘号也占一个字位。猫的发奖编号由接口 `itemId` 指定;面板当前使用绑定的固定猫图片。 + +### 当前视觉规格 + +- “分钟”按数字的可见高度等比放大,不按较小的原始贴图尺寸显示。 +- 同一卡片内各奖励的数量排在同一水平线上;此前按各图标底边定位导致高低不齐。 +- 所有面板数量相对调整前放大 15%,数量容器高度为 29.9。 +- 第七天爱心相对调整前放大 10%、左移 6px。 +- 当前可领取卡片为黄色并播放 1~1.04 倍呼吸缩放;第七天使用专用底图。猫在可领取或已领取时显示正常图,否则显示锁定图。 + +直接在预制体调整 `rewardItem*` 的位置、尺寸及 `amount` 的整体位置;这些值不会被数据刷新重设。数量字位内部尺寸和间距仍由 `refreshAmount()` 按容器宽高更新,日期描边颜色、卡片底图和状态仍受脚本控制。 + +增加奖励项、调整奖励顺序或改变类型时,必须同步检查固定槽位、图片比例及位置。增加数量位数时,需添加连续命名的 `digitN` Sprite 节点。超出槽位的奖励不会显示,但发奖逻辑仍消费完整接口数组;字位不足、缺图或小数数量会隐藏该数量并警告,不显示文字兜底,不可把显示限制当作发奖限制。 + +面板预制体与领取特效是两套展示:`RewardClaimEffect` 仍动态创建临时特效节点,并保留它自身的数量绘制逻辑。此次分钟等高、15% 数量放大及无文字兜底针对面板,不代表特效已同步采用这些规格。 + +## 接口与发奖 + +主包向 `signInActivityInfo` 提交 UID,公共 `Utils.POST` 补充 token 等公共参数。仅 `code === 1` 且 `data` 为有效对象时消费结果;`data: false` 不展示活动。活动查询和分包资产保存接口均有 5.5 秒超时保护。 + +| 快照字段 | 用途 | +| --- | --- | +| `activityId`、`startAt` | 活动识别、本次领取记录 | +| `serverNow`、`endAt`、`status` | 日期及展示条件 | +| `triggerLevel`、`triggerReached` | 后端触发信息;实际展示判断使用后者 | +| `canClaim`、`todayClaimed`、`nextRewardDay` | 当天领取资格和目标天数 | +| `claimedCount`、`rewards[].claimed` | 已领进度 | +| `rewards[].day`、`rewards[].items` | 按天查找奖励,不能假定天数组顺序 | + +奖励项包括 `type`、`count`(兼容旧字段 `amount`)和猫皮肤 `itemId`。无限体力原值为秒,仅显示时除以 60。 + +没有独立活动领取请求:从查询快照取出 `nextRewardDay` 对应的 `items`,执行以下资产更新。 + +| 奖励 | 当前实现 | +| --- | --- | +| 金币 | `GameTool.changeCoin()` | +| 锤子、冻结、魔法棒 | 增加本地总量,再经 `userProp` 保存总量 | +| 无限体力 | `GameTool.setUserPowerTime(seconds, "seven_day_gift")`,刷新主页体力显示 | +| 猫皮肤 | `setCatArr` 保存 `itemId`,更新猫列表 | + +成功后本地标记当天已领取,设置 `canClaim=false`、`todayClaimed=true`;第七天标记活动完成,再播放特效。领取 Loading 有 7 秒兜底;失败允许在当前弹窗重试。 + +### 防重与当前边界 + +成功记录存放在 `seven_day_gift_processed_claims_v1`,按 UID 和 `JSON.stringify([activityId, startAt, nextRewardDay])` 生成的领取标识区分。只有整体同步成功后才写记录;同一设备的成功记录可阻止重复发奖,不能代替后端跨设备幂等。 + +当前先增加本地资产,再等待部分保存接口。若道具或猫保存失败,前面已经增加的资产没有事务回滚,重试可能再次累加。金币、体力路径也不等同于逐项确认服务端最终到账。测试需覆盖部分失败,不应把“可重试”描述为“不会重复增加”。 + +如果后端查询本身已直接增加资产,当前客户端累加方式需与后端重新确认,避免重复发奖。视图和 Runtime 不独立定时检查过期;展示后的过期边界仍需要接口约定和真实环境验证。 + +## 当前环境配置 + +`assets/Script/module/Pay/Utils.ts` 当前配置: + +- `httpip`:`https://q6rvwvtnga.sealoshzh.site/` +- `testHttpip`:`https://q6rvwvtnga.sealoshzh.site/`,与正式地址相同。 +- 旧测试地址 `https://sor779u2w8.sealoshzh.site/` 仅为注释。 + +开发版、体验版选择 `testHttpip`,正式版及其他情况选择 `httpip`。因此当前不能把开发版/体验版称为独立测试服;真实领取前应确认目标地址和测试账号。本次文档整理不修改服务器配置,也未请求线上接口。 + +测试入口由 `SevenDayGiftBootstrapApi.getTestEnvironment()` 统一门禁:仅开发版/体验版且测试、正式地址不同源时显示,每次按钮操作再次校验。测试脚本和预制体位于本包 `test/` 目录,主包仅按路径加载。当前配置下入口隐藏,未擅自恢复旧测试地址。具体操作见测试文档。 + +## 排查与修改入口 + +| 现象 | 检查位置 | +| --- | --- | +| 主页不弹 | 是否 `CC_PREVIEW`、UID、接口响应、展示条件、当天已弹记录、主页队列是否有其他窗口 | +| 分包或预制体加载失败 | 主页依赖加载器、Bundle 名、Prefab 路径和 `SevenDayGift` 组件 | +| 编辑器与运行图标位置不同 | 是否重新导入/构建、是否修改了当前实际使用的奖励槽位、是否处于动画中 | +| 数量消失或奖励少显示 | 控制台容量警告、字位数、图片绑定、后端项数及顺序 | +| 点透明区域行为异常 | `SevenDayHitTest` 与贴图对应的命中数据 | +| 发奖失败或资产重复 | 保存接口响应、成功记录、部分失败重试路径 | + +当前宿主仍有展示判断和打开日志,不能描述为“仅有异常日志”。重新打包需先经 Cocos 构建,再到微信开发者工具验证,单点微信编译不会更新 Cocos 资源。 + +## 第七天小猫光效 + +小猫背后的 catGlow 已固化在预制体中,使用本包独立复制的 exture/catAnimation3.png,不引用扭蛋包资源。CatRewardGlow.anim 循环播放(视图刷新时显式确保启动,重复刷新不重播):6 秒旋转一圈、2 秒明暗呼吸,金色,480×480,透明度 170~255。第七天包含猫奖励且尚未领取时显示,领取后隐藏;装饰节点不参与点击命中。编辑器可直接调整位置、尺寸、颜色和动画。此效果与领取后的上浮动画相互独立。 diff --git a/assets/seven_day_gift/docs/seven-day-gift-maintenance.md.meta b/assets/seven_day_gift/docs/seven-day-gift-maintenance.md.meta new file mode 100644 index 00000000..bcd55d2e --- /dev/null +++ b/assets/seven_day_gift/docs/seven-day-gift-maintenance.md.meta @@ -0,0 +1,6 @@ +{ + "ver": "2.0.2", + "uuid": "f5356b87-e333-4509-807f-136b0ab14803", + "importer": "asset", + "subMetas": {} +} \ No newline at end of file diff --git a/assets/seven_day_gift/docs/testSeven-local-preview.md b/assets/seven_day_gift/docs/testSeven-local-preview.md new file mode 100644 index 00000000..e1932592 --- /dev/null +++ b/assets/seven_day_gift/docs/testSeven-local-preview.md @@ -0,0 +1,114 @@ +# 七日活动预览与测试说明 + +核对日期:2026-09-16。实现和资源维护见 [实现与维护说明](seven-day-gift-maintenance.md)。 + +## 当前入口状态(2026-09-18 补充核对) + +七日白字入口也已暂停:SevenDayGiftHost.onLoad 中 loadTestEntry 调用被注释。恢复时需重新启用调用并打开 SevenDayTest.prefab 的 entry,再重新构建。下面白字面板操作以恢复为前提;正常活动查询仍保留。 + +当前项目没有旧版 `assets/testSeven/` 或 `TestSeven.fire`。新版真实接口测试入口位于 `assets/seven_day_gift/test/`,与七日活动共用 Bundle,不需要手动移走测试目录。 + +### 主页“七日测试”白字入口 + +仅微信开发版或体验版、且 `Utils.testHttpip` 与 `Utils.httpip` 为不同服务器源时加载显示。正式版、网页环境、空地址及同源地址均不开放。地址是否同源以当前 Utils 配置为准;即使配置独立测试服,已暂停的挂载也不会自动恢复。 + +点击主页右上方白色“七日测试”打开面板: + +测试预制体只保存内置 UI 组件,不挂 `SevenDayTest` 脚本引用。宿主在分包加载后通过 `cc.js.getClassByName("SevenDayTest")` 取得构造函数并挂载,初始化后才显示。不要重新添加旧 UUID 的脚本组件;失效引用在构建后可能变成空组件,导致 `getComponent` 报 `Cannot read property 'constructor' of null`。 + +- `查询接口`:使用当前登录 UID 查询 `signInActivityInfo`,显示实际请求地址、响应 code、所有业务使用字段、七天奖励明细、已弹日期和当前奖励防重状态。不会显示 token,不自动领取;查询本身可能影响后端记录。 +- `清本地领取`:仅删除当前 UID、当前活动 ID 和 startAt 对应的本地领取成功记录,保留其他账号、活动和轮次。 +- `清自动弹窗`:仅删除当前 UID、当前活动的自动弹窗日期记录。 +- `重查并尝试弹出`:关闭测试面板,重新走主页查询和自动弹窗条件,不绕过后端领取资格。 +- `关闭`:收起面板,保留白字入口。 + +清理前必须取得当前账号、当前地址下的有效活动快照。活动加载、展示或查询期间禁止清理;账号或地址改变后必须重新查询。清缓存不修改服务器领取进度、不回滚已到账资产,重新领取可能再次增加资产。测试 UI 持有 Bundle 期间不会因活动弹窗关闭而卸载本包,退出主页时一并释放。 + +- 静态检查:用 Cocos Creator 2.4.15 打开 `assets/seven_day_gift/prefab/sevenDayGift.prefab`。 +- 离线逻辑检查:运行下文 Node 测试,不请求后端或修改账号资产。 +- 完整流程:从正常游戏登录进入 `HomeScene`,在确认服务器和账号后验证微信开发/体验环境。 + +主页宿主在 `CC_PREVIEW` 下跳过自动查询,因此直接预览主页不会自动弹出七日活动。静态打开预制体也不会运行完整领取流程。当前没有随项目提供的独立交互预览场景。 + +## 预制体检查 + +默认外观为第 1 天可领取,其余未领取。检查以下内容: + +- 7 张卡片,道具及数量显示与维护文档的默认展示表一致。 +- 面板共 85 个节点;默认未激活节点仅有七天的 `claimedOverlay` 和 `claimedBadge`。 +- 无关闭按钮、提示文字、备用布局和数量文字兜底。 +- “分钟”与数字可见高度一致;同一卡片的数量位于同一水平线。 +- 数量已放大 15%;第七天爱心已放大 10% 并左移 6px。 +- 各卡片仅保留实际奖励槽位和图片字位,数量或奖励项调整后检查容量。 + +这些规格用于面板。领取上浮特效使用独立脚本,不能用静态预制体检查代替特效验收。 + +## 离线自动化测试 + +需有 Node.js,且项目可解析 `typescript` 依赖(`package.json` 已声明)。在项目根目录执行: + +```powershell +node --test tools/test-seven-day-prefab.cjs tools/test-seven-day-loading.cjs tools/test-seven-day-stamina.cjs tools/test-seven-day-debug.cjs +``` + +`npm test` 当前仍是占位命令,不用于七日活动测试。若提示找不到 `typescript`,先按项目依赖管理流程安装开发依赖。 + +| 测试文件 | 覆盖内容 | +| --- | --- | +| `tools/test-seven-day-prefab.cjs` | Prefab 引用、固定槽位、必要隐藏节点、默认布局刷新一致、七天状态、数量图片更新及无文字兜底 | +| `tools/test-seven-day-loading.cjs` | 新加载/缓存 Bundle 的依赖等待、依赖失败后重试、宿主销毁时忽略回调 | +| `tools/test-seven-day-stamina.cjs` | 不同体力状态下首次领取、倒计时刷新、成功领取记录防重 | +| `tools/test-seven-day-debug.cjs` | 测试服环境门禁、当前账号和活动缓存隔离、状态变化拦截、测试预制体引用 | + +这些是使用模拟 Cocos 对象的逻辑测试,不覆盖真实引擎渲染、动画、网络到账或跨设备幂等。新增测试面板后完整执行 14 项测试,均通过。静态绘制预览已检查,但尚未完成 Cocos 实际运行或真机验收。 + +## 真实环境验证 + +当前 `Utils.testHttpip` 与 `httpip` 指向同一地址,开发版/体验版并不隔离到独立测试服。开始真实查询和领取前,确认项目实际配置及专用测试账号;不要将本地逻辑测试结果写成线上验证结果。 + +| 场景 | 应检查的结果 | +| --- | --- | +| 未达到触发条件 / 接口返回 `data:false` | 不加载展示七日活动 | +| 活动可见、当天可领、尚未弹出 | 经主页队列加载并展示;成功显示后才写当天已弹记录 | +| 加载失败 / 初始化失败 | 不写已弹记录;后续符合条件的查询可再次尝试 | +| 刚打开弹窗 | 不自动发奖,无关闭按钮 | +| 点击当天可领卡片 | 领取一次,完成后显示遮罩、印章及上浮效果 | +| 当天可领时点击外部 | 本次只领取,弹窗保留 | +| 领取完再次点击外部 | 关闭活动,释放活动资源,允许后续主页弹窗展示 | +| 点击非当天卡片或其他可见 UI | 不领取,也不按外部点击关闭 | +| 领取或效果播放期间连点 | 不重复领取或预约关闭 | +| 保存失败 | 当前弹窗可重试;核对已增加的资产是否在重试中重复累计 | +| 领取前后切到后台再回来 | 正在展示或加载时不重复查询、重复开窗 | +| 同账号同活动同自然日再进入主页 | 已成功展示过则不再次自动弹出;次日按新查询判断 | +| 第七天领取 | 猫正常图、体力和猫资产正确,本地状态标记完成 | +| 接口返回已完成或已过期 | 主页不自动展示;弹窗打开后跨过期时间需另行核对后端约定 | + +金币、体力、普通道具和猫分别核对实际资产与接口结果,不能只看领取印章。重点检查“部分资产已增加、后续保存失败”的重试场景,当前实现没有完整回滚。 + +### 数量与布局异常 + +验证正常整数、旧字段 `amount`、空奖励数组,以及超出固定槽位/字位容量的数据。字位不足、小数或缺图时数量隐藏并输出警告,没有面板文字兜底;超出槽位的奖励不显示,但业务仍处理完整奖励列表。因此实际奖励配置变更必须先同步预制体。 + +### 透明区域点击 + +有命中数据的 SIMPLE Sprite 按 Alpha ≥ 16/255 判断。透明位置继续向下找可见 UI;没有可见 UI 才按外部点击处理。没有命中数据的图片、其他 Sprite 类型及文字使用节点矩形范围。 + +修改活动顶层贴图后执行: + +```powershell +python tools/generate-seven-hit-masks.py +``` + +需要 Pillow。脚本当前扫描 `assets/seven_day_gift/texture/*.png` 和 `assets/UI/Cat/cat.png`,不递归扫描数字子目录。更新后让 Creator 重新导入;新增其他路径的命中图片需同步调整生成脚本。验收时同时检查弹窗缩放和卡片呼吸缩放状态。 + +### 上浮效果 + +`RewardClaimEffect` 临时创建图标和数量,不使用旧公共 RewardWindow。多奖励按来源位置从左到右排列到同一行,每项间隔 0.145 秒启动;两次弹到 1.25 倍后回正,按脚本时序停留,再用 0.6 秒上移 150px 并淡出。检查双奖励是否重叠、来源位置是否正确、全部结束后交互是否解锁。 + +## 构建与验收记录 + +修改脚本、图片或预制体后,保留 `.meta`,等待 Creator 导入并重新构建,再到微信开发者工具验证。记录构建版本、实际服务器地址、账号、日期及用例结果;发布前确认七天状态、失败重试、后台恢复、关闭释放及其他主页弹窗顺序均通过。 + +## 第七天小猫光效 + +小猫背后的 catGlow 已固化在预制体中,使用本包独立复制的 exture/catAnimation3.png,不引用扭蛋包资源。CatRewardGlow.anim 循环播放(视图刷新时显式确保启动,重复刷新不重播):6 秒旋转一圈、2 秒明暗呼吸,金色,480×480,透明度 170~255。第七天包含猫奖励且尚未领取时显示,领取后隐藏;装饰节点不参与点击命中。编辑器可直接调整位置、尺寸、颜色和动画。此效果与领取后的上浮动画相互独立。 diff --git a/assets/seven_day_gift/docs/testSeven-local-preview.md.meta b/assets/seven_day_gift/docs/testSeven-local-preview.md.meta new file mode 100644 index 00000000..62a81f21 --- /dev/null +++ b/assets/seven_day_gift/docs/testSeven-local-preview.md.meta @@ -0,0 +1,6 @@ +{ + "ver": "2.0.2", + "uuid": "6f8d1fc1-ced5-46c1-9631-5a97a00b9db6", + "importer": "asset", + "subMetas": {} +} \ No newline at end of file diff --git a/assets/seven_day_gift/prefab/sevenDayGift.prefab b/assets/seven_day_gift/prefab/sevenDayGift.prefab index c7d9f275..fa73e362 100644 --- a/assets/seven_day_gift/prefab/sevenDayGift.prefab +++ b/assets/seven_day_gift/prefab/sevenDayGift.prefab @@ -27,14 +27,14 @@ "_active": true, "_components": [ { - "__id__": 163 + "__id__": 246 }, { - "__id__": 164 + "__id__": 247 } ], "_prefab": { - "__id__": 165 + "__id__": 248 }, "_opacity": 255, "_color": { @@ -245,23 +245,17 @@ "__id__": 8 }, { - "__id__": 17 - }, - { - "__id__": 23 - }, - { - "__id__": 158 + "__id__": 11 } ], "_active": true, "_components": [ { - "__id__": 161 + "__id__": 244 } ], "_prefab": { - "__id__": 162 + "__id__": 245 }, "_opacity": 255, "_color": { @@ -317,22 +311,15 @@ "_parent": { "__id__": 7 }, - "_children": [ - { - "__id__": 9 - }, - { - "__id__": 12 - } - ], + "_children": [], "_active": true, "_components": [ { - "__id__": 15 + "__id__": 9 } ], "_prefab": { - "__id__": 16 + "__id__": 10 }, "_opacity": 255, "_color": { @@ -381,222 +368,6 @@ "groupIndex": 0, "_id": "" }, - { - "__type__": "cc.Node", - "_name": "title", - "_objFlags": 0, - "_parent": { - "__id__": 8 - }, - "_children": [], - "_active": false, - "_components": [ - { - "__id__": 10 - } - ], - "_prefab": { - "__id__": 11 - }, - "_opacity": 255, - "_color": { - "__type__": "cc.Color", - "r": 255, - "g": 225, - "b": 79, - "a": 255 - }, - "_contentSize": { - "__type__": "cc.Size", - "width": 740, - "height": 76 - }, - "_anchorPoint": { - "__type__": "cc.Vec2", - "x": 0.5, - "y": 0.5 - }, - "_trs": { - "__type__": "TypedArray", - "ctor": "Float64Array", - "array": [ - 0, - 30, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1 - ] - }, - "_eulerAngles": { - "__type__": "cc.Vec3", - "x": 0, - "y": 0, - "z": 0 - }, - "_skewX": 0, - "_skewY": 0, - "_is3DNode": false, - "_groupIndex": 0, - "groupIndex": 0, - "_id": "" - }, - { - "__type__": "cc.Label", - "_name": "", - "_objFlags": 0, - "node": { - "__id__": 9 - }, - "_enabled": true, - "_materials": [ - { - "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" - } - ], - "_srcBlendFactor": 770, - "_dstBlendFactor": 771, - "_string": "新人登录 · 七日好礼", - "_N$string": "新人登录 · 七日好礼", - "_fontSize": 48, - "_lineHeight": 56, - "_enableWrapText": true, - "_N$file": null, - "_isSystemFontUsed": true, - "_spacingX": 0, - "_batchAsBitmap": false, - "_styleFlags": 1, - "_underlineHeight": 0, - "_N$horizontalAlign": 1, - "_N$verticalAlign": 1, - "_N$fontFamily": "Arial", - "_N$overflow": 1, - "_N$cacheMode": 0, - "_id": "" - }, - { - "__type__": "cc.PrefabInfo", - "root": { - "__id__": 1 - }, - "asset": { - "__id__": 0 - }, - "fileId": "00000AAAABAAIAAAAAAAAAF", - "sync": false - }, - { - "__type__": "cc.Node", - "_name": "subtitle", - "_objFlags": 0, - "_parent": { - "__id__": 8 - }, - "_children": [], - "_active": false, - "_components": [ - { - "__id__": 13 - } - ], - "_prefab": { - "__id__": 14 - }, - "_opacity": 255, - "_color": { - "__type__": "cc.Color", - "r": 255, - "g": 255, - "b": 255, - "a": 255 - }, - "_contentSize": { - "__type__": "cc.Size", - "width": 600, - "height": 52 - }, - "_anchorPoint": { - "__type__": "cc.Vec2", - "x": 0.5, - "y": 0.5 - }, - "_trs": { - "__type__": "TypedArray", - "ctor": "Float64Array", - "array": [ - 0, - -42, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1 - ] - }, - "_eulerAngles": { - "__type__": "cc.Vec3", - "x": 0, - "y": 0, - "z": 0 - }, - "_skewX": 0, - "_skewY": 0, - "_is3DNode": false, - "_groupIndex": 0, - "groupIndex": 0, - "_id": "" - }, - { - "__type__": "cc.Label", - "_name": "", - "_objFlags": 0, - "node": { - "__id__": 12 - }, - "_enabled": true, - "_materials": [ - { - "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" - } - ], - "_srcBlendFactor": 770, - "_dstBlendFactor": 771, - "_string": "每日登录解锁一份奖励", - "_N$string": "每日登录解锁一份奖励", - "_fontSize": 26, - "_lineHeight": 34, - "_enableWrapText": true, - "_N$file": null, - "_isSystemFontUsed": true, - "_spacingX": 0, - "_batchAsBitmap": false, - "_styleFlags": 0, - "_underlineHeight": 0, - "_N$horizontalAlign": 1, - "_N$verticalAlign": 1, - "_N$fontFamily": "Arial", - "_N$overflow": 1, - "_N$cacheMode": 0, - "_id": "" - }, - { - "__type__": "cc.PrefabInfo", - "root": { - "__id__": 1 - }, - "asset": { - "__id__": 0 - }, - "fileId": "00000AAAABAAIAAAAAAAAAG", - "sync": false - }, { "__type__": "cc.Sprite", "_name": "", @@ -640,225 +411,6 @@ "fileId": "00000AAAABAAIAAAAAAAAAE", "sync": false }, - { - "__type__": "cc.Node", - "_name": "close", - "_objFlags": 0, - "_parent": { - "__id__": 7 - }, - "_children": [ - { - "__id__": 18 - } - ], - "_active": false, - "_components": [ - { - "__id__": 21 - } - ], - "_prefab": { - "__id__": 22 - }, - "_opacity": 255, - "_color": { - "__type__": "cc.Color", - "r": 255, - "g": 255, - "b": 255, - "a": 255 - }, - "_contentSize": { - "__type__": "cc.Size", - "width": 90, - "height": 90 - }, - "_anchorPoint": { - "__type__": "cc.Vec2", - "x": 0.5, - "y": 0.5 - }, - "_trs": { - "__type__": "TypedArray", - "ctor": "Float64Array", - "array": [ - 410, - 650, - 0, - 0, - 0, - 0, - 1, - 0.72, - 1, - 1 - ] - }, - "_eulerAngles": { - "__type__": "cc.Vec3", - "x": 0, - "y": 0, - "z": 0 - }, - "_skewX": 0, - "_skewY": 0, - "_is3DNode": false, - "_groupIndex": 0, - "groupIndex": 0, - "_id": "" - }, - { - "__type__": "cc.Node", - "_name": "closeLabel", - "_objFlags": 0, - "_parent": { - "__id__": 17 - }, - "_children": [], - "_active": false, - "_components": [ - { - "__id__": 19 - } - ], - "_prefab": { - "__id__": 20 - }, - "_opacity": 255, - "_color": { - "__type__": "cc.Color", - "r": 255, - "g": 255, - "b": 255, - "a": 255 - }, - "_contentSize": { - "__type__": "cc.Size", - "width": 70, - "height": 70 - }, - "_anchorPoint": { - "__type__": "cc.Vec2", - "x": 0.5, - "y": 0.5 - }, - "_trs": { - "__type__": "TypedArray", - "ctor": "Float64Array", - "array": [ - 0, - 3, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1 - ] - }, - "_eulerAngles": { - "__type__": "cc.Vec3", - "x": 0, - "y": 0, - "z": 0 - }, - "_skewX": 0, - "_skewY": 0, - "_is3DNode": false, - "_groupIndex": 0, - "groupIndex": 0, - "_id": "" - }, - { - "__type__": "cc.Label", - "_name": "", - "_objFlags": 0, - "node": { - "__id__": 18 - }, - "_enabled": true, - "_materials": [ - { - "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" - } - ], - "_srcBlendFactor": 770, - "_dstBlendFactor": 771, - "_string": "×", - "_N$string": "×", - "_fontSize": 54, - "_lineHeight": 62, - "_enableWrapText": true, - "_N$file": null, - "_isSystemFontUsed": true, - "_spacingX": 0, - "_batchAsBitmap": false, - "_styleFlags": 0, - "_underlineHeight": 0, - "_N$horizontalAlign": 1, - "_N$verticalAlign": 1, - "_N$fontFamily": "Arial", - "_N$overflow": 1, - "_N$cacheMode": 0, - "_id": "" - }, - { - "__type__": "cc.PrefabInfo", - "root": { - "__id__": 1 - }, - "asset": { - "__id__": 0 - }, - "fileId": "00000AAAABAAIAAAAAAAAAI", - "sync": false - }, - { - "__type__": "cc.Sprite", - "_name": "", - "_objFlags": 0, - "node": { - "__id__": 17 - }, - "_enabled": true, - "_materials": [ - { - "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" - } - ], - "_srcBlendFactor": 770, - "_dstBlendFactor": 771, - "_spriteFrame": { - "__uuid__": "7d090003-0235-4a00-8b00-000000000235" - }, - "_type": 0, - "_sizeMode": 0, - "_fillType": 0, - "_fillCenter": { - "__type__": "cc.Vec2", - "x": 0, - "y": 0 - }, - "_fillStart": 0, - "_fillRange": 0, - "_isTrimmedMode": true, - "_atlas": null, - "_id": "" - }, - { - "__type__": "cc.PrefabInfo", - "root": { - "__id__": 1 - }, - "asset": { - "__id__": 0 - }, - "fileId": "00000AAAABAAIAAAAAAAAAH", - "sync": false - }, { "__type__": "cc.Node", "_name": "cards", @@ -868,31 +420,31 @@ }, "_children": [ { - "__id__": 24 + "__id__": 12 }, { - "__id__": 43 + "__id__": 41 }, { - "__id__": 62 + "__id__": 67 }, { - "__id__": 81 + "__id__": 96 }, { - "__id__": 100 + "__id__": 133 }, { - "__id__": 119 + "__id__": 162 }, { - "__id__": 138 + "__id__": 199 } ], "_active": true, "_components": [], "_prefab": { - "__id__": 157 + "__id__": 243 }, "_opacity": 255, "_color": { @@ -946,30 +498,30 @@ "_name": "giftDay1", "_objFlags": 0, "_parent": { - "__id__": 23 + "__id__": 11 }, "_children": [ { - "__id__": 25 + "__id__": 13 }, { - "__id__": 29 + "__id__": 17 }, { - "__id__": 35 + "__id__": 33 }, { - "__id__": 38 + "__id__": 36 } ], "_active": true, "_components": [ { - "__id__": 41 + "__id__": 39 } ], "_prefab": { - "__id__": 42 + "__id__": 40 }, "_opacity": 255, "_color": { @@ -1023,27 +575,27 @@ "_name": "dayLabel", "_objFlags": 0, "_parent": { - "__id__": 24 + "__id__": 12 }, "_children": [], "_active": true, "_components": [ { - "__id__": 26 + "__id__": 14 }, { - "__id__": 27 + "__id__": 15 } ], "_prefab": { - "__id__": 28 + "__id__": 16 }, "_opacity": 255, "_color": { "__type__": "cc.Color", - "r": 96, - "g": 66, - "b": 157, + "r": 255, + "g": 255, + "b": 255, "a": 255 }, "_contentSize": { @@ -1090,7 +642,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 25 + "__id__": 13 }, "_enabled": true, "_materials": [ @@ -1100,10 +652,10 @@ ], "_srcBlendFactor": 770, "_dstBlendFactor": 771, - "_string": "第 1 天", - "_N$string": "第 1 天", - "_fontSize": 27, - "_lineHeight": 32, + "_string": "第1天", + "_N$string": "第1天", + "_fontSize": 32, + "_lineHeight": 38, "_enableWrapText": true, "_N$file": null, "_isSystemFontUsed": true, @@ -1123,14 +675,14 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 25 + "__id__": 13 }, "_enabled": true, "_color": { "__type__": "cc.Color", - "r": 0, - "g": 170, - "b": 182, + "r": 242, + "g": 151, + "b": 0, "a": 255 }, "_width": 3, @@ -1149,24 +701,20 @@ }, { "__type__": "cc.Node", - "_name": "rewardIcon", + "_name": "rewardItems", "_objFlags": 0, "_parent": { - "__id__": 24 + "__id__": 12 }, "_children": [ { - "__id__": 30 + "__id__": 18 } ], "_active": true, - "_components": [ - { - "__id__": 33 - } - ], + "_components": [], "_prefab": { - "__id__": 34 + "__id__": 32 }, "_opacity": 255, "_color": { @@ -1178,8 +726,8 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 105, - "height": 100 + "width": 184, + "height": 130 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -1191,7 +739,75 @@ "ctor": "Float64Array", "array": [ 0, - 20, + -11.279, + 0, + 0, + 0, + 0, + 1, + 1.2, + 1.2, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "rewardItem0", + "_objFlags": 0, + "_parent": { + "__id__": 17 + }, + "_children": [ + { + "__id__": 19 + } + ], + "_active": true, + "_components": [ + { + "__id__": 30 + } + ], + "_prefab": { + "__id__": 31 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 106.00000000000001, + "height": 93.62043795620438 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + -4, 0, 0, 0, @@ -1217,33 +833,39 @@ }, { "__type__": "cc.Node", - "_name": "iconLabel", + "_name": "amount", "_objFlags": 0, "_parent": { - "__id__": 29 + "__id__": 18 }, - "_children": [], - "_active": false, - "_components": [ + "_children": [ { - "__id__": 31 + "__id__": 20 + }, + { + "__id__": 23 + }, + { + "__id__": 26 } ], + "_active": true, + "_components": [], "_prefab": { - "__id__": 32 + "__id__": 29 }, "_opacity": 255, "_color": { "__type__": "cc.Color", - "r": 102, - "g": 65, - "b": 166, + "r": 255, + "g": 255, + "b": 255, "a": 255 }, "_contentSize": { "__type__": "cc.Size", - "width": 74, - "height": 64 + "width": 114.99999999999999, + "height": 29.9 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -1255,6 +877,70 @@ "ctor": "Float64Array", "array": [ 0, + -42.81021897810219, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "digit0", + "_objFlags": 0, + "_parent": { + "__id__": 19 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 21 + } + ], + "_prefab": { + "__id__": 22 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 26.577777777777776, + "height": 29.9 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + -40.589814814814815, 0, 0, 0, @@ -1280,11 +966,11 @@ "_id": "" }, { - "__type__": "cc.Label", + "__type__": "cc.Sprite", "_name": "", "_objFlags": 0, "node": { - "__id__": 30 + "__id__": 20 }, "_enabled": true, "_materials": [ @@ -1294,22 +980,21 @@ ], "_srcBlendFactor": 770, "_dstBlendFactor": 771, - "_string": "币", - "_N$string": "币", - "_fontSize": 42, - "_lineHeight": 50, - "_enableWrapText": true, - "_N$file": null, - "_isSystemFontUsed": true, - "_spacingX": 0, - "_batchAsBitmap": false, - "_styleFlags": 1, - "_underlineHeight": 0, - "_N$horizontalAlign": 1, - "_N$verticalAlign": 1, - "_N$fontFamily": "Arial", - "_N$overflow": 1, - "_N$cacheMode": 0, + "_spriteFrame": { + "__uuid__": "b07ae691-b024-416b-a59d-a51a7c496270" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, "_id": "" }, { @@ -1320,7 +1005,232 @@ "asset": { "__id__": 0 }, - "fileId": "00000AAAABAAIAAAAAAAAAN", + "fileId": "bc86965c4ebce6fd20efe5", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "digit1", + "_objFlags": 0, + "_parent": { + "__id__": 19 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 24 + } + ], + "_prefab": { + "__id__": 25 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 26.577777777777776, + "height": 29.9 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + -13.012037037037036, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 23 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "f44c5687-d99f-421e-a179-6dd6806fed68" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "232c454ff8256d66a0aab4", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "digit2", + "_objFlags": 0, + "_parent": { + "__id__": 19 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 27 + } + ], + "_prefab": { + "__id__": 28 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 52.60185185185185, + "height": 27.685185185185183 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 27.577777777777776, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 26 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "f62e9f2e-72b3-4f73-8ecd-d0fd2a2e1b4d" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "3db66708af196cbc72a759", + "sync": false + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "ce7b72631e15471d4066da", "sync": false }, { @@ -1328,7 +1238,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 29 + "__id__": 18 }, "_enabled": true, "_materials": [ @@ -1351,7 +1261,7 @@ }, "_fillStart": 0, "_fillRange": 0, - "_isTrimmedMode": true, + "_isTrimmedMode": false, "_atlas": null, "_id": "" }, @@ -1363,146 +1273,49 @@ "asset": { "__id__": 0 }, - "fileId": "00000AAAABAAIAAAAAAAAAM", + "fileId": "ed37da57209486927daaaf", + "sync": false + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "03f97ff3d8dffe6371e5b2", "sync": false }, { "__type__": "cc.Node", - "_name": "rewardLabel", + "_name": "claimedOverlay", "_objFlags": 0, "_parent": { - "__id__": 24 + "__id__": 12 }, "_children": [], "_active": false, "_components": [ { - "__id__": 36 + "__id__": 34 } ], "_prefab": { - "__id__": 37 - }, - "_opacity": 255, - "_color": { - "__type__": "cc.Color", - "r": 83, - "g": 58, - "b": 130, - "a": 255 - }, - "_contentSize": { - "__type__": "cc.Size", - "width": 195, - "height": 58 - }, - "_anchorPoint": { - "__type__": "cc.Vec2", - "x": 0.5, - "y": 0.5 - }, - "_trs": { - "__type__": "TypedArray", - "ctor": "Float64Array", - "array": [ - 0, - -53, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1 - ] - }, - "_eulerAngles": { - "__type__": "cc.Vec3", - "x": 0, - "y": 0, - "z": 0 - }, - "_skewX": 0, - "_skewY": 0, - "_is3DNode": false, - "_groupIndex": 0, - "groupIndex": 0, - "_id": "" - }, - { - "__type__": "cc.Label", - "_name": "", - "_objFlags": 0, - "node": { "__id__": 35 }, - "_enabled": true, - "_materials": [ - { - "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" - } - ], - "_srcBlendFactor": 770, - "_dstBlendFactor": 771, - "_string": "无限体力 15分钟", - "_N$string": "无限体力 15分钟", - "_fontSize": 22, - "_lineHeight": 25, - "_enableWrapText": true, - "_N$file": null, - "_isSystemFontUsed": true, - "_spacingX": 0, - "_batchAsBitmap": false, - "_styleFlags": 1, - "_underlineHeight": 0, - "_N$horizontalAlign": 1, - "_N$verticalAlign": 1, - "_N$fontFamily": "Arial", - "_N$overflow": 1, - "_N$cacheMode": 0, - "_id": "" - }, - { - "__type__": "cc.PrefabInfo", - "root": { - "__id__": 1 - }, - "asset": { - "__id__": 0 - }, - "fileId": "00000AAAABAAIAAAAAAAAAO", - "sync": false - }, - { - "__type__": "cc.Node", - "_name": "statusLabel", - "_objFlags": 0, - "_parent": { - "__id__": 24 - }, - "_children": [], - "_active": false, - "_components": [ - { - "__id__": 39 - } - ], - "_prefab": { - "__id__": 40 - }, "_opacity": 255, "_color": { "__type__": "cc.Color", - "r": 112, - "g": 96, - "b": 137, + "r": 255, + "g": 255, + "b": 255, "a": 255 }, "_contentSize": { "__type__": "cc.Size", - "width": 160, - "height": 42 + "width": 218, + "height": 238 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -1514,7 +1327,7 @@ "ctor": "Float64Array", "array": [ 0, - -95, + 0, 0, 0, 0, @@ -1538,56 +1351,12 @@ "groupIndex": 0, "_id": "" }, - { - "__type__": "cc.Label", - "_name": "", - "_objFlags": 0, - "node": { - "__id__": 38 - }, - "_enabled": true, - "_materials": [ - { - "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" - } - ], - "_srcBlendFactor": 770, - "_dstBlendFactor": 771, - "_string": "点击领取", - "_N$string": "点击领取", - "_fontSize": 22, - "_lineHeight": 28, - "_enableWrapText": true, - "_N$file": null, - "_isSystemFontUsed": true, - "_spacingX": 0, - "_batchAsBitmap": false, - "_styleFlags": 1, - "_underlineHeight": 0, - "_N$horizontalAlign": 1, - "_N$verticalAlign": 1, - "_N$fontFamily": "Arial", - "_N$overflow": 1, - "_N$cacheMode": 0, - "_id": "" - }, - { - "__type__": "cc.PrefabInfo", - "root": { - "__id__": 1 - }, - "asset": { - "__id__": 0 - }, - "fileId": "00000AAAABAAIAAAAAAAAAP", - "sync": false - }, { "__type__": "cc.Sprite", "_name": "", "_objFlags": 0, "node": { - "__id__": 24 + "__id__": 33 }, "_enabled": true, "_materials": [ @@ -1598,7 +1367,157 @@ "_srcBlendFactor": 770, "_dstBlendFactor": 771, "_spriteFrame": { - "__uuid__": "7d090003-0201-4a00-8b00-000000000201" + "__uuid__": "7d090003-0213-4a00-8b00-000000000213" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "6051abccfbb80bc419762b", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "claimedBadge", + "_objFlags": 0, + "_parent": { + "__id__": 12 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 37 + } + ], + "_prefab": { + "__id__": 38 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 118, + "height": 99 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 36 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "7d090003-0211-4a00-8b00-000000000211" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "d24b4c421bd6e3426eeb55", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 12 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "7d090003-0205-4a00-8b00-000000000205" }, "_type": 0, "_sizeMode": 0, @@ -1630,30 +1549,30 @@ "_name": "giftDay2", "_objFlags": 0, "_parent": { - "__id__": 23 + "__id__": 11 }, "_children": [ { - "__id__": 44 + "__id__": 42 }, { - "__id__": 48 + "__id__": 46 }, { - "__id__": 54 + "__id__": 59 }, { - "__id__": 57 + "__id__": 62 } ], "_active": true, "_components": [ { - "__id__": 60 + "__id__": 65 } ], "_prefab": { - "__id__": 61 + "__id__": 66 }, "_opacity": 255, "_color": { @@ -1707,27 +1626,27 @@ "_name": "dayLabel", "_objFlags": 0, "_parent": { - "__id__": 43 + "__id__": 41 }, "_children": [], "_active": true, "_components": [ { - "__id__": 45 + "__id__": 43 }, { - "__id__": 46 + "__id__": 44 } ], "_prefab": { - "__id__": 47 + "__id__": 45 }, "_opacity": 255, "_color": { "__type__": "cc.Color", - "r": 96, - "g": 66, - "b": 157, + "r": 255, + "g": 255, + "b": 255, "a": 255 }, "_contentSize": { @@ -1774,7 +1693,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 44 + "__id__": 42 }, "_enabled": true, "_materials": [ @@ -1784,10 +1703,10 @@ ], "_srcBlendFactor": 770, "_dstBlendFactor": 771, - "_string": "第 2 天", - "_N$string": "第 2 天", - "_fontSize": 27, - "_lineHeight": 32, + "_string": "第2天", + "_N$string": "第2天", + "_fontSize": 32, + "_lineHeight": 38, "_enableWrapText": true, "_N$file": null, "_isSystemFontUsed": true, @@ -1807,14 +1726,14 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 44 + "__id__": 42 }, "_enabled": true, "_color": { "__type__": "cc.Color", - "r": 242, - "g": 151, - "b": 0, + "r": 0, + "g": 170, + "b": 182, "a": 255 }, "_width": 3, @@ -1833,24 +1752,20 @@ }, { "__type__": "cc.Node", - "_name": "rewardIcon", + "_name": "rewardItems", "_objFlags": 0, "_parent": { - "__id__": 43 + "__id__": 41 }, "_children": [ { - "__id__": 49 + "__id__": 47 } ], "_active": true, - "_components": [ - { - "__id__": 52 - } - ], + "_components": [], "_prefab": { - "__id__": 53 + "__id__": 58 }, "_opacity": 255, "_color": { @@ -1862,8 +1777,8 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 105, - "height": 100 + "width": 184, + "height": 130 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -1875,7 +1790,75 @@ "ctor": "Float64Array", "array": [ 0, - 20, + -11.279, + 0, + 0, + 0, + 0, + 1, + 1.2, + 1.2, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "rewardItem0", + "_objFlags": 0, + "_parent": { + "__id__": 46 + }, + "_children": [ + { + "__id__": 48 + } + ], + "_active": true, + "_components": [ + { + "__id__": 56 + } + ], + "_prefab": { + "__id__": 57 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 106, + "height": 106 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + -4, 0, 0, 0, @@ -1901,13 +1884,80 @@ }, { "__type__": "cc.Node", - "_name": "iconLabel", + "_name": "amount", + "_objFlags": 0, + "_parent": { + "__id__": 47 + }, + "_children": [ + { + "__id__": 49 + }, + { + "__id__": 52 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 55 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 114.99999999999999, + "height": 29.9 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 31.945159399906238, + -49, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "digit0", "_objFlags": 0, "_parent": { "__id__": 48 }, "_children": [], - "_active": false, + "_active": true, "_components": [ { "__id__": 50 @@ -1919,15 +1969,15 @@ "_opacity": 255, "_color": { "__type__": "cc.Color", - "r": 102, - "g": 65, - "b": 166, + "r": 255, + "g": 255, + "b": 255, "a": 255 }, "_contentSize": { "__type__": "cc.Size", - "width": 74, - "height": 64 + "width": 17.164814814814815, + "height": 17.71851851851852 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -1938,7 +1988,7 @@ "__type__": "TypedArray", "ctor": "Float64Array", "array": [ - 0, + -13.788888888888886, 0, 0, 0, @@ -1964,7 +2014,7 @@ "_id": "" }, { - "__type__": "cc.Label", + "__type__": "cc.Sprite", "_name": "", "_objFlags": 0, "node": { @@ -1978,22 +2028,21 @@ ], "_srcBlendFactor": 770, "_dstBlendFactor": 771, - "_string": "锤", - "_N$string": "锤", - "_fontSize": 42, - "_lineHeight": 50, - "_enableWrapText": true, - "_N$file": null, - "_isSystemFontUsed": true, - "_spacingX": 0, - "_batchAsBitmap": false, - "_styleFlags": 1, - "_underlineHeight": 0, - "_N$horizontalAlign": 1, - "_N$verticalAlign": 1, - "_N$fontFamily": "Arial", - "_N$overflow": 1, - "_N$cacheMode": 0, + "_spriteFrame": { + "__uuid__": "6fe4bf3a-562d-4fc9-82bc-0378b0041112" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, "_id": "" }, { @@ -2004,7 +2053,125 @@ "asset": { "__id__": 0 }, - "fileId": "00000AAAABAAIAAAAAAAAAT", + "fileId": "499a4f53275bfdbe18ced9", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "digit1", + "_objFlags": 0, + "_parent": { + "__id__": 48 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 53 + } + ], + "_prefab": { + "__id__": 54 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 26.577777777777776, + "height": 29.9 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 9.082407407407409, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 52 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "b07ae691-b024-416b-a59d-a51a7c496270" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "972ceda69cdf9b5d7b8492", + "sync": false + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "a161273a13b52160a0877b", "sync": false }, { @@ -2012,7 +2179,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 48 + "__id__": 47 }, "_enabled": true, "_materials": [ @@ -2035,7 +2202,7 @@ }, "_fillStart": 0, "_fillRange": 0, - "_isTrimmedMode": true, + "_isTrimmedMode": false, "_atlas": null, "_id": "" }, @@ -2047,38 +2214,49 @@ "asset": { "__id__": 0 }, - "fileId": "00000AAAABAAIAAAAAAAAAS", + "fileId": "755486ff8b06c888b6288f", + "sync": false + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "15b524ef7eb3517f7d906a", "sync": false }, { "__type__": "cc.Node", - "_name": "rewardLabel", + "_name": "claimedOverlay", "_objFlags": 0, "_parent": { - "__id__": 43 + "__id__": 41 }, "_children": [], "_active": false, "_components": [ { - "__id__": 55 + "__id__": 60 } ], "_prefab": { - "__id__": 56 + "__id__": 61 }, "_opacity": 255, "_color": { "__type__": "cc.Color", - "r": 83, - "g": 58, - "b": 130, + "r": 255, + "g": 255, + "b": 255, "a": 255 }, "_contentSize": { "__type__": "cc.Size", - "width": 195, - "height": 58 + "width": 218, + "height": 238 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -2090,7 +2268,7 @@ "ctor": "Float64Array", "array": [ 0, - -53, + 0, 0, 0, 0, @@ -2114,164 +2292,12 @@ "groupIndex": 0, "_id": "" }, - { - "__type__": "cc.Label", - "_name": "", - "_objFlags": 0, - "node": { - "__id__": 54 - }, - "_enabled": true, - "_materials": [ - { - "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" - } - ], - "_srcBlendFactor": 770, - "_dstBlendFactor": 771, - "_string": "锤子 ×1", - "_N$string": "锤子 ×1", - "_fontSize": 22, - "_lineHeight": 25, - "_enableWrapText": true, - "_N$file": null, - "_isSystemFontUsed": true, - "_spacingX": 0, - "_batchAsBitmap": false, - "_styleFlags": 1, - "_underlineHeight": 0, - "_N$horizontalAlign": 1, - "_N$verticalAlign": 1, - "_N$fontFamily": "Arial", - "_N$overflow": 1, - "_N$cacheMode": 0, - "_id": "" - }, - { - "__type__": "cc.PrefabInfo", - "root": { - "__id__": 1 - }, - "asset": { - "__id__": 0 - }, - "fileId": "00000AAAABAAIAAAAAAAAAU", - "sync": false - }, - { - "__type__": "cc.Node", - "_name": "statusLabel", - "_objFlags": 0, - "_parent": { - "__id__": 43 - }, - "_children": [], - "_active": false, - "_components": [ - { - "__id__": 58 - } - ], - "_prefab": { - "__id__": 59 - }, - "_opacity": 255, - "_color": { - "__type__": "cc.Color", - "r": 112, - "g": 96, - "b": 137, - "a": 255 - }, - "_contentSize": { - "__type__": "cc.Size", - "width": 160, - "height": 42 - }, - "_anchorPoint": { - "__type__": "cc.Vec2", - "x": 0.5, - "y": 0.5 - }, - "_trs": { - "__type__": "TypedArray", - "ctor": "Float64Array", - "array": [ - 0, - -95, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1 - ] - }, - "_eulerAngles": { - "__type__": "cc.Vec3", - "x": 0, - "y": 0, - "z": 0 - }, - "_skewX": 0, - "_skewY": 0, - "_is3DNode": false, - "_groupIndex": 0, - "groupIndex": 0, - "_id": "" - }, - { - "__type__": "cc.Label", - "_name": "", - "_objFlags": 0, - "node": { - "__id__": 57 - }, - "_enabled": true, - "_materials": [ - { - "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" - } - ], - "_srcBlendFactor": 770, - "_dstBlendFactor": 771, - "_string": "未解锁", - "_N$string": "未解锁", - "_fontSize": 22, - "_lineHeight": 28, - "_enableWrapText": true, - "_N$file": null, - "_isSystemFontUsed": true, - "_spacingX": 0, - "_batchAsBitmap": false, - "_styleFlags": 1, - "_underlineHeight": 0, - "_N$horizontalAlign": 1, - "_N$verticalAlign": 1, - "_N$fontFamily": "Arial", - "_N$overflow": 1, - "_N$cacheMode": 0, - "_id": "" - }, - { - "__type__": "cc.PrefabInfo", - "root": { - "__id__": 1 - }, - "asset": { - "__id__": 0 - }, - "fileId": "00000AAAABAAIAAAAAAAAAV", - "sync": false - }, { "__type__": "cc.Sprite", "_name": "", "_objFlags": 0, "node": { - "__id__": 43 + "__id__": 59 }, "_enabled": true, "_materials": [ @@ -2282,7 +2308,157 @@ "_srcBlendFactor": 770, "_dstBlendFactor": 771, "_spriteFrame": { - "__uuid__": "7d090003-0205-4a00-8b00-000000000205" + "__uuid__": "7d090003-0213-4a00-8b00-000000000213" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "c45b2a6811a823842d4138", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "claimedBadge", + "_objFlags": 0, + "_parent": { + "__id__": 41 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 63 + } + ], + "_prefab": { + "__id__": 64 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 118, + "height": 99 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 62 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "7d090003-0211-4a00-8b00-000000000211" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "685cbf3e5e4e6eb016f702", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 41 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "7d090003-0201-4a00-8b00-000000000201" }, "_type": 0, "_sizeMode": 0, @@ -2314,30 +2490,30 @@ "_name": "giftDay3", "_objFlags": 0, "_parent": { - "__id__": 23 + "__id__": 11 }, "_children": [ { - "__id__": 63 + "__id__": 68 }, { - "__id__": 67 + "__id__": 72 }, { - "__id__": 73 + "__id__": 88 }, { - "__id__": 76 + "__id__": 91 } ], "_active": true, "_components": [ { - "__id__": 79 + "__id__": 94 } ], "_prefab": { - "__id__": 80 + "__id__": 95 }, "_opacity": 255, "_color": { @@ -2391,27 +2567,27 @@ "_name": "dayLabel", "_objFlags": 0, "_parent": { - "__id__": 62 + "__id__": 67 }, "_children": [], "_active": true, "_components": [ { - "__id__": 64 + "__id__": 69 }, { - "__id__": 65 + "__id__": 70 } ], "_prefab": { - "__id__": 66 + "__id__": 71 }, "_opacity": 255, "_color": { "__type__": "cc.Color", - "r": 96, - "g": 66, - "b": 157, + "r": 255, + "g": 255, + "b": 255, "a": 255 }, "_contentSize": { @@ -2453,200 +2629,6 @@ "groupIndex": 0, "_id": "" }, - { - "__type__": "cc.Label", - "_name": "", - "_objFlags": 0, - "node": { - "__id__": 63 - }, - "_enabled": true, - "_materials": [ - { - "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" - } - ], - "_srcBlendFactor": 770, - "_dstBlendFactor": 771, - "_string": "第 3 天", - "_N$string": "第 3 天", - "_fontSize": 27, - "_lineHeight": 32, - "_enableWrapText": true, - "_N$file": null, - "_isSystemFontUsed": true, - "_spacingX": 0, - "_batchAsBitmap": false, - "_styleFlags": 1, - "_underlineHeight": 0, - "_N$horizontalAlign": 1, - "_N$verticalAlign": 1, - "_N$fontFamily": "Arial", - "_N$overflow": 1, - "_N$cacheMode": 0, - "_id": "" - }, - { - "__type__": "cc.LabelOutline", - "_name": "", - "_objFlags": 0, - "node": { - "__id__": 63 - }, - "_enabled": true, - "_color": { - "__type__": "cc.Color", - "r": 0, - "g": 170, - "b": 182, - "a": 255 - }, - "_width": 3, - "_id": "" - }, - { - "__type__": "cc.PrefabInfo", - "root": { - "__id__": 1 - }, - "asset": { - "__id__": 0 - }, - "fileId": "00000AAAABAAIAAAAAAAAAX", - "sync": false - }, - { - "__type__": "cc.Node", - "_name": "rewardIcon", - "_objFlags": 0, - "_parent": { - "__id__": 62 - }, - "_children": [ - { - "__id__": 68 - } - ], - "_active": true, - "_components": [ - { - "__id__": 71 - } - ], - "_prefab": { - "__id__": 72 - }, - "_opacity": 255, - "_color": { - "__type__": "cc.Color", - "r": 255, - "g": 255, - "b": 255, - "a": 255 - }, - "_contentSize": { - "__type__": "cc.Size", - "width": 105, - "height": 100 - }, - "_anchorPoint": { - "__type__": "cc.Vec2", - "x": 0.5, - "y": 0.5 - }, - "_trs": { - "__type__": "TypedArray", - "ctor": "Float64Array", - "array": [ - 0, - 20, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1 - ] - }, - "_eulerAngles": { - "__type__": "cc.Vec3", - "x": 0, - "y": 0, - "z": 0 - }, - "_skewX": 0, - "_skewY": 0, - "_is3DNode": false, - "_groupIndex": 0, - "groupIndex": 0, - "_id": "" - }, - { - "__type__": "cc.Node", - "_name": "iconLabel", - "_objFlags": 0, - "_parent": { - "__id__": 67 - }, - "_children": [], - "_active": false, - "_components": [ - { - "__id__": 69 - } - ], - "_prefab": { - "__id__": 70 - }, - "_opacity": 255, - "_color": { - "__type__": "cc.Color", - "r": 102, - "g": 65, - "b": 166, - "a": 255 - }, - "_contentSize": { - "__type__": "cc.Size", - "width": 74, - "height": 64 - }, - "_anchorPoint": { - "__type__": "cc.Vec2", - "x": 0.5, - "y": 0.5 - }, - "_trs": { - "__type__": "TypedArray", - "ctor": "Float64Array", - "array": [ - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1 - ] - }, - "_eulerAngles": { - "__type__": "cc.Vec3", - "x": 0, - "y": 0, - "z": 0 - }, - "_skewX": 0, - "_skewY": 0, - "_is3DNode": false, - "_groupIndex": 0, - "groupIndex": 0, - "_id": "" - }, { "__type__": "cc.Label", "_name": "", @@ -2662,10 +2644,10 @@ ], "_srcBlendFactor": 770, "_dstBlendFactor": 771, - "_string": "冰", - "_N$string": "冰", - "_fontSize": 42, - "_lineHeight": 50, + "_string": "第3天", + "_N$string": "第3天", + "_fontSize": 32, + "_lineHeight": 38, "_enableWrapText": true, "_N$file": null, "_isSystemFontUsed": true, @@ -2680,6 +2662,24 @@ "_N$cacheMode": 0, "_id": "" }, + { + "__type__": "cc.LabelOutline", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 68 + }, + "_enabled": true, + "_color": { + "__type__": "cc.Color", + "r": 0, + "g": 170, + "b": 182, + "a": 255 + }, + "_width": 3, + "_id": "" + }, { "__type__": "cc.PrefabInfo", "root": { @@ -2688,7 +2688,541 @@ "asset": { "__id__": 0 }, - "fileId": "00000AAAABAAIAAAAAAAAAZ", + "fileId": "00000AAAABAAIAAAAAAAAAX", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "rewardItems", + "_objFlags": 0, + "_parent": { + "__id__": 67 + }, + "_children": [ + { + "__id__": 73 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 87 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 184, + "height": 130 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + -11.279, + 0, + 0, + 0, + 0, + 1, + 1.2, + 1.2, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "rewardItem0", + "_objFlags": 0, + "_parent": { + "__id__": 72 + }, + "_children": [ + { + "__id__": 74 + } + ], + "_active": true, + "_components": [ + { + "__id__": 85 + } + ], + "_prefab": { + "__id__": 86 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 106.00000000000001, + "height": 93.62043795620438 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + -4, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "amount", + "_objFlags": 0, + "_parent": { + "__id__": 73 + }, + "_children": [ + { + "__id__": 75 + }, + { + "__id__": 78 + }, + { + "__id__": 81 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 84 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 114.99999999999999, + "height": 29.9 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + -42.81021897810219, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "digit0", + "_objFlags": 0, + "_parent": { + "__id__": 74 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 76 + } + ], + "_prefab": { + "__id__": 77 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 26.577777777777776, + "height": 29.9 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + -40.589814814814815, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 75 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "181f0a08-d1b8-4edb-ad3e-3895e5d64d78" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "81f7bcf7b80c2de2d07319", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "digit1", + "_objFlags": 0, + "_parent": { + "__id__": 74 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 79 + } + ], + "_prefab": { + "__id__": 80 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 26.577777777777776, + "height": 29.9 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + -13.012037037037036, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 78 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "837772ce-3a48-4bcb-9ba2-2bda8204fd74" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "8504c512442f25a0277b53", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "digit2", + "_objFlags": 0, + "_parent": { + "__id__": 74 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 82 + } + ], + "_prefab": { + "__id__": 83 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 52.60185185185185, + "height": 27.685185185185183 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 27.577777777777776, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 81 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "f62e9f2e-72b3-4f73-8ecd-d0fd2a2e1b4d" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "019ca419735412ca03a50e", + "sync": false + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "d408a0c67b94df30f4f4d1", "sync": false }, { @@ -2696,7 +3230,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 67 + "__id__": 73 }, "_enabled": true, "_materials": [ @@ -2719,7 +3253,7 @@ }, "_fillStart": 0, "_fillRange": 0, - "_isTrimmedMode": true, + "_isTrimmedMode": false, "_atlas": null, "_id": "" }, @@ -2731,38 +3265,49 @@ "asset": { "__id__": 0 }, - "fileId": "00000AAAABAAIAAAAAAAAAY", + "fileId": "6d532b90a01d5ff181b5b1", + "sync": false + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "2ada8877988206dad333ca", "sync": false }, { "__type__": "cc.Node", - "_name": "rewardLabel", + "_name": "claimedOverlay", "_objFlags": 0, "_parent": { - "__id__": 62 + "__id__": 67 }, "_children": [], "_active": false, "_components": [ { - "__id__": 74 + "__id__": 89 } ], "_prefab": { - "__id__": 75 + "__id__": 90 }, "_opacity": 255, "_color": { "__type__": "cc.Color", - "r": 83, - "g": 58, - "b": 130, + "r": 255, + "g": 255, + "b": 255, "a": 255 }, "_contentSize": { "__type__": "cc.Size", - "width": 195, - "height": 58 + "width": 218, + "height": 238 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -2774,7 +3319,7 @@ "ctor": "Float64Array", "array": [ 0, - -53, + 0, 0, 0, 0, @@ -2798,164 +3343,12 @@ "groupIndex": 0, "_id": "" }, - { - "__type__": "cc.Label", - "_name": "", - "_objFlags": 0, - "node": { - "__id__": 73 - }, - "_enabled": true, - "_materials": [ - { - "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" - } - ], - "_srcBlendFactor": 770, - "_dstBlendFactor": 771, - "_string": "无限体力 30分钟", - "_N$string": "无限体力 30分钟", - "_fontSize": 22, - "_lineHeight": 25, - "_enableWrapText": true, - "_N$file": null, - "_isSystemFontUsed": true, - "_spacingX": 0, - "_batchAsBitmap": false, - "_styleFlags": 1, - "_underlineHeight": 0, - "_N$horizontalAlign": 1, - "_N$verticalAlign": 1, - "_N$fontFamily": "Arial", - "_N$overflow": 1, - "_N$cacheMode": 0, - "_id": "" - }, - { - "__type__": "cc.PrefabInfo", - "root": { - "__id__": 1 - }, - "asset": { - "__id__": 0 - }, - "fileId": "00000AAAABAAIAAAAAAAAAa", - "sync": false - }, - { - "__type__": "cc.Node", - "_name": "statusLabel", - "_objFlags": 0, - "_parent": { - "__id__": 62 - }, - "_children": [], - "_active": false, - "_components": [ - { - "__id__": 77 - } - ], - "_prefab": { - "__id__": 78 - }, - "_opacity": 255, - "_color": { - "__type__": "cc.Color", - "r": 112, - "g": 96, - "b": 137, - "a": 255 - }, - "_contentSize": { - "__type__": "cc.Size", - "width": 160, - "height": 42 - }, - "_anchorPoint": { - "__type__": "cc.Vec2", - "x": 0.5, - "y": 0.5 - }, - "_trs": { - "__type__": "TypedArray", - "ctor": "Float64Array", - "array": [ - 0, - -95, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1 - ] - }, - "_eulerAngles": { - "__type__": "cc.Vec3", - "x": 0, - "y": 0, - "z": 0 - }, - "_skewX": 0, - "_skewY": 0, - "_is3DNode": false, - "_groupIndex": 0, - "groupIndex": 0, - "_id": "" - }, - { - "__type__": "cc.Label", - "_name": "", - "_objFlags": 0, - "node": { - "__id__": 76 - }, - "_enabled": true, - "_materials": [ - { - "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" - } - ], - "_srcBlendFactor": 770, - "_dstBlendFactor": 771, - "_string": "未解锁", - "_N$string": "未解锁", - "_fontSize": 22, - "_lineHeight": 28, - "_enableWrapText": true, - "_N$file": null, - "_isSystemFontUsed": true, - "_spacingX": 0, - "_batchAsBitmap": false, - "_styleFlags": 1, - "_underlineHeight": 0, - "_N$horizontalAlign": 1, - "_N$verticalAlign": 1, - "_N$fontFamily": "Arial", - "_N$overflow": 1, - "_N$cacheMode": 0, - "_id": "" - }, - { - "__type__": "cc.PrefabInfo", - "root": { - "__id__": 1 - }, - "asset": { - "__id__": 0 - }, - "fileId": "00000AAAABAAIAAAAAAAAAb", - "sync": false - }, { "__type__": "cc.Sprite", "_name": "", "_objFlags": 0, "node": { - "__id__": 62 + "__id__": 88 }, "_enabled": true, "_materials": [ @@ -2966,7 +3359,157 @@ "_srcBlendFactor": 770, "_dstBlendFactor": 771, "_spriteFrame": { - "__uuid__": "7d090003-0205-4a00-8b00-000000000205" + "__uuid__": "7d090003-0213-4a00-8b00-000000000213" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "2f7f72e604ae17a3d34fdb", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "claimedBadge", + "_objFlags": 0, + "_parent": { + "__id__": 67 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 92 + } + ], + "_prefab": { + "__id__": 93 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 118, + "height": 99 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 91 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "7d090003-0211-4a00-8b00-000000000211" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "94c212ec16ea29a7571e5b", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 67 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "7d090003-0201-4a00-8b00-000000000201" }, "_type": 0, "_sizeMode": 0, @@ -2998,30 +3541,30 @@ "_name": "giftDay4", "_objFlags": 0, "_parent": { - "__id__": 23 + "__id__": 11 }, "_children": [ { - "__id__": 82 + "__id__": 97 }, { - "__id__": 86 + "__id__": 101 }, { - "__id__": 92 + "__id__": 125 }, { - "__id__": 95 + "__id__": 128 } ], "_active": true, "_components": [ { - "__id__": 98 + "__id__": 131 } ], "_prefab": { - "__id__": 99 + "__id__": 132 }, "_opacity": 255, "_color": { @@ -3075,27 +3618,27 @@ "_name": "dayLabel", "_objFlags": 0, "_parent": { - "__id__": 81 + "__id__": 96 }, "_children": [], "_active": true, "_components": [ { - "__id__": 83 + "__id__": 98 }, { - "__id__": 84 + "__id__": 99 } ], "_prefab": { - "__id__": 85 + "__id__": 100 }, "_opacity": 255, "_color": { "__type__": "cc.Color", - "r": 96, - "g": 66, - "b": 157, + "r": 255, + "g": 255, + "b": 255, "a": 255 }, "_contentSize": { @@ -3142,7 +3685,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 82 + "__id__": 97 }, "_enabled": true, "_materials": [ @@ -3152,10 +3695,10 @@ ], "_srcBlendFactor": 770, "_dstBlendFactor": 771, - "_string": "第 4 天", - "_N$string": "第 4 天", - "_fontSize": 27, - "_lineHeight": 32, + "_string": "第4天", + "_N$string": "第4天", + "_fontSize": 32, + "_lineHeight": 38, "_enableWrapText": true, "_N$file": null, "_isSystemFontUsed": true, @@ -3175,7 +3718,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 82 + "__id__": 97 }, "_enabled": true, "_color": { @@ -3201,24 +3744,23 @@ }, { "__type__": "cc.Node", - "_name": "rewardIcon", + "_name": "rewardItems", "_objFlags": 0, "_parent": { - "__id__": 81 + "__id__": 96 }, "_children": [ { - "__id__": 87 + "__id__": 102 + }, + { + "__id__": 113 } ], "_active": true, - "_components": [ - { - "__id__": 90 - } - ], + "_components": [], "_prefab": { - "__id__": 91 + "__id__": 124 }, "_opacity": 255, "_color": { @@ -3230,8 +3772,8 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 105, - "height": 100 + "width": 184, + "height": 130 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -3243,7 +3785,7 @@ "ctor": "Float64Array", "array": [ 0, - 20, + -11.279, 0, 0, 0, @@ -3269,33 +3811,37 @@ }, { "__type__": "cc.Node", - "_name": "iconLabel", + "_name": "rewardItem0", "_objFlags": 0, "_parent": { - "__id__": 86 + "__id__": 101 }, - "_children": [], - "_active": false, + "_children": [ + { + "__id__": 103 + } + ], + "_active": true, "_components": [ { - "__id__": 88 + "__id__": 111 } ], "_prefab": { - "__id__": 89 + "__id__": 112 }, "_opacity": 255, "_color": { "__type__": "cc.Color", - "r": 102, - "g": 65, - "b": 166, + "r": 255, + "g": 255, + "b": 255, "a": 255 }, "_contentSize": { "__type__": "cc.Size", - "width": 74, - "height": 64 + "width": 92, + "height": 92 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -3306,10 +3852,141 @@ "__type__": "TypedArray", "ctor": "Float64Array", "array": [ + -46, + -4, 0, 0, 0, 0, + 1, + 1.1, + 1.1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "amount", + "_objFlags": 0, + "_parent": { + "__id__": 102 + }, + "_children": [ + { + "__id__": 104 + }, + { + "__id__": 107 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 110 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 101.19999999999999, + "height": 29.9 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 16.5654125644632, + -41.41772151898734, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "digit0", + "_objFlags": 0, + "_parent": { + "__id__": 103 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 105 + } + ], + "_prefab": { + "__id__": 106 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 17.164814814814815, + "height": 17.71851851851852 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + -13.788888888888886, + 0, + 0, + 0, 0, 0, 1, @@ -3332,11 +4009,11 @@ "_id": "" }, { - "__type__": "cc.Label", + "__type__": "cc.Sprite", "_name": "", "_objFlags": 0, "node": { - "__id__": 87 + "__id__": 104 }, "_enabled": true, "_materials": [ @@ -3346,22 +4023,21 @@ ], "_srcBlendFactor": 770, "_dstBlendFactor": 771, - "_string": "杖", - "_N$string": "杖", - "_fontSize": 42, - "_lineHeight": 50, - "_enableWrapText": true, - "_N$file": null, - "_isSystemFontUsed": true, - "_spacingX": 0, - "_batchAsBitmap": false, - "_styleFlags": 1, - "_underlineHeight": 0, - "_N$horizontalAlign": 1, - "_N$verticalAlign": 1, - "_N$fontFamily": "Arial", - "_N$overflow": 1, - "_N$cacheMode": 0, + "_spriteFrame": { + "__uuid__": "6fe4bf3a-562d-4fc9-82bc-0378b0041112" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, "_id": "" }, { @@ -3372,7 +4048,125 @@ "asset": { "__id__": 0 }, - "fileId": "00000AAAABAAIAAAAAAAAAf", + "fileId": "135f307083e1ee829e7466", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "digit1", + "_objFlags": 0, + "_parent": { + "__id__": 103 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 108 + } + ], + "_prefab": { + "__id__": 109 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 26.577777777777776, + "height": 29.9 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 9.082407407407409, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 107 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "b07ae691-b024-416b-a59d-a51a7c496270" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "c12f3bf54df062f0d676b5", + "sync": false + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "7d87504c068694acf465fa", "sync": false }, { @@ -3380,7 +4174,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 86 + "__id__": 102 }, "_enabled": true, "_materials": [ @@ -3403,7 +4197,7 @@ }, "_fillStart": 0, "_fillRange": 0, - "_isTrimmedMode": true, + "_isTrimmedMode": false, "_atlas": null, "_id": "" }, @@ -3415,38 +4209,42 @@ "asset": { "__id__": 0 }, - "fileId": "00000AAAABAAIAAAAAAAAAe", + "fileId": "f22e18e93369f9b7590b8b", "sync": false }, { "__type__": "cc.Node", - "_name": "rewardLabel", + "_name": "rewardItem1", "_objFlags": 0, "_parent": { - "__id__": 81 + "__id__": 101 }, - "_children": [], - "_active": false, + "_children": [ + { + "__id__": 114 + } + ], + "_active": true, "_components": [ { - "__id__": 93 + "__id__": 122 } ], "_prefab": { - "__id__": 94 + "__id__": 123 }, "_opacity": 255, "_color": { "__type__": "cc.Color", - "r": 83, - "g": 58, - "b": 130, + "r": 255, + "g": 255, + "b": 255, "a": 255 }, "_contentSize": { "__type__": "cc.Size", - "width": 195, - "height": 58 + "width": 92, + "height": 92 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -3457,8 +4255,75 @@ "__type__": "TypedArray", "ctor": "Float64Array", "array": [ + 46, + -4, 0, - -53, + 0, + 0, + 0, + 1, + 1.1, + 1.1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "amount", + "_objFlags": 0, + "_parent": { + "__id__": 113 + }, + "_children": [ + { + "__id__": 115 + }, + { + "__id__": 118 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 121 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 101.19999999999999, + "height": 29.9 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 25.299589779653076, + -41.41772151898734, 0, 0, 0, @@ -3482,79 +4347,35 @@ "groupIndex": 0, "_id": "" }, - { - "__type__": "cc.Label", - "_name": "", - "_objFlags": 0, - "node": { - "__id__": 92 - }, - "_enabled": true, - "_materials": [ - { - "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" - } - ], - "_srcBlendFactor": 770, - "_dstBlendFactor": 771, - "_string": "冻结 ×1\n魔法棒 ×1", - "_N$string": "冻结 ×1\n魔法棒 ×1", - "_fontSize": 22, - "_lineHeight": 25, - "_enableWrapText": true, - "_N$file": null, - "_isSystemFontUsed": true, - "_spacingX": 0, - "_batchAsBitmap": false, - "_styleFlags": 1, - "_underlineHeight": 0, - "_N$horizontalAlign": 1, - "_N$verticalAlign": 1, - "_N$fontFamily": "Arial", - "_N$overflow": 1, - "_N$cacheMode": 0, - "_id": "" - }, - { - "__type__": "cc.PrefabInfo", - "root": { - "__id__": 1 - }, - "asset": { - "__id__": 0 - }, - "fileId": "00000AAAABAAIAAAAAAAAAg", - "sync": false - }, { "__type__": "cc.Node", - "_name": "statusLabel", + "_name": "digit0", "_objFlags": 0, "_parent": { - "__id__": 81 + "__id__": 114 }, "_children": [], - "_active": false, + "_active": true, "_components": [ { - "__id__": 96 + "__id__": 116 } ], "_prefab": { - "__id__": 97 + "__id__": 117 }, "_opacity": 255, "_color": { "__type__": "cc.Color", - "r": 112, - "g": 96, - "b": 137, + "r": 255, + "g": 255, + "b": 255, "a": 255 }, "_contentSize": { "__type__": "cc.Size", - "width": 160, - "height": 42 + "width": 17.164814814814815, + "height": 17.71851851851852 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -3565,8 +4386,8 @@ "__type__": "TypedArray", "ctor": "Float64Array", "array": [ + -13.788888888888886, 0, - -95, 0, 0, 0, @@ -3591,11 +4412,11 @@ "_id": "" }, { - "__type__": "cc.Label", + "__type__": "cc.Sprite", "_name": "", "_objFlags": 0, "node": { - "__id__": 95 + "__id__": 115 }, "_enabled": true, "_materials": [ @@ -3605,22 +4426,21 @@ ], "_srcBlendFactor": 770, "_dstBlendFactor": 771, - "_string": "未解锁", - "_N$string": "未解锁", - "_fontSize": 22, - "_lineHeight": 28, - "_enableWrapText": true, - "_N$file": null, - "_isSystemFontUsed": true, - "_spacingX": 0, - "_batchAsBitmap": false, - "_styleFlags": 1, - "_underlineHeight": 0, - "_N$horizontalAlign": 1, - "_N$verticalAlign": 1, - "_N$fontFamily": "Arial", - "_N$overflow": 1, - "_N$cacheMode": 0, + "_spriteFrame": { + "__uuid__": "6fe4bf3a-562d-4fc9-82bc-0378b0041112" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, "_id": "" }, { @@ -3631,7 +4451,125 @@ "asset": { "__id__": 0 }, - "fileId": "00000AAAABAAIAAAAAAAAAh", + "fileId": "a33f23699810abf70567bf", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "digit1", + "_objFlags": 0, + "_parent": { + "__id__": 114 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 119 + } + ], + "_prefab": { + "__id__": 120 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 26.577777777777776, + "height": 29.9 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 9.082407407407409, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 118 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "b07ae691-b024-416b-a59d-a51a7c496270" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "10c43ce8a436caf4263674", + "sync": false + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "5d7fac2095b468875ade22", "sync": false }, { @@ -3639,7 +4577,275 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 81 + "__id__": 113 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "7d090003-0229-4a00-8b00-000000000229" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "7fbf1a8c92d39e0192800d", + "sync": false + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "4e082e6c0b861fc0a8f024", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "claimedOverlay", + "_objFlags": 0, + "_parent": { + "__id__": 96 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 126 + } + ], + "_prefab": { + "__id__": 127 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 218, + "height": 238 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 125 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "7d090003-0213-4a00-8b00-000000000213" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "770653667b0632ded3fd81", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "claimedBadge", + "_objFlags": 0, + "_parent": { + "__id__": 96 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 129 + } + ], + "_prefab": { + "__id__": 130 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 118, + "height": 99 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 128 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "7d090003-0211-4a00-8b00-000000000211" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "75dff2270beac10cc3698d", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 96 }, "_enabled": true, "_materials": [ @@ -3682,30 +4888,30 @@ "_name": "giftDay5", "_objFlags": 0, "_parent": { - "__id__": 23 + "__id__": 11 }, "_children": [ { - "__id__": 101 + "__id__": 134 }, { - "__id__": 105 + "__id__": 138 }, { - "__id__": 111 + "__id__": 154 }, { - "__id__": 114 + "__id__": 157 } ], "_active": true, "_components": [ { - "__id__": 117 + "__id__": 160 } ], "_prefab": { - "__id__": 118 + "__id__": 161 }, "_opacity": 255, "_color": { @@ -3759,27 +4965,27 @@ "_name": "dayLabel", "_objFlags": 0, "_parent": { - "__id__": 100 + "__id__": 133 }, "_children": [], "_active": true, "_components": [ { - "__id__": 102 + "__id__": 135 }, { - "__id__": 103 + "__id__": 136 } ], "_prefab": { - "__id__": 104 + "__id__": 137 }, "_opacity": 255, "_color": { "__type__": "cc.Color", - "r": 96, - "g": 66, - "b": 157, + "r": 255, + "g": 255, + "b": 255, "a": 255 }, "_contentSize": { @@ -3826,7 +5032,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 101 + "__id__": 134 }, "_enabled": true, "_materials": [ @@ -3836,10 +5042,10 @@ ], "_srcBlendFactor": 770, "_dstBlendFactor": 771, - "_string": "第 5 天", - "_N$string": "第 5 天", - "_fontSize": 27, - "_lineHeight": 32, + "_string": "第5天", + "_N$string": "第5天", + "_fontSize": 32, + "_lineHeight": 38, "_enableWrapText": true, "_N$file": null, "_isSystemFontUsed": true, @@ -3859,7 +5065,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 101 + "__id__": 134 }, "_enabled": true, "_color": { @@ -3885,24 +5091,20 @@ }, { "__type__": "cc.Node", - "_name": "rewardIcon", + "_name": "rewardItems", "_objFlags": 0, "_parent": { - "__id__": 100 + "__id__": 133 }, "_children": [ { - "__id__": 106 + "__id__": 139 } ], "_active": true, - "_components": [ - { - "__id__": 109 - } - ], + "_components": [], "_prefab": { - "__id__": 110 + "__id__": 153 }, "_opacity": 255, "_color": { @@ -3914,8 +5116,8 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 105, - "height": 100 + "width": 184, + "height": 130 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -3927,7 +5129,75 @@ "ctor": "Float64Array", "array": [ 0, - 20, + -11.279, + 0, + 0, + 0, + 0, + 1, + 1.2, + 1.2, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "rewardItem0", + "_objFlags": 0, + "_parent": { + "__id__": 138 + }, + "_children": [ + { + "__id__": 140 + } + ], + "_active": true, + "_components": [ + { + "__id__": 151 + } + ], + "_prefab": { + "__id__": 152 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 106, + "height": 91.9113924050633 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + -4, 0, 0, 0, @@ -3953,33 +5223,39 @@ }, { "__type__": "cc.Node", - "_name": "iconLabel", + "_name": "amount", "_objFlags": 0, "_parent": { - "__id__": 105 + "__id__": 139 }, - "_children": [], - "_active": false, - "_components": [ + "_children": [ { - "__id__": 107 + "__id__": 141 + }, + { + "__id__": 144 + }, + { + "__id__": 147 } ], + "_active": true, + "_components": [], "_prefab": { - "__id__": 108 + "__id__": 150 }, "_opacity": 255, "_color": { "__type__": "cc.Color", - "r": 102, - "g": 65, - "b": 166, + "r": 255, + "g": 255, + "b": 255, "a": 255 }, "_contentSize": { "__type__": "cc.Size", - "width": 74, - "height": 64 + "width": 114.99999999999999, + "height": 29.9 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -3991,6 +5267,70 @@ "ctor": "Float64Array", "array": [ 0, + -41.95569620253165, + 0, + 0, + 0, + 0, + 1, + 1.1, + 1.1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "digit0", + "_objFlags": 0, + "_parent": { + "__id__": 140 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 142 + } + ], + "_prefab": { + "__id__": 143 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 26.577777777777776, + "height": 29.9 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + -27.577777777777772, 0, 0, 0, @@ -4016,11 +5356,11 @@ "_id": "" }, { - "__type__": "cc.Label", + "__type__": "cc.Sprite", "_name": "", "_objFlags": 0, "node": { - "__id__": 106 + "__id__": 141 }, "_enabled": true, "_materials": [ @@ -4030,22 +5370,21 @@ ], "_srcBlendFactor": 770, "_dstBlendFactor": 771, - "_string": "币", - "_N$string": "币", - "_fontSize": 42, - "_lineHeight": 50, - "_enableWrapText": true, - "_N$file": null, - "_isSystemFontUsed": true, - "_spacingX": 0, - "_batchAsBitmap": false, - "_styleFlags": 1, - "_underlineHeight": 0, - "_N$horizontalAlign": 1, - "_N$verticalAlign": 1, - "_N$fontFamily": "Arial", - "_N$overflow": 1, - "_N$cacheMode": 0, + "_spriteFrame": { + "__uuid__": "c2ed5f1c-0be6-4af7-b945-b78ef8a0c9f5" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, "_id": "" }, { @@ -4056,7 +5395,232 @@ "asset": { "__id__": 0 }, - "fileId": "00000AAAABAAIAAAAAAAAAl", + "fileId": "60d102201cf91e74d4aaf6", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "digit1", + "_objFlags": 0, + "_parent": { + "__id__": 140 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 145 + } + ], + "_prefab": { + "__id__": 146 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 26.577777777777776, + "height": 29.9 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 3.552713678800501e-15, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 144 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "837772ce-3a48-4bcb-9ba2-2bda8204fd74" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "5c1c2b897a99cfedfeaeb3", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "digit2", + "_objFlags": 0, + "_parent": { + "__id__": 140 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 148 + } + ], + "_prefab": { + "__id__": 149 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 26.577777777777776, + "height": 29.9 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 27.57777777777778, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 147 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "837772ce-3a48-4bcb-9ba2-2bda8204fd74" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "3226aa27510b421d19f925", + "sync": false + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "51280159e97038f06ea5d6", "sync": false }, { @@ -4064,7 +5628,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 105 + "__id__": 139 }, "_enabled": true, "_materials": [ @@ -4087,7 +5651,7 @@ }, "_fillStart": 0, "_fillRange": 0, - "_isTrimmedMode": true, + "_isTrimmedMode": false, "_atlas": null, "_id": "" }, @@ -4099,38 +5663,49 @@ "asset": { "__id__": 0 }, - "fileId": "00000AAAABAAIAAAAAAAAAk", + "fileId": "b5e8eb24fd187005f96bcd", + "sync": false + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "34d2c9ea054ab70df71725", "sync": false }, { "__type__": "cc.Node", - "_name": "rewardLabel", + "_name": "claimedOverlay", "_objFlags": 0, "_parent": { - "__id__": 100 + "__id__": 133 }, "_children": [], "_active": false, "_components": [ { - "__id__": 112 + "__id__": 155 } ], "_prefab": { - "__id__": 113 + "__id__": 156 }, "_opacity": 255, "_color": { "__type__": "cc.Color", - "r": 83, - "g": 58, - "b": 130, + "r": 255, + "g": 255, + "b": 255, "a": 255 }, "_contentSize": { "__type__": "cc.Size", - "width": 195, - "height": 58 + "width": 218, + "height": 238 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -4142,7 +5717,7 @@ "ctor": "Float64Array", "array": [ 0, - -53, + 0, 0, 0, 0, @@ -4167,11 +5742,11 @@ "_id": "" }, { - "__type__": "cc.Label", + "__type__": "cc.Sprite", "_name": "", "_objFlags": 0, "node": { - "__id__": 111 + "__id__": 154 }, "_enabled": true, "_materials": [ @@ -4181,22 +5756,21 @@ ], "_srcBlendFactor": 770, "_dstBlendFactor": 771, - "_string": "金币 ×600", - "_N$string": "金币 ×600", - "_fontSize": 22, - "_lineHeight": 25, - "_enableWrapText": true, - "_N$file": null, - "_isSystemFontUsed": true, - "_spacingX": 0, - "_batchAsBitmap": false, - "_styleFlags": 1, - "_underlineHeight": 0, - "_N$horizontalAlign": 1, - "_N$verticalAlign": 1, - "_N$fontFamily": "Arial", - "_N$overflow": 1, - "_N$cacheMode": 0, + "_spriteFrame": { + "__uuid__": "7d090003-0213-4a00-8b00-000000000213" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, "_id": "" }, { @@ -4207,38 +5781,38 @@ "asset": { "__id__": 0 }, - "fileId": "00000AAAABAAIAAAAAAAAAm", + "fileId": "0b73bd1dfa5b9c375f1a4e", "sync": false }, { "__type__": "cc.Node", - "_name": "statusLabel", + "_name": "claimedBadge", "_objFlags": 0, "_parent": { - "__id__": 100 + "__id__": 133 }, "_children": [], "_active": false, "_components": [ { - "__id__": 115 + "__id__": 158 } ], "_prefab": { - "__id__": 116 + "__id__": 159 }, "_opacity": 255, "_color": { "__type__": "cc.Color", - "r": 112, - "g": 96, - "b": 137, + "r": 255, + "g": 255, + "b": 255, "a": 255 }, "_contentSize": { "__type__": "cc.Size", - "width": 160, - "height": 42 + "width": 118, + "height": 99 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -4250,7 +5824,7 @@ "ctor": "Float64Array", "array": [ 0, - -95, + 0, 0, 0, 0, @@ -4275,11 +5849,11 @@ "_id": "" }, { - "__type__": "cc.Label", + "__type__": "cc.Sprite", "_name": "", "_objFlags": 0, "node": { - "__id__": 114 + "__id__": 157 }, "_enabled": true, "_materials": [ @@ -4289,22 +5863,21 @@ ], "_srcBlendFactor": 770, "_dstBlendFactor": 771, - "_string": "未解锁", - "_N$string": "未解锁", - "_fontSize": 22, - "_lineHeight": 28, - "_enableWrapText": true, - "_N$file": null, - "_isSystemFontUsed": true, - "_spacingX": 0, - "_batchAsBitmap": false, - "_styleFlags": 1, - "_underlineHeight": 0, - "_N$horizontalAlign": 1, - "_N$verticalAlign": 1, - "_N$fontFamily": "Arial", - "_N$overflow": 1, - "_N$cacheMode": 0, + "_spriteFrame": { + "__uuid__": "7d090003-0211-4a00-8b00-000000000211" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, "_id": "" }, { @@ -4315,7 +5888,7 @@ "asset": { "__id__": 0 }, - "fileId": "00000AAAABAAIAAAAAAAAAn", + "fileId": "363e087225deb266c75cd8", "sync": false }, { @@ -4323,7 +5896,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 100 + "__id__": 133 }, "_enabled": true, "_materials": [ @@ -4366,30 +5939,30 @@ "_name": "giftDay6", "_objFlags": 0, "_parent": { - "__id__": 23 + "__id__": 11 }, "_children": [ { - "__id__": 120 + "__id__": 163 }, { - "__id__": 124 + "__id__": 167 }, { - "__id__": 130 + "__id__": 191 }, { - "__id__": 133 + "__id__": 194 } ], "_active": true, "_components": [ { - "__id__": 136 + "__id__": 197 } ], "_prefab": { - "__id__": 137 + "__id__": 198 }, "_opacity": 255, "_color": { @@ -4443,27 +6016,27 @@ "_name": "dayLabel", "_objFlags": 0, "_parent": { - "__id__": 119 + "__id__": 162 }, "_children": [], "_active": true, "_components": [ { - "__id__": 121 + "__id__": 164 }, { - "__id__": 122 + "__id__": 165 } ], "_prefab": { - "__id__": 123 + "__id__": 166 }, "_opacity": 255, "_color": { "__type__": "cc.Color", - "r": 96, - "g": 66, - "b": 157, + "r": 255, + "g": 255, + "b": 255, "a": 255 }, "_contentSize": { @@ -4510,7 +6083,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 120 + "__id__": 163 }, "_enabled": true, "_materials": [ @@ -4520,10 +6093,10 @@ ], "_srcBlendFactor": 770, "_dstBlendFactor": 771, - "_string": "第 6 天", - "_N$string": "第 6 天", - "_fontSize": 27, - "_lineHeight": 32, + "_string": "第6天", + "_N$string": "第6天", + "_fontSize": 32, + "_lineHeight": 38, "_enableWrapText": true, "_N$file": null, "_isSystemFontUsed": true, @@ -4543,7 +6116,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 120 + "__id__": 163 }, "_enabled": true, "_color": { @@ -4569,24 +6142,23 @@ }, { "__type__": "cc.Node", - "_name": "rewardIcon", + "_name": "rewardItems", "_objFlags": 0, "_parent": { - "__id__": 119 + "__id__": 162 }, "_children": [ { - "__id__": 125 + "__id__": 168 + }, + { + "__id__": 179 } ], "_active": true, - "_components": [ - { - "__id__": 128 - } - ], + "_components": [], "_prefab": { - "__id__": 129 + "__id__": 190 }, "_opacity": 255, "_color": { @@ -4598,8 +6170,8 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 105, - "height": 100 + "width": 184, + "height": 130 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -4611,7 +6183,7 @@ "ctor": "Float64Array", "array": [ 0, - 20, + -11.279, 0, 0, 0, @@ -4637,33 +6209,37 @@ }, { "__type__": "cc.Node", - "_name": "iconLabel", + "_name": "rewardItem0", "_objFlags": 0, "_parent": { - "__id__": 124 + "__id__": 167 }, - "_children": [], - "_active": false, + "_children": [ + { + "__id__": 169 + } + ], + "_active": true, "_components": [ { - "__id__": 126 + "__id__": 177 } ], "_prefab": { - "__id__": 127 + "__id__": 178 }, "_opacity": 255, "_color": { "__type__": "cc.Color", - "r": 102, - "g": 65, - "b": 166, + "r": 255, + "g": 255, + "b": 255, "a": 255 }, "_contentSize": { "__type__": "cc.Size", - "width": 74, - "height": 64 + "width": 92, + "height": 92 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -4674,10 +6250,141 @@ "__type__": "TypedArray", "ctor": "Float64Array", "array": [ + -46, + -4, 0, 0, 0, 0, + 1, + 1.1, + 1.1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "amount", + "_objFlags": 0, + "_parent": { + "__id__": 168 + }, + "_children": [ + { + "__id__": 170 + }, + { + "__id__": 173 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 176 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 101.19999999999999, + "height": 29.9 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 25.299589779653076, + -42, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "digit0", + "_objFlags": 0, + "_parent": { + "__id__": 169 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 171 + } + ], + "_prefab": { + "__id__": 172 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 17.164814814814815, + "height": 17.71851851851852 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + -13.788888888888886, + 0, + 0, + 0, 0, 0, 1, @@ -4700,11 +6407,11 @@ "_id": "" }, { - "__type__": "cc.Label", + "__type__": "cc.Sprite", "_name": "", "_objFlags": 0, "node": { - "__id__": 125 + "__id__": 170 }, "_enabled": true, "_materials": [ @@ -4714,22 +6421,21 @@ ], "_srcBlendFactor": 770, "_dstBlendFactor": 771, - "_string": "礼", - "_N$string": "礼", - "_fontSize": 42, - "_lineHeight": 50, - "_enableWrapText": true, - "_N$file": null, - "_isSystemFontUsed": true, - "_spacingX": 0, - "_batchAsBitmap": false, - "_styleFlags": 1, - "_underlineHeight": 0, - "_N$horizontalAlign": 1, - "_N$verticalAlign": 1, - "_N$fontFamily": "Arial", - "_N$overflow": 1, - "_N$cacheMode": 0, + "_spriteFrame": { + "__uuid__": "6fe4bf3a-562d-4fc9-82bc-0378b0041112" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, "_id": "" }, { @@ -4740,7 +6446,125 @@ "asset": { "__id__": 0 }, - "fileId": "00000AAAABAAIAAAAAAAAAr", + "fileId": "5b2af49971bf1a6af45ee1", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "digit1", + "_objFlags": 0, + "_parent": { + "__id__": 169 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 174 + } + ], + "_prefab": { + "__id__": 175 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 26.577777777777776, + "height": 29.9 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 9.082407407407409, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 173 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "b07ae691-b024-416b-a59d-a51a7c496270" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "3efc7b5bcdd1469e0824a9", + "sync": false + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "568404245edfad23e3292a", "sync": false }, { @@ -4748,7 +6572,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 124 + "__id__": 168 }, "_enabled": true, "_materials": [ @@ -4771,7 +6595,7 @@ }, "_fillStart": 0, "_fillRange": 0, - "_isTrimmedMode": true, + "_isTrimmedMode": false, "_atlas": null, "_id": "" }, @@ -4783,38 +6607,42 @@ "asset": { "__id__": 0 }, - "fileId": "00000AAAABAAIAAAAAAAAAq", + "fileId": "b3e9483697ff6a3e287c6b", "sync": false }, { "__type__": "cc.Node", - "_name": "rewardLabel", + "_name": "rewardItem1", "_objFlags": 0, "_parent": { - "__id__": 119 + "__id__": 167 }, - "_children": [], - "_active": false, + "_children": [ + { + "__id__": 180 + } + ], + "_active": true, "_components": [ { - "__id__": 131 + "__id__": 188 } ], "_prefab": { - "__id__": 132 + "__id__": 189 }, "_opacity": 255, "_color": { "__type__": "cc.Color", - "r": 83, - "g": 58, - "b": 130, + "r": 255, + "g": 255, + "b": 255, "a": 255 }, "_contentSize": { "__type__": "cc.Size", - "width": 195, - "height": 58 + "width": 92, + "height": 92 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -4825,8 +6653,75 @@ "__type__": "TypedArray", "ctor": "Float64Array", "array": [ + 46, + -4, 0, - -53, + 0, + 0, + 0, + 1, + 1.1, + 1.1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "amount", + "_objFlags": 0, + "_parent": { + "__id__": 179 + }, + "_children": [ + { + "__id__": 181 + }, + { + "__id__": 184 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 187 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 101.19999999999999, + "height": 29.9 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 16.5654125644632, + -42, 0, 0, 0, @@ -4850,79 +6745,35 @@ "groupIndex": 0, "_id": "" }, - { - "__type__": "cc.Label", - "_name": "", - "_objFlags": 0, - "node": { - "__id__": 130 - }, - "_enabled": true, - "_materials": [ - { - "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" - } - ], - "_srcBlendFactor": 770, - "_dstBlendFactor": 771, - "_string": "锤子/冻结/魔法棒 ×1", - "_N$string": "锤子/冻结/魔法棒 ×1", - "_fontSize": 22, - "_lineHeight": 25, - "_enableWrapText": true, - "_N$file": null, - "_isSystemFontUsed": true, - "_spacingX": 0, - "_batchAsBitmap": false, - "_styleFlags": 1, - "_underlineHeight": 0, - "_N$horizontalAlign": 1, - "_N$verticalAlign": 1, - "_N$fontFamily": "Arial", - "_N$overflow": 1, - "_N$cacheMode": 0, - "_id": "" - }, - { - "__type__": "cc.PrefabInfo", - "root": { - "__id__": 1 - }, - "asset": { - "__id__": 0 - }, - "fileId": "00000AAAABAAIAAAAAAAAAs", - "sync": false - }, { "__type__": "cc.Node", - "_name": "statusLabel", + "_name": "digit0", "_objFlags": 0, "_parent": { - "__id__": 119 + "__id__": 180 }, "_children": [], - "_active": false, + "_active": true, "_components": [ { - "__id__": 134 + "__id__": 182 } ], "_prefab": { - "__id__": 135 + "__id__": 183 }, "_opacity": 255, "_color": { "__type__": "cc.Color", - "r": 112, - "g": 96, - "b": 137, + "r": 255, + "g": 255, + "b": 255, "a": 255 }, "_contentSize": { "__type__": "cc.Size", - "width": 160, - "height": 42 + "width": 17.164814814814815, + "height": 17.71851851851852 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -4933,8 +6784,8 @@ "__type__": "TypedArray", "ctor": "Float64Array", "array": [ + -13.788888888888886, 0, - -95, 0, 0, 0, @@ -4958,56 +6809,12 @@ "groupIndex": 0, "_id": "" }, - { - "__type__": "cc.Label", - "_name": "", - "_objFlags": 0, - "node": { - "__id__": 133 - }, - "_enabled": true, - "_materials": [ - { - "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" - } - ], - "_srcBlendFactor": 770, - "_dstBlendFactor": 771, - "_string": "未解锁", - "_N$string": "未解锁", - "_fontSize": 22, - "_lineHeight": 28, - "_enableWrapText": true, - "_N$file": null, - "_isSystemFontUsed": true, - "_spacingX": 0, - "_batchAsBitmap": false, - "_styleFlags": 1, - "_underlineHeight": 0, - "_N$horizontalAlign": 1, - "_N$verticalAlign": 1, - "_N$fontFamily": "Arial", - "_N$overflow": 1, - "_N$cacheMode": 0, - "_id": "" - }, - { - "__type__": "cc.PrefabInfo", - "root": { - "__id__": 1 - }, - "asset": { - "__id__": 0 - }, - "fileId": "00000AAAABAAIAAAAAAAAAt", - "sync": false - }, { "__type__": "cc.Sprite", "_name": "", "_objFlags": 0, "node": { - "__id__": 119 + "__id__": 181 }, "_enabled": true, "_materials": [ @@ -5018,7 +6825,436 @@ "_srcBlendFactor": 770, "_dstBlendFactor": 771, "_spriteFrame": { - "__uuid__": "7d090003-0205-4a00-8b00-000000000205" + "__uuid__": "6fe4bf3a-562d-4fc9-82bc-0378b0041112" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "142c1d8414e044f3ae4af9", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "digit1", + "_objFlags": 0, + "_parent": { + "__id__": 180 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 185 + } + ], + "_prefab": { + "__id__": 186 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 26.577777777777776, + "height": 29.9 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 9.082407407407409, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 184 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "b07ae691-b024-416b-a59d-a51a7c496270" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "060f2d0797628d1ee39e38", + "sync": false + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "1b2b4d3a43fc1ae9478d8b", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 179 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "7d090003-0223-4a00-8b00-000000000223" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "d845710994a6fa0dc1b72e", + "sync": false + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "a8776f4c11b1b504b5900b", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "claimedOverlay", + "_objFlags": 0, + "_parent": { + "__id__": 162 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 192 + } + ], + "_prefab": { + "__id__": 193 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 218, + "height": 238 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 191 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "7d090003-0213-4a00-8b00-000000000213" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "eaa01afe61ee437b152374", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "claimedBadge", + "_objFlags": 0, + "_parent": { + "__id__": 162 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 195 + } + ], + "_prefab": { + "__id__": 196 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 118, + "height": 99 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 194 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "7d090003-0211-4a00-8b00-000000000211" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "0261a3f68ca3a15861e20c", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 162 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "7d090003-0201-4a00-8b00-000000000201" }, "_type": 0, "_sizeMode": 0, @@ -5050,30 +7286,33 @@ "_name": "giftDay7", "_objFlags": 0, "_parent": { - "__id__": 23 + "__id__": 11 }, "_children": [ { - "__id__": 139 + "__id__": 200 }, { - "__id__": 143 + "__id__": 204 }, { - "__id__": 149 + "__id__": 208 }, { - "__id__": 152 + "__id__": 235 + }, + { + "__id__": 238 } ], "_active": true, "_components": [ { - "__id__": 155 + "__id__": 241 } ], "_prefab": { - "__id__": 156 + "__id__": 242 }, "_opacity": 255, "_color": { @@ -5127,27 +7366,27 @@ "_name": "dayLabel", "_objFlags": 0, "_parent": { - "__id__": 138 + "__id__": 199 }, "_children": [], "_active": true, "_components": [ { - "__id__": 140 + "__id__": 201 }, { - "__id__": 141 + "__id__": 202 } ], "_prefab": { - "__id__": 142 + "__id__": 203 }, "_opacity": 255, "_color": { "__type__": "cc.Color", - "r": 96, - "g": 66, - "b": 157, + "r": 255, + "g": 255, + "b": 255, "a": 255 }, "_contentSize": { @@ -5194,7 +7433,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 139 + "__id__": 200 }, "_enabled": true, "_materials": [ @@ -5204,10 +7443,10 @@ ], "_srcBlendFactor": 770, "_dstBlendFactor": 771, - "_string": "第七天", - "_N$string": "第七天", - "_fontSize": 28, - "_lineHeight": 34, + "_string": "第7天", + "_N$string": "第7天", + "_fontSize": 32, + "_lineHeight": 38, "_enableWrapText": true, "_N$file": null, "_isSystemFontUsed": true, @@ -5227,7 +7466,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 139 + "__id__": 200 }, "_enabled": true, "_color": { @@ -5253,24 +7492,152 @@ }, { "__type__": "cc.Node", - "_name": "rewardIcon", + "_name": "catGlow", "_objFlags": 0, "_parent": { - "__id__": 138 + "__id__": 199 }, - "_children": [ - { - "__id__": 144 - } - ], + "_children": [], "_active": true, "_components": [ { - "__id__": 147 + "__id__": 205 + }, + { + "__id__": 206 } ], "_prefab": { - "__id__": 148 + "__id__": 207 + }, + "_opacity": 170, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 185, + "b": 45, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 240, + "height": 240 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 40, + -12, + 0, + 0, + 0, + 0, + 1, + 1.6, + 1.6, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 204 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "3086628d-3da9-4647-a6cd-56a837327074" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.Animation", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 204 + }, + "_enabled": true, + "_defaultClip": { + "__uuid__": "8a9c1d91-8e81-4b7c-ade7-3437979273a0" + }, + "_clips": [ + { + "__uuid__": "8a9c1d91-8e81-4b7c-ade7-3437979273a0" + } + ], + "playOnLoad": true, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "5fe7f32ac5b049c38fc87a", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "rewardItems", + "_objFlags": 0, + "_parent": { + "__id__": 199 + }, + "_children": [ + { + "__id__": 209 + }, + { + "__id__": 223 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 234 }, "_opacity": 255, "_color": { @@ -5282,8 +7649,8 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 145, - "height": 135 + "width": 220, + "height": 210 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -5295,7 +7662,7 @@ "ctor": "Float64Array", "array": [ 0, - 35, + -8, 0, 0, 0, @@ -5321,33 +7688,107 @@ }, { "__type__": "cc.Node", - "_name": "iconLabel", + "_name": "rewardItem0", "_objFlags": 0, "_parent": { - "__id__": 143 + "__id__": 208 }, - "_children": [], - "_active": false, + "_children": [ + { + "__id__": 210 + } + ], + "_active": true, "_components": [ { - "__id__": 145 + "__id__": 221 } ], "_prefab": { - "__id__": 146 + "__id__": 222 }, "_opacity": 255, "_color": { "__type__": "cc.Color", - "r": 102, - "g": 65, - "b": 166, + "r": 255, + "g": 255, + "b": 255, "a": 255 }, "_contentSize": { "__type__": "cc.Size", - "width": 74, - "height": 64 + "width": 85.80000000000001, + "height": 75.77956204379562 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + -65.147, + -28, + 0, + 0, + 0, + 0, + 1, + 1.1, + 1.1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "amount", + "_objFlags": 0, + "_parent": { + "__id__": 209 + }, + "_children": [ + { + "__id__": 211 + }, + { + "__id__": 214 + }, + { + "__id__": 217 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 220 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 107.7574074074074, + "height": 29.9 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -5359,6 +7800,70 @@ "ctor": "Float64Array", "array": [ 0, + -37.30927835051547, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "digit0", + "_objFlags": 0, + "_parent": { + "__id__": 210 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 212 + } + ], + "_prefab": { + "__id__": 213 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 26.577777777777776, + "height": 29.9 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + -40.589814814814815, 0, 0, 0, @@ -5384,11 +7889,11 @@ "_id": "" }, { - "__type__": "cc.Label", + "__type__": "cc.Sprite", "_name": "", "_objFlags": 0, "node": { - "__id__": 144 + "__id__": 211 }, "_enabled": true, "_materials": [ @@ -5398,22 +7903,21 @@ ], "_srcBlendFactor": 770, "_dstBlendFactor": 771, - "_string": "礼", - "_N$string": "礼", - "_fontSize": 42, - "_lineHeight": 50, - "_enableWrapText": true, - "_N$file": null, - "_isSystemFontUsed": true, - "_spacingX": 0, - "_batchAsBitmap": false, - "_styleFlags": 1, - "_underlineHeight": 0, - "_N$horizontalAlign": 1, - "_N$verticalAlign": 1, - "_N$fontFamily": "Arial", - "_N$overflow": 1, - "_N$cacheMode": 0, + "_spriteFrame": { + "__uuid__": "c2ed5f1c-0be6-4af7-b945-b78ef8a0c9f5" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, "_id": "" }, { @@ -5424,7 +7928,232 @@ "asset": { "__id__": 0 }, - "fileId": "00000AAAABAAIAAAAAAAAAx", + "fileId": "ce425de8161b5e365219c1", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "digit1", + "_objFlags": 0, + "_parent": { + "__id__": 210 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 215 + } + ], + "_prefab": { + "__id__": 216 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 26.577777777777776, + "height": 29.9 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + -13.012037037037036, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 214 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "837772ce-3a48-4bcb-9ba2-2bda8204fd74" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "05f3ffa9043d5e11d031ad", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "digit2", + "_objFlags": 0, + "_parent": { + "__id__": 210 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 218 + } + ], + "_prefab": { + "__id__": 219 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 52.60185185185185, + "height": 27.685185185185183 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 27.577777777777776, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 217 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "f62e9f2e-72b3-4f73-8ecd-d0fd2a2e1b4d" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "2aca8d64e2de70df865d77", + "sync": false + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "fe8c08c53c2eef18e79229", "sync": false }, { @@ -5432,7 +8161,410 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 143 + "__id__": 209 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "7d090003-0227-4a00-8b00-000000000227" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "61c2cf5c49bd7c7c31c9e5", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "rewardItem1", + "_objFlags": 0, + "_parent": { + "__id__": 208 + }, + "_children": [ + { + "__id__": 224 + } + ], + "_active": true, + "_components": [ + { + "__id__": 232 + } + ], + "_prefab": { + "__id__": 233 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 140, + "height": 130.61855670103094 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 40, + -4, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "amount", + "_objFlags": 0, + "_parent": { + "__id__": 223 + }, + "_children": [ + { + "__id__": 225 + }, + { + "__id__": 228 + } + ], + "_active": true, + "_components": [], + "_prefab": { + "__id__": 231 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 101.19999999999999, + "height": 29.9 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 51.62870370370371, + -61.30927835051547, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "digit0", + "_objFlags": 0, + "_parent": { + "__id__": 224 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 226 + } + ], + "_prefab": { + "__id__": 227 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 17.164814814814815, + "height": 17.71851851851852 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + -13.788888888888886, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 225 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "6fe4bf3a-562d-4fc9-82bc-0378b0041112" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "cc2b76b31517f34ee999c2", + "sync": false + }, + { + "__type__": "cc.Node", + "_name": "digit1", + "_objFlags": 0, + "_parent": { + "__id__": 224 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 229 + } + ], + "_prefab": { + "__id__": 230 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 26.577777777777776, + "height": 29.9 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 9.082407407407409, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 228 + }, + "_enabled": true, + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_spriteFrame": { + "__uuid__": "b07ae691-b024-416b-a59d-a51a7c496270" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "1496fcfcf1aca28d1fdcf5", + "sync": false + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "efe98feab3d9af92162f05", + "sync": false + }, + { + "__type__": "cc.Sprite", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 223 }, "_enabled": true, "_materials": [ @@ -5455,7 +8587,7 @@ }, "_fillStart": 0, "_fillRange": 0, - "_isTrimmedMode": true, + "_isTrimmedMode": false, "_atlas": null, "_id": "" }, @@ -5467,38 +8599,49 @@ "asset": { "__id__": 0 }, - "fileId": "00000AAAABAAIAAAAAAAAAw", + "fileId": "01ba02badf4c3dd393ef86", + "sync": false + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "e519b3182018585dec1410", "sync": false }, { "__type__": "cc.Node", - "_name": "rewardLabel", + "_name": "claimedOverlay", "_objFlags": 0, "_parent": { - "__id__": 138 + "__id__": 199 }, "_children": [], "_active": false, "_components": [ { - "__id__": 150 + "__id__": 236 } ], "_prefab": { - "__id__": 151 + "__id__": 237 }, "_opacity": 255, "_color": { "__type__": "cc.Color", - "r": 83, - "g": 58, - "b": 130, + "r": 255, + "g": 255, + "b": 255, "a": 255 }, "_contentSize": { "__type__": "cc.Size", - "width": 230, - "height": 80 + "width": 264, + "height": 355 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -5510,7 +8653,7 @@ "ctor": "Float64Array", "array": [ 0, - -75, + 0, 0, 0, 0, @@ -5535,11 +8678,11 @@ "_id": "" }, { - "__type__": "cc.Label", + "__type__": "cc.Sprite", "_name": "", "_objFlags": 0, "node": { - "__id__": 149 + "__id__": 235 }, "_enabled": true, "_materials": [ @@ -5549,22 +8692,21 @@ ], "_srcBlendFactor": 770, "_dstBlendFactor": 771, - "_string": "无限体力 1小时\n专属猫咪 ×1", - "_N$string": "无限体力 1小时\n专属猫咪 ×1", - "_fontSize": 24, - "_lineHeight": 28, - "_enableWrapText": true, - "_N$file": null, - "_isSystemFontUsed": true, - "_spacingX": 0, - "_batchAsBitmap": false, - "_styleFlags": 1, - "_underlineHeight": 0, - "_N$horizontalAlign": 1, - "_N$verticalAlign": 1, - "_N$fontFamily": "Arial", - "_N$overflow": 1, - "_N$cacheMode": 0, + "_spriteFrame": { + "__uuid__": "7d090003-0213-4a00-8b00-000000000213" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, "_id": "" }, { @@ -5575,38 +8717,38 @@ "asset": { "__id__": 0 }, - "fileId": "00000AAAABAAIAAAAAAAAAy", + "fileId": "c1123319fff9738929f43c", "sync": false }, { "__type__": "cc.Node", - "_name": "statusLabel", + "_name": "claimedBadge", "_objFlags": 0, "_parent": { - "__id__": 138 + "__id__": 199 }, "_children": [], "_active": false, "_components": [ { - "__id__": 153 + "__id__": 239 } ], "_prefab": { - "__id__": 154 + "__id__": 240 }, "_opacity": 255, "_color": { "__type__": "cc.Color", - "r": 112, - "g": 96, - "b": 137, + "r": 255, + "g": 255, + "b": 255, "a": 255 }, "_contentSize": { "__type__": "cc.Size", - "width": 160, - "height": 42 + "width": 118, + "height": 99 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -5618,7 +8760,7 @@ "ctor": "Float64Array", "array": [ 0, - -145, + 0, 0, 0, 0, @@ -5643,11 +8785,11 @@ "_id": "" }, { - "__type__": "cc.Label", + "__type__": "cc.Sprite", "_name": "", "_objFlags": 0, "node": { - "__id__": 152 + "__id__": 238 }, "_enabled": true, "_materials": [ @@ -5657,22 +8799,21 @@ ], "_srcBlendFactor": 770, "_dstBlendFactor": 771, - "_string": "未解锁", - "_N$string": "未解锁", - "_fontSize": 22, - "_lineHeight": 28, - "_enableWrapText": true, - "_N$file": null, - "_isSystemFontUsed": true, - "_spacingX": 0, - "_batchAsBitmap": false, - "_styleFlags": 1, - "_underlineHeight": 0, - "_N$horizontalAlign": 1, - "_N$verticalAlign": 1, - "_N$fontFamily": "Arial", - "_N$overflow": 1, - "_N$cacheMode": 0, + "_spriteFrame": { + "__uuid__": "7d090003-0211-4a00-8b00-000000000211" + }, + "_type": 0, + "_sizeMode": 0, + "_fillType": 0, + "_fillCenter": { + "__type__": "cc.Vec2", + "x": 0, + "y": 0 + }, + "_fillStart": 0, + "_fillRange": 0, + "_isTrimmedMode": false, + "_atlas": null, "_id": "" }, { @@ -5683,7 +8824,7 @@ "asset": { "__id__": 0 }, - "fileId": "00000AAAABAAIAAAAAAAAAz", + "fileId": "7c69f89b33fdc97bae415b", "sync": false }, { @@ -5691,7 +8832,7 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 138 + "__id__": 199 }, "_enabled": true, "_materials": [ @@ -5740,114 +8881,6 @@ "fileId": "00000AAAABAAIAAAAAAAAAJ", "sync": false }, - { - "__type__": "cc.Node", - "_name": "message", - "_objFlags": 0, - "_parent": { - "__id__": 7 - }, - "_children": [], - "_active": false, - "_components": [ - { - "__id__": 159 - } - ], - "_prefab": { - "__id__": 160 - }, - "_opacity": 255, - "_color": { - "__type__": "cc.Color", - "r": 94, - "g": 67, - "b": 158, - "a": 255 - }, - "_contentSize": { - "__type__": "cc.Size", - "width": 760, - "height": 55 - }, - "_anchorPoint": { - "__type__": "cc.Vec2", - "x": 0.5, - "y": 0.5 - }, - "_trs": { - "__type__": "TypedArray", - "ctor": "Float64Array", - "array": [ - 0, - -505, - 0, - 0, - 0, - 0, - 1, - 1, - 1, - 1 - ] - }, - "_eulerAngles": { - "__type__": "cc.Vec3", - "x": 0, - "y": 0, - "z": 0 - }, - "_skewX": 0, - "_skewY": 0, - "_is3DNode": false, - "_groupIndex": 0, - "groupIndex": 0, - "_id": "" - }, - { - "__type__": "cc.Label", - "_name": "", - "_objFlags": 0, - "node": { - "__id__": 158 - }, - "_enabled": true, - "_materials": [ - { - "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" - } - ], - "_srcBlendFactor": 770, - "_dstBlendFactor": 771, - "_string": "点击今日奖励即可领取", - "_N$string": "点击今日奖励即可领取", - "_fontSize": 28, - "_lineHeight": 34, - "_enableWrapText": true, - "_N$file": null, - "_isSystemFontUsed": true, - "_spacingX": 0, - "_batchAsBitmap": false, - "_styleFlags": 1, - "_underlineHeight": 0, - "_N$horizontalAlign": 1, - "_N$verticalAlign": 1, - "_N$fontFamily": "Arial", - "_N$overflow": 1, - "_N$cacheMode": 0, - "_id": "" - }, - { - "__type__": "cc.PrefabInfo", - "root": { - "__id__": 1 - }, - "asset": { - "__id__": 0 - }, - "fileId": "00000AAAABAAIAAAAAAAAA0", - "sync": false - }, { "__type__": "cc.Sprite", "_name": "", diff --git a/assets/seven_day_gift/test.meta b/assets/seven_day_gift/test.meta new file mode 100644 index 00000000..b60fdb85 --- /dev/null +++ b/assets/seven_day_gift/test.meta @@ -0,0 +1,13 @@ +{ + "ver": "1.1.3", + "uuid": "d1e69c5f-2b8b-401e-a239-fdac49efd927", + "importer": "folder", + "isBundle": false, + "bundleName": "", + "priority": 1, + "compressionType": {}, + "optimizeHotUpdate": {}, + "inlineSpriteFrames": {}, + "isRemoteBundle": {}, + "subMetas": {} +} \ No newline at end of file diff --git a/assets/seven_day_gift/test/SevenDayTest.prefab b/assets/seven_day_gift/test/SevenDayTest.prefab new file mode 100644 index 00000000..669a0f4b --- /dev/null +++ b/assets/seven_day_gift/test/SevenDayTest.prefab @@ -0,0 +1,1356 @@ +[ + { + "__type__": "cc.Prefab", + "_name": "", + "_objFlags": 0, + "_native": "", + "data": { + "__id__": 1 + }, + "optimizationPolicy": 0, + "asyncLoadAssets": false, + "readonly": false + }, + { + "__type__": "cc.Node", + "_name": "SevenDayTest", + "_objFlags": 0, + "_parent": null, + "_children": [ + { + "__id__": 4 + }, + { + "__id__": 8 + } + ], + "_active": true, + "_components": [ + { + "__id__": 3 + } + ], + "_prefab": { + "__id__": 2 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 1080, + "height": 1920 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "7ca97b5bbbc24dbab2e1aa", + "sync": false + }, + { + "__type__": "cc.Widget", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 1 + }, + "_enabled": true, + "_id": "0a5XlUuGZCprz0fwaiG835", + "alignMode": 1, + "_target": null, + "_alignFlags": 45, + "_left": 0, + "_right": 0, + "_top": 0, + "_bottom": 0, + "_verticalCenter": 0, + "_horizontalCenter": 0, + "_isAbsLeft": true, + "_isAbsRight": true, + "_isAbsTop": true, + "_isAbsBottom": true, + "_isAbsHorizontalCenter": true, + "_isAbsVerticalCenter": true, + "_originalWidth": 1080, + "_originalHeight": 10000 + }, + { + "__type__": "cc.Node", + "_name": "entry", + "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [], + "_active": false, + "_components": [ + { + "__id__": 6 + }, + { + "__id__": 7 + } + ], + "_prefab": { + "__id__": 5 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 160, + "height": 64 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 420, + 700, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "22c732bc24344f7d989298", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 4 + }, + "_enabled": true, + "_id": "", + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "七日测试", + "_N$string": "七日测试", + "_fontSize": 26, + "_lineHeight": 35, + "_enableWrapText": true, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 1, + "_N$cacheMode": 0 + }, + { + "__type__": "cc.Widget", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 4 + }, + "_enabled": true, + "_id": "0a5XlUuGZCprz0fwaiG835", + "alignMode": 1, + "_target": null, + "_alignFlags": 33, + "_left": 0, + "_right": 25, + "_top": 180, + "_bottom": 0, + "_verticalCenter": 0, + "_horizontalCenter": 0, + "_isAbsLeft": true, + "_isAbsRight": true, + "_isAbsTop": true, + "_isAbsBottom": true, + "_isAbsHorizontalCenter": true, + "_isAbsVerticalCenter": true, + "_originalWidth": 1080, + "_originalHeight": 10000 + }, + { + "__type__": "cc.Node", + "_name": "panel", + "_objFlags": 0, + "_parent": { + "__id__": 1 + }, + "_children": [ + { + "__id__": 11 + }, + { + "__id__": 14 + }, + { + "__id__": 17 + }, + { + "__id__": 20 + }, + { + "__id__": 23 + }, + { + "__id__": 26 + }, + { + "__id__": 29 + }, + { + "__id__": 32 + } + ], + "_active": false, + "_components": [ + { + "__id__": 10 + } + ], + "_prefab": { + "__id__": 9 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 1000, + "height": 1400 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "f80601a50a6c4875a2ea35", + "sync": false + }, + { + "__type__": "cc.BlockInputEvents", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 8 + }, + "_enabled": true, + "_id": "" + }, + { + "__type__": "cc.Node", + "_name": "title", + "_objFlags": 0, + "_parent": { + "__id__": 8 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 13 + } + ], + "_prefab": { + "__id__": 12 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 800, + "height": 60 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 640, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "21405b02d9bb42119ad723", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 11 + }, + "_enabled": true, + "_id": "", + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "七日活动 · 测试服面板", + "_N$string": "七日活动 · 测试服面板", + "_fontSize": 32, + "_lineHeight": 41, + "_enableWrapText": true, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 1, + "_N$cacheMode": 0 + }, + { + "__type__": "cc.Node", + "_name": "close", + "_objFlags": 0, + "_parent": { + "__id__": 8 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 16 + } + ], + "_prefab": { + "__id__": 15 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 140, + "height": 60 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 410, + 640, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "db25837270dc4c06b6fffc", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 14 + }, + "_enabled": true, + "_id": "", + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "关闭", + "_N$string": "关闭", + "_fontSize": 28, + "_lineHeight": 37, + "_enableWrapText": true, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 1, + "_N$cacheMode": 0 + }, + { + "__type__": "cc.Node", + "_name": "query", + "_objFlags": 0, + "_parent": { + "__id__": 8 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 19 + } + ], + "_prefab": { + "__id__": 18 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 220, + "height": 64 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + -330, + 560, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "7eb65395f86f4521af85d3", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 17 + }, + "_enabled": true, + "_id": "", + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "查询接口", + "_N$string": "查询接口", + "_fontSize": 28, + "_lineHeight": 37, + "_enableWrapText": true, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 1, + "_N$cacheMode": 0 + }, + { + "__type__": "cc.Node", + "_name": "clearClaim", + "_objFlags": 0, + "_parent": { + "__id__": 8 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 22 + } + ], + "_prefab": { + "__id__": 21 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 220, + "height": 64 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + -110, + 560, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "409ffb232ae74a039bf513", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 20 + }, + "_enabled": true, + "_id": "", + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "清本地领取", + "_N$string": "清本地领取", + "_fontSize": 28, + "_lineHeight": 37, + "_enableWrapText": true, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 1, + "_N$cacheMode": 0 + }, + { + "__type__": "cc.Node", + "_name": "clearAuto", + "_objFlags": 0, + "_parent": { + "__id__": 8 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 25 + } + ], + "_prefab": { + "__id__": 24 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 220, + "height": 64 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 110, + 560, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "2ab695c9b5ad4ecd9c3a7a", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 23 + }, + "_enabled": true, + "_id": "", + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "清自动弹窗", + "_N$string": "清自动弹窗", + "_fontSize": 28, + "_lineHeight": 37, + "_enableWrapText": true, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 1, + "_N$cacheMode": 0 + }, + { + "__type__": "cc.Node", + "_name": "recheck", + "_objFlags": 0, + "_parent": { + "__id__": 8 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 28 + } + ], + "_prefab": { + "__id__": 27 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 220, + "height": 64 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 330, + 560, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "6553c815e49a4ba699843f", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 26 + }, + "_enabled": true, + "_id": "", + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "重查并尝试弹出", + "_N$string": "重查并尝试弹出", + "_fontSize": 24, + "_lineHeight": 33, + "_enableWrapText": true, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 1, + "_N$cacheMode": 0 + }, + { + "__type__": "cc.Node", + "_name": "notice", + "_objFlags": 0, + "_parent": { + "__id__": 8 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 31 + } + ], + "_prefab": { + "__id__": 30 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 930, + "height": 50 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 485, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "e02108dda30f45d492f7e4", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 29 + }, + "_enabled": true, + "_id": "", + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "仅清当前账号当前活动缓存,不回滚资产或服务器进度", + "_N$string": "仅清当前账号当前活动缓存,不回滚资产或服务器进度", + "_fontSize": 24, + "_lineHeight": 33, + "_enableWrapText": true, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 1, + "_N$verticalAlign": 1, + "_N$fontFamily": "Arial", + "_N$overflow": 1, + "_N$cacheMode": 0 + }, + { + "__type__": "cc.Node", + "_name": "viewport", + "_objFlags": 0, + "_parent": { + "__id__": 8 + }, + "_children": [ + { + "__id__": 35 + } + ], + "_active": true, + "_components": [ + { + "__id__": 34 + }, + { + "__id__": 38 + } + ], + "_prefab": { + "__id__": 33 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 920, + "height": 1080 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + -85, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "0a8eb381e3d64d9d8d665a", + "sync": false + }, + { + "__type__": "cc.Mask", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 32 + }, + "_enabled": true, + "_id": "", + "_type": 0, + "_segments": 64, + "_N$alphaThreshold": 0.1, + "_N$inverted": false, + "_spriteFrame": null + }, + { + "__type__": "cc.Node", + "_name": "content", + "_objFlags": 0, + "_parent": { + "__id__": 32 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 37 + } + ], + "_prefab": { + "__id__": 36 + }, + "_opacity": 255, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 255, + "b": 255, + "a": 255 + }, + "_contentSize": { + "__type__": "cc.Size", + "width": 900, + "height": 1080 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 1 + }, + "_trs": { + "__type__": "TypedArray", + "ctor": "Float64Array", + "array": [ + 0, + 540, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1 + ] + }, + "_eulerAngles": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_skewX": 0, + "_skewY": 0, + "_is3DNode": false, + "_groupIndex": 0, + "groupIndex": 0, + "_id": "" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "38e85521dde94c058f4951", + "sync": false + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 35 + }, + "_enabled": true, + "_id": "", + "_materials": [ + { + "__uuid__": "eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432" + } + ], + "_srcBlendFactor": 770, + "_dstBlendFactor": 771, + "_string": "点击查询接口查看状态", + "_N$string": "点击查询接口查看状态", + "_fontSize": 24, + "_lineHeight": 33, + "_enableWrapText": true, + "_N$file": null, + "_isSystemFontUsed": true, + "_spacingX": 0, + "_batchAsBitmap": false, + "_styleFlags": 0, + "_underlineHeight": 0, + "_N$horizontalAlign": 0, + "_N$verticalAlign": 0, + "_N$fontFamily": "Arial", + "_N$overflow": 3, + "_N$cacheMode": 0 + }, + { + "__type__": "cc.ScrollView", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 32 + }, + "_enabled": true, + "_id": "2a8hyyK7lCELB7KL3Sr3ZQ", + "horizontal": false, + "vertical": true, + "inertia": true, + "brake": 0.75, + "elastic": false, + "bounceDuration": 0.23, + "scrollEvents": [], + "cancelInnerEvents": true, + "_N$content": { + "__id__": 35 + }, + "content": { + "__id__": 35 + }, + "_N$horizontalScrollBar": null, + "_N$verticalScrollBar": null + } +] diff --git a/assets/seven_day_gift/test/SevenDayTest.prefab.meta b/assets/seven_day_gift/test/SevenDayTest.prefab.meta new file mode 100644 index 00000000..d21b23ab --- /dev/null +++ b/assets/seven_day_gift/test/SevenDayTest.prefab.meta @@ -0,0 +1,9 @@ +{ + "ver": "1.3.2", + "uuid": "1ee6fd97-31a3-46e7-b3f4-cc8a7f219de2", + "importer": "prefab", + "optimizationPolicy": "AUTO", + "asyncLoadAssets": false, + "readonly": false, + "subMetas": {} +} \ No newline at end of file diff --git a/assets/seven_day_gift/test/SevenDayTest.ts b/assets/seven_day_gift/test/SevenDayTest.ts new file mode 100644 index 00000000..714b65ad --- /dev/null +++ b/assets/seven_day_gift/test/SevenDayTest.ts @@ -0,0 +1,138 @@ +import SevenDayGiftBootstrapApi from "../../Script/seven_day_gift/SevenDayGiftBootstrapApi"; + +const { ccclass } = cc._decorator; +const CLAIM_KEY = "seven_day_gift_processed_claims_v1"; +const AUTO_KEY = "seven_day_gift_auto_open_v1"; + +/** 仅独立测试服可用。只清本账号、本活动的本地记录,不改资产和服务器。 */ +@ccclass +export default class SevenDayTest extends cc.Component { + private panel: cc.Node = null; + private output: cc.Label = null; + private snapshot: any = null; + private snapshotUid = ""; + private snapshotUrl = ""; + private responseCode: any = null; + private querying = false; + private isActivityOpen: () => boolean = () => false; + private recheck: () => void = () => {}; + + onLoad() { + if (!this.allowed()) { this.node.active = false; return; } + this.panel = this.node.getChildByName("panel"); + const background = this.panel.addComponent(cc.Graphics); + background.fillColor = cc.color(25, 30, 42, 245); + background.roundRect(-500, -700, 1000, 1400, 18); + background.fill(); + this.output = this.panel.getChildByName("viewport").getChildByName("content").getComponent(cc.Label); + this.bind(this.node.getChildByName("entry"), () => { this.panel.active = true; this.render("点击“查询接口”获取当前快照;查询可能影响服务端签到记录。"); }); + this.bind(this.panel.getChildByName("close"), () => this.panel.active = false); + this.bind(this.panel.getChildByName("query"), () => this.query()); + this.bind(this.panel.getChildByName("clearClaim"), () => this.clearCache(true)); + this.bind(this.panel.getChildByName("clearAuto"), () => this.clearCache(false)); + this.bind(this.panel.getChildByName("recheck"), () => { + if (this.querying || this.isActivityOpen()) { this.render("请先关闭活动弹窗,并等待查询结束。"); return; } + this.panel.active = false; + this.recheck(); + }); + } + + public initialize(isActivityOpen: () => boolean, recheck: () => void) { + this.isActivityOpen = isActivityOpen; + this.recheck = recheck; + } + + private allowed(): boolean { + return SevenDayGiftBootstrapApi.getTestEnvironment().allowed; + } + + private bind(node: cc.Node, action: () => void) { + node.on(cc.Node.EventType.TOUCH_END, (event: cc.Event) => { + event.stopPropagation(); + if (!this.allowed()) { this.node.active = false; return; } + action(); + }, this); + } + + private query() { + if (this.querying || this.isActivityOpen()) { this.render("请先关闭七日活动弹窗,并等待已有查询结束。"); return; } + const uid = SevenDayGiftBootstrapApi.getUid(); + if (!uid) { this.render("当前没有登录 UID。"); return; } + this.querying = true; + this.responseCode = null; + this.snapshot = null; + this.snapshotUid = uid; + this.snapshotUrl = SevenDayGiftBootstrapApi.getTestEnvironment().baseUrl; + this.render("查询中…"); + SevenDayGiftBootstrapApi.getInfo(response => { + if (!cc.isValid(this.node, true)) return; + this.querying = false; + if (!this.allowed()) { this.node.active = false; return; } + if (uid !== SevenDayGiftBootstrapApi.getUid() || this.snapshotUrl !== SevenDayGiftBootstrapApi.getTestEnvironment().baseUrl) { + this.snapshot = null; + this.render("账号或地址已改变,请重新查询。"); + return; + } + this.responseCode = response && response.code; + this.snapshot = response && response.code === 1 && response.data || null; + this.render(this.snapshot ? "查询完成。仅展示数据,不自动领取。" : "接口失败或 data 为空/false,未取得有效活动快照。"); + }); + } + + private clearCache(claims: boolean) { + if (this.querying || this.isActivityOpen()) { this.render("请先关闭七日活动弹窗,并等待查询结束。"); return; } + const uid = SevenDayGiftBootstrapApi.getUid(); + const info = this.snapshot; + if (!info || !info.activityId || !info.startAt || uid !== this.snapshotUid || this.snapshotUrl !== SevenDayGiftBootstrapApi.getTestEnvironment().baseUrl) { + this.render("请先查询当前账号的有效活动快照,再清除此活动缓存。"); + return; + } + const storage = cc.fx.StorageMessage; + if (claims) { + const records = storage.getStorage(CLAIM_KEY) || {}; + const prefix = uid + ":"; + Object.keys(records).forEach(key => { + if (key.indexOf(prefix) !== 0) return; + try { + const claim = JSON.parse(key.slice(prefix.length)); + if (Array.isArray(claim) && claim[0] === info.activityId && claim[1] === info.startAt) delete records[key]; + } catch (_) { /* 不清理其他格式的数据。 */ } + }); + storage.setStorage(CLAIM_KEY, records); + } else { + storage.removeStorage(AUTO_KEY + ":" + uid + ":" + info.activityId); + } + this.render((claims ? "已清除本活动本地领取防重记录。" : "已清除本活动自动弹窗记录。") + "服务器进度和已到账资产不变;再次领取可能增加资产。"); + } + + private render(message: string) { + const env = SevenDayGiftBootstrapApi.getTestEnvironment(); + const uid = SevenDayGiftBootstrapApi.getUid(); + const info = this.snapshot; + const fields: any = {}; + if (info) { + ["serverNow", "activityId", "status", "triggerLevel", "triggerReached", "startAt", "endAt", "claimedCount", "todayClaimed", "canClaim", "nextRewardDay"].forEach(key => fields[key] = info[key]); + fields.rewards = Array.isArray(info.rewards) ? info.rewards.map(reward => ({ + day: reward.day, claimed: reward.claimed, + items: Array.isArray(reward.items) ? reward.items.map(item => ({ type: item.type, count: item.count, amount: item.amount, itemId: item.itemId })) : [], + })) : []; + } + const autoKey = info && AUTO_KEY + ":" + uid + ":" + info.activityId; + const records = cc.fx.StorageMessage.getStorage(CLAIM_KEY) || {}; + const claimId = info && uid + ":" + JSON.stringify([info.activityId, info.startAt, info.nextRewardDay]); + const details = Object.keys(fields).filter(key => key !== "rewards") + .map(key => key + ": " + JSON.stringify(fields[key])); + (fields.rewards || []).forEach(reward => { + details.push("day=" + reward.day + " claimed=" + reward.claimed); + reward.items.forEach(item => details.push(" " + JSON.stringify(item))); + }); + this.output.string = [message, "环境:" + env.version, "当前地址:" + env.baseUrl, + "接口:" + env.baseUrl.replace(/\/$/, "") + "/signInActivityInfo", "UID:" + uid, + "响应 code:" + this.responseCode, "已弹日期记录:" + (autoKey ? cc.fx.StorageMessage.getStorage(autoKey) : "未查询"), + "当前奖励本地防重:" + (claimId ? records[claimId] === true : "未查询"), + "接口使用字段(体力原值为秒):", details.join("\n") || "尚无有效快照"].join("\n\n"); + this.scheduleOnce(() => { + if (cc.isValid(this.node, true)) this.panel.getChildByName("viewport").getComponent(cc.ScrollView).scrollToTop(0); + }, 0); + } +} diff --git a/assets/seven_day_gift/test/SevenDayTest.ts.meta b/assets/seven_day_gift/test/SevenDayTest.ts.meta new file mode 100644 index 00000000..af1335bf --- /dev/null +++ b/assets/seven_day_gift/test/SevenDayTest.ts.meta @@ -0,0 +1,10 @@ +{ + "ver": "1.1.0", + "uuid": "ca3bbce5-f3ff-4a1d-9419-0af10dd750a1", + "importer": "typescript", + "isPlugin": false, + "loadPluginInWeb": true, + "loadPluginInNative": true, + "loadPluginInEditor": false, + "subMetas": {} +} \ No newline at end of file diff --git a/assets/seven_day_gift/texture/catAnimation3.png b/assets/seven_day_gift/texture/catAnimation3.png new file mode 100644 index 00000000..d6bc5aea Binary files /dev/null and b/assets/seven_day_gift/texture/catAnimation3.png differ diff --git a/assets/seven_day_gift/texture/catAnimation3.png.meta b/assets/seven_day_gift/texture/catAnimation3.png.meta new file mode 100644 index 00000000..1ae71cf7 --- /dev/null +++ b/assets/seven_day_gift/texture/catAnimation3.png.meta @@ -0,0 +1,38 @@ +{ + "ver": "2.3.7", + "uuid": "d9cc364f-2a2e-499f-89f5-c55501f60f72", + "importer": "texture", + "type": "sprite", + "wrapMode": "clamp", + "filterMode": "bilinear", + "premultiplyAlpha": false, + "genMipmaps": false, + "packable": true, + "width": 800, + "height": 800, + "platformSettings": {}, + "subMetas": { + "catAnimation3": { + "ver": "1.0.6", + "uuid": "3086628d-3da9-4647-a6cd-56a837327074", + "importer": "sprite-frame", + "rawTextureUuid": "d9cc364f-2a2e-499f-89f5-c55501f60f72", + "trimType": "auto", + "trimThreshold": 1, + "rotated": false, + "offsetX": 18, + "offsetY": 32.5, + "trimX": 142, + "trimY": 62, + "width": 552, + "height": 611, + "rawWidth": 800, + "rawHeight": 800, + "borderTop": 0, + "borderBottom": 0, + "borderLeft": 0, + "borderRight": 0, + "subMetas": {} + } + } +} \ No newline at end of file diff --git a/assets/seven_day_gift/texture/道具数量(中).meta b/assets/seven_day_gift/texture/reward_numbers_medium.meta similarity index 100% rename from assets/seven_day_gift/texture/道具数量(中).meta rename to assets/seven_day_gift/texture/reward_numbers_medium.meta diff --git a/assets/seven_day_gift/texture/道具数量(中)/0.png b/assets/seven_day_gift/texture/reward_numbers_medium/0.png similarity index 100% rename from assets/seven_day_gift/texture/道具数量(中)/0.png rename to assets/seven_day_gift/texture/reward_numbers_medium/0.png diff --git a/assets/seven_day_gift/texture/道具数量(中)/0.png.meta b/assets/seven_day_gift/texture/reward_numbers_medium/0.png.meta similarity index 100% rename from assets/seven_day_gift/texture/道具数量(中)/0.png.meta rename to assets/seven_day_gift/texture/reward_numbers_medium/0.png.meta diff --git a/assets/seven_day_gift/texture/道具数量(中)/1.png b/assets/seven_day_gift/texture/reward_numbers_medium/1.png similarity index 100% rename from assets/seven_day_gift/texture/道具数量(中)/1.png rename to assets/seven_day_gift/texture/reward_numbers_medium/1.png diff --git a/assets/seven_day_gift/texture/道具数量(中)/1.png.meta b/assets/seven_day_gift/texture/reward_numbers_medium/1.png.meta similarity index 100% rename from assets/seven_day_gift/texture/道具数量(中)/1.png.meta rename to assets/seven_day_gift/texture/reward_numbers_medium/1.png.meta diff --git a/assets/seven_day_gift/texture/道具数量(中)/2.png b/assets/seven_day_gift/texture/reward_numbers_medium/2.png similarity index 100% rename from assets/seven_day_gift/texture/道具数量(中)/2.png rename to assets/seven_day_gift/texture/reward_numbers_medium/2.png diff --git a/assets/seven_day_gift/texture/道具数量(中)/2.png.meta b/assets/seven_day_gift/texture/reward_numbers_medium/2.png.meta similarity index 100% rename from assets/seven_day_gift/texture/道具数量(中)/2.png.meta rename to assets/seven_day_gift/texture/reward_numbers_medium/2.png.meta diff --git a/assets/seven_day_gift/texture/道具数量(中)/3.png b/assets/seven_day_gift/texture/reward_numbers_medium/3.png similarity index 100% rename from assets/seven_day_gift/texture/道具数量(中)/3.png rename to assets/seven_day_gift/texture/reward_numbers_medium/3.png diff --git a/assets/seven_day_gift/texture/道具数量(中)/3.png.meta b/assets/seven_day_gift/texture/reward_numbers_medium/3.png.meta similarity index 100% rename from assets/seven_day_gift/texture/道具数量(中)/3.png.meta rename to assets/seven_day_gift/texture/reward_numbers_medium/3.png.meta diff --git a/assets/seven_day_gift/texture/道具数量(中)/4.png b/assets/seven_day_gift/texture/reward_numbers_medium/4.png similarity index 100% rename from assets/seven_day_gift/texture/道具数量(中)/4.png rename to assets/seven_day_gift/texture/reward_numbers_medium/4.png diff --git a/assets/seven_day_gift/texture/道具数量(中)/4.png.meta b/assets/seven_day_gift/texture/reward_numbers_medium/4.png.meta similarity index 100% rename from assets/seven_day_gift/texture/道具数量(中)/4.png.meta rename to assets/seven_day_gift/texture/reward_numbers_medium/4.png.meta diff --git a/assets/seven_day_gift/texture/道具数量(中)/5.png b/assets/seven_day_gift/texture/reward_numbers_medium/5.png similarity index 100% rename from assets/seven_day_gift/texture/道具数量(中)/5.png rename to assets/seven_day_gift/texture/reward_numbers_medium/5.png diff --git a/assets/seven_day_gift/texture/道具数量(中)/5.png.meta b/assets/seven_day_gift/texture/reward_numbers_medium/5.png.meta similarity index 100% rename from assets/seven_day_gift/texture/道具数量(中)/5.png.meta rename to assets/seven_day_gift/texture/reward_numbers_medium/5.png.meta diff --git a/assets/seven_day_gift/texture/道具数量(中)/6.png b/assets/seven_day_gift/texture/reward_numbers_medium/6.png similarity index 100% rename from assets/seven_day_gift/texture/道具数量(中)/6.png rename to assets/seven_day_gift/texture/reward_numbers_medium/6.png diff --git a/assets/seven_day_gift/texture/道具数量(中)/6.png.meta b/assets/seven_day_gift/texture/reward_numbers_medium/6.png.meta similarity index 100% rename from assets/seven_day_gift/texture/道具数量(中)/6.png.meta rename to assets/seven_day_gift/texture/reward_numbers_medium/6.png.meta diff --git a/assets/seven_day_gift/texture/道具数量(中)/7.png b/assets/seven_day_gift/texture/reward_numbers_medium/7.png similarity index 100% rename from assets/seven_day_gift/texture/道具数量(中)/7.png rename to assets/seven_day_gift/texture/reward_numbers_medium/7.png diff --git a/assets/seven_day_gift/texture/道具数量(中)/7.png.meta b/assets/seven_day_gift/texture/reward_numbers_medium/7.png.meta similarity index 100% rename from assets/seven_day_gift/texture/道具数量(中)/7.png.meta rename to assets/seven_day_gift/texture/reward_numbers_medium/7.png.meta diff --git a/assets/seven_day_gift/texture/道具数量(中)/8.png b/assets/seven_day_gift/texture/reward_numbers_medium/8.png similarity index 100% rename from assets/seven_day_gift/texture/道具数量(中)/8.png rename to assets/seven_day_gift/texture/reward_numbers_medium/8.png diff --git a/assets/seven_day_gift/texture/道具数量(中)/8.png.meta b/assets/seven_day_gift/texture/reward_numbers_medium/8.png.meta similarity index 100% rename from assets/seven_day_gift/texture/道具数量(中)/8.png.meta rename to assets/seven_day_gift/texture/reward_numbers_medium/8.png.meta diff --git a/assets/seven_day_gift/texture/道具数量(中)/9.png b/assets/seven_day_gift/texture/reward_numbers_medium/9.png similarity index 100% rename from assets/seven_day_gift/texture/道具数量(中)/9.png rename to assets/seven_day_gift/texture/reward_numbers_medium/9.png diff --git a/assets/seven_day_gift/texture/道具数量(中)/9.png.meta b/assets/seven_day_gift/texture/reward_numbers_medium/9.png.meta similarity index 100% rename from assets/seven_day_gift/texture/道具数量(中)/9.png.meta rename to assets/seven_day_gift/texture/reward_numbers_medium/9.png.meta diff --git a/assets/seven_day_gift/texture/道具数量(中)/chenhao.png b/assets/seven_day_gift/texture/reward_numbers_medium/chenhao.png similarity index 100% rename from assets/seven_day_gift/texture/道具数量(中)/chenhao.png rename to assets/seven_day_gift/texture/reward_numbers_medium/chenhao.png diff --git a/assets/seven_day_gift/texture/道具数量(中)/chenhao.png.meta b/assets/seven_day_gift/texture/reward_numbers_medium/chenhao.png.meta similarity index 100% rename from assets/seven_day_gift/texture/道具数量(中)/chenhao.png.meta rename to assets/seven_day_gift/texture/reward_numbers_medium/chenhao.png.meta diff --git a/assets/seven_day_gift/texture/道具数量(中)/jiahao.png b/assets/seven_day_gift/texture/reward_numbers_medium/jiahao.png similarity index 100% rename from assets/seven_day_gift/texture/道具数量(中)/jiahao.png rename to assets/seven_day_gift/texture/reward_numbers_medium/jiahao.png diff --git a/assets/seven_day_gift/texture/道具数量(中)/jiahao.png.meta b/assets/seven_day_gift/texture/reward_numbers_medium/jiahao.png.meta similarity index 100% rename from assets/seven_day_gift/texture/道具数量(中)/jiahao.png.meta rename to assets/seven_day_gift/texture/reward_numbers_medium/jiahao.png.meta diff --git a/assets/seven_day_gift/texture/道具数量(中)/min.png b/assets/seven_day_gift/texture/reward_numbers_medium/min.png similarity index 100% rename from assets/seven_day_gift/texture/道具数量(中)/min.png rename to assets/seven_day_gift/texture/reward_numbers_medium/min.png diff --git a/assets/seven_day_gift/texture/道具数量(中)/min.png.meta b/assets/seven_day_gift/texture/reward_numbers_medium/min.png.meta similarity index 100% rename from assets/seven_day_gift/texture/道具数量(中)/min.png.meta rename to assets/seven_day_gift/texture/reward_numbers_medium/min.png.meta diff --git a/build-templates/wechatgame/game.json b/build-templates/wechatgame/game.json index 795daf66..db62f170 100644 --- a/build-templates/wechatgame/game.json +++ b/build-templates/wechatgame/game.json @@ -24,6 +24,14 @@ } }, "subpackages": [ + { + "name": "gameplay_intro", + "root": "subpackages/gameplay_intro" + }, + { + "name": "mini_program_benefits", + "root": "subpackages/mini_program_benefits" + }, { "name": "gacha_bundle", "root": "subpackages/gacha_bundle" diff --git a/build-templates/wechatgame/project.config.json b/build-templates/wechatgame/project.config.json index 8c33b8f7..52ec70ce 100644 --- a/build-templates/wechatgame/project.config.json +++ b/build-templates/wechatgame/project.config.json @@ -47,4 +47,4 @@ "tabSize": 2 }, "simulatorPluginLibVersion": {} -} \ No newline at end of file +} diff --git a/docs/seven-day-gift-maintenance.md b/docs/seven-day-gift-maintenance.md deleted file mode 100644 index ebb44121..00000000 --- a/docs/seven-day-gift-maintenance.md +++ /dev/null @@ -1,552 +0,0 @@ -> 当前交互更新:七日弹窗无关闭按钮;首次外部点击与卡片领取一致,只领取当前奖励,后一次外部点击再关闭。领取及效果期间禁止重复操作。奖励改用 `assets/reward_claim_effect/RewardClaimEffect.ts` 上浮效果;下文旧版自动领取、关闭按钮和公共奖励动画说明仅作历史记录,测试以 `testSeven-local-preview.md` 为准。 - -# 七日好礼活动实现与维护说明 - -本文记录 `feature/seven_day_gift` 分支从 `main` 拉出后完成的七日签到活动相关改动,供后续开发、联调、测试和上线维护使用。 - -记录日期:2026-09-04 - -基线提交:`6b56b88284e1bb864241530a23aa3376ce0faf3e` - -开发分支:`feature/seven_day_gift` - -> 重要:记录时该分支相对 `main` 没有新的已提交 commit,功能改动仍在工作区。本文描述的是“当前工作区相对 `main`”的实际差异,不代表这些文件已经提交或合并。 - -## 1. 功能目标 - -本次增加一个由后端控制状态的七日好礼活动,主要规则如下: - -- 玩家主线达到活动触发条件后,在主页自动弹出七日活动,不再显示手动入口按钮。 -- 当前约定的触发等级为 23,但前端不自行计算触发结果,以后端返回的 `triggerReached` 为准。 -- 活动有效期由后端的 `startAt`、`endAt` 和 `status` 控制;当前产品约定是 14 天内领取 7 天奖励。 -- 每个服务器自然日最多领取一次,具体是否可领取以后端 `canClaim` 为准。 -- 当天有奖励可领且当天没有自动弹过时,进入主页自动打开并自动领取当天奖励。 -- 自动领取结束(成功或失败)后才开放关闭按钮;失败时可点击当天卡片重试。 -- 当天领取后关闭页面,即销毁活动实例并释放 Bundle;第二天满足条件时重新加载。 -- 开发版和体验版使用测试服务器;正式版使用正式服务器。 -- 上线代码不包含测试面板、接口反馈、模拟日期或测试资产注入功能。 - -## 2. 总体结构 - -七日活动采用“主包轻量宿主 + 活动 Bundle”的结构。主包只负责首次状态查询、自动弹出判断和 Bundle 生命周期;活动 UI、领取和发奖代码均放入 `seven_day_gift` Bundle: - -```text -HomeScene -└─ Canvas/sevenDayGift 主包中的轻量宿主节点 - ├─ SevenDayGiftHost Bundle 加载与释放 - └─ SevenDayGiftBootstrapApi 首次状态查询 - -seven_day_gift Bundle -├─ prefab/sevenDayGift.prefab 活动弹窗 -├─ SevenDayGift + SevenDayGiftRuntime UI 与业务流程 -├─ SevenDayGiftApi + SevenDayGiftReward 完整接口与发奖 -└─ texture/* 活动图片 -``` - -核心调用链: - -```text -进入 HomeScene / 小游戏回到前台 - ↓ -SevenDayGiftHost.queryActivity(true) - ↓ -signInActivityInfo - ↓ -判断活动是否可见、当天是否可领取 - ↓ -满足 canClaim 且当天未弹过 → 自动打开活动 - -自动弹窗完成后自动领取当天卡片 - ↓ -使用本次查询的 nextRewardDay 对应 items - ↓ -SevenDayGiftReward.grant - ↓ -更新本地资产并同步相关资产接口 - ↓ -打开项目公共奖励动画 - ↓ -在当前快照上更新已领取状态,不重复查询 -``` - -## 3. 新增文件 - -### 3.1 主包引导层 - -`assets/Script/seven_day_gift/SevenDayGiftHost.ts` 挂载在 `HomeScene` 的 `sevenDayGift` 节点上,只负责: - -- 进入主页时查询活动。 -- 监听 `cc.game.EVENT_SHOW`,从后台回到前台时重新查询活动。 -- 判断是否需要自动弹出。 -- 按需加载 `seven_day_gift` Bundle 和 `prefab/sevenDayGift`。 -- 弹窗关闭后销毁实例,并在下一帧执行 `bundle.releaseAll()` 和 `cc.assetManager.removeBundle()`。 - -`assets/Script/seven_day_gift/SevenDayGiftBootstrapApi.ts` 是主包中的最小查询接口,只包含 `signInActivityInfo`、UID 获取、服务器选择、超时和基础日志。它不能引用 Bundle 内的完整 API、Reward、Prefab 或调试脚本,否则这些代码会被重新打进主包。 - -#### 活动可见条件 - -`isActivityVisible()` 当前要求: - -- 返回了 `activityId`。 -- `triggerReached === true`。 -- `status` 不是 `expired`。 -- `status` 不是 `completed`。 -- `serverNow < endAt`。 - -前端没有直接检查 `startAt`,正常情况下应由后端通过 `status` 保证活动尚未开始时不返回可见状态。 - -#### 自动弹出条件 - -`shouldAutoOpen()` 当前要求: - -- 活动处于可见状态。 -- 后端返回 `canClaim === true`。 -- 本地没有当前用户、当前活动、当天的自动弹出记录。 - -本地记录键: - -```text -seven_day_gift_auto_open_v1:: -``` - -值为根据 `serverNow` 计算出的东八区自然日编号。自动弹出前先写记录,再执行 `show()`,防止同一运行过程重复触发。 - -以下操作不会自动清除该记录: - -- 修改服务器关卡等级。 -- 将等级从 23 改回 22 后再次通关。 -- 重新请求活动接口。 -- 关闭活动但不领取。 - -清除微信缓存、更换设备、更换 UID 或更换 `activityId`,会允许再次自动弹出。 - -#### 查询时机 - -- `HomeScene` 中宿主组件执行 `onLoad()`。 -- 小游戏触发 `cc.game.EVENT_SHOW`,并且宿主仍位于当前主页场景。 - -七日活动宿主不在关卡场景中,因此玩家在关卡里达到触发等级时不会立即弹窗;返回主页后才查询和判断。 - -#### 加载与释放 - -- 点击领取时,加载动画最长兜底 7 秒。 -- 七日 API 自身的请求超时是 5.5 秒。 -- 自动后台查询不主动显示 Loading,避免进入主页时无条件遮挡界面。 -- 各微信环境都只有命中自动弹出条件时才加载 Bundle。 -- Cocos 编辑器预览不主动请求活动,也不加载 Bundle;联调应使用微信开发版或体验版。 -- 节点先销毁,Bundle 在下一帧释放,避免在组件销毁回调尚未结束时回收其脚本和资源。 - -### 3.2 `assets/seven_day_gift/SevenDayGift.ts` - -活动弹窗视图组件,负责: - -- 缓存 7 张奖励卡片。 -- 根据接口数据刷新卡片底图、日期、奖励图标和领取状态。 -- 仅允许点击 `nextRewardDay` 对应且 `canClaim` 为真的卡片。 -- 防止领取过程中重复点击。 -- 活动打开和关闭时播放缩放、透明度动画。 -- 当前可领取卡片播放轻微循环缩放提示。 -- 自动领取期间隐藏关闭按钮并禁止遮罩关闭;领取回调结束后才允许关闭。 - -UI 约定: - -- 图片统一保持 `cc.Color.WHITE`,不对原图进行额外染色。 -- 活动卡片底部状态文字节点被隐藏,不显示“点击领取/未解锁”等附加文字。 -- 单奖励和多奖励使用相同的大图标尺寸。 -- 多奖励从左到右排列并允许部分重叠,但按卡片可用宽度计算间距,避免越界。 -- 卡片只显示道具图片,不显示奖励名称或数量文字。 -- 第 7 天猫皮肤在未解锁时使用隐藏猫图片,解锁后使用正常猫图片。 - -### 3.3 `assets/seven_day_gift/SevenDayGiftApi.ts` - -七日活动接口封装和 TypeScript 数据契约,负责: - -- 活动查询由主包 `SevenDayGiftBootstrapApi` 调用 `signInActivityInfo`,Bundle 内不再请求活动接口。 -- 保存猫皮肤:`setCatArr`。 -- 保存普通道具:`userProp`。 -- 5.5 秒没有回调时返回统一超时结果,迟到回调不再重复执行业务回调。 - -UID 优先读取: - -```text -cc.fx.StorageMessage.getStorage("uid") -``` - -并同步回 `cc.fx.GameConfig.GM_INFO.uid`。如果发现 UID 改变,应先检查登录流程和本地 `uid` 缓存,而不是只看七日活动脚本。 - -### 3.4 `assets/seven_day_gift/SevenDayGiftReward.ts` - -将后端奖励转换成项目现有资产操作,支持以下类型: - -| 后端类型 | 前端处理 | -| --- | --- | -| `coin` | `cc.fx.GameTool.changeCoin()` | -| `hammer` | 增加 `GM_INFO.hammerAmount`,保存 `prop`,通过 `SevenDayGiftApi.saveProps()` 同步 `/userProp` | -| `freeze` | 增加 `GM_INFO.freezeAmount`,保存 `prop`,通过 `SevenDayGiftApi.saveProps()` 同步 `/userProp` | -| `magic_wand` | 增加 `GM_INFO.magicAmount`,保存 `prop`,通过 `SevenDayGiftApi.saveProps()` 同步 `/userProp` | -| `infinite_health` | 调用 `setUserPowerTime(seconds, "seven_day_gift")` | -| `cat_skin` | 使用 `itemId` 调用 `setCatArr?action=save` | - -奖励数量兼容: - -```ts -const rewardAmount = item.count !== undefined ? item.count : item.amount; -``` - -即优先读取 `count`,旧接口使用 `amount` 时仍能正常发奖。卡片虽然不显示数量文字,发奖逻辑仍必须保留此兼容,除非后端已确认所有环境和历史数据都统一完成迁移。 - -领取幂等记录保存在: - -```text -seven_day_gift_processed_claims_v1 -``` - -记录键为 `:`;这里的 `claimId` 是前端用 `[activityId, startAt, nextRewardDay]` 序列化生成的本地同步标识,接口不需要返回该字段。同一个 `claimId` 在同一设备上再次处理时直接视为成功,不重复增加资产。 - -注意:这个记录是客户端本地幂等保护,不能代替服务端活动领取的幂等校验。清缓存或换设备后本地记录会消失,后端仍必须保证同一用户、同一天、同一领取不能重复发放。 - -### 3.5 `assets/seven_day_gift/SevenDayGiftRuntime.ts` - -Bundle 内的活动业务控制器,只有 Bundle 加载后才进入内存,负责: - -- 直接消费主页查询结果中的当日奖励,交给 `SevenDayGiftReward` 同步本地资产及对应资产接口。 -- 更新当前快照的领取状态、调用项目公共奖励动画;不再发起额外活动请求。 -- 管理主页 Loading、错误提示和领取失败后的重试状态。 -- 销毁时清理 Loading 和运行状态。 - -旧的 `SevenDayHomeEntryLayout.ts` 和主页入口 Prefab 已删除;七日活动不再参与主页入口排序,也不会改动商城、排行榜等既有入口的位置或透明度。 - -### 3.6 Prefab 和图片资源 - -新增: - -- `assets/seven_day_gift/prefab/sevenDayGift.prefab`:七日活动主弹窗。 -- `assets/seven_day_gift/texture/*.png`:活动面板、卡片、标题、猫、道具和已领取标记等图片。 - -所有 Cocos 资源必须连同对应 `.meta` 文件提交,不能只提交 PNG、Prefab 或 TypeScript 文件。`.meta` 中的 UUID 是场景和 Prefab 引用资源的依据。 - -### 3.7 `assets/Script/ActivityPopupAnimator.ts` - -公共活动弹窗动画工具,七日活动通过 `popupAnimation` 选择动画类型。该脚本属于主包是因为 Bundle 内弹窗需要引用它;它不包含活动数据、测试入口或网络逻辑。 - -## 4. 接口契约 - -### 4.1 查询活动 `signInActivityInfo` - -请求: - -```json -{ - "uid": "用户UID" -} -``` - -主要返回字段: - -| 字段 | 含义 | -| --- | --- | -| `serverNow` | 服务器当前时间,支持毫秒、秒级数值或可解析日期字符串 | -| `activityId` | 活动标识,同时用于自动弹出本地键 | -| `status` | 当前状态,前端明确识别 `active`、`completed`、`expired` | -| `triggerLevel` | 后端配置的触发等级,仅展示/诊断 | -| `triggerReached` | 后端最终触发判断;是否允许自动弹出依赖此字段 | -| `startAt` | 活动开始时间,当前前端不直接校验 | -| `endAt` | 活动结束时间,活动可见性判断会校验 | -| `claimedCount` | 已领取天数 | -| `todayClaimed` | 当天是否已领取 | -| `canClaim` | 当前是否允许领取,同时控制自动弹窗和卡片领取 | -| `nextRewardDay` | 下一次应该领取第几天 | -| `rewards` | 7 天奖励数组及每项 `claimed` 状态 | - -活动自动弹窗要求活动处于可见状态、`canClaim === true` 且当天未弹过。当前版本没有手动入口。 - -### 4.2 查询结果直接驱动领取 - -不再使用独立领取接口。`signInActivityInfo` 的请求携带 uid,由公共 POST 层补 token,不传 gameName。未达到 23 关时 `code: 1, data: false`,主页不弹窗。 - -达到条件后,使用查询响应中的 `nextRewardDay` 在 `rewards` 中找到对应 `day` 的 `items`。自动弹窗动画结束后同步这些奖励,完成后本地更新 claimed、claimedCount、todayClaimed、canClaim 和第七天 completed 状态,再播放公共奖励动画。领取过程不重新请求活动接口。 - -每天自动弹窗记录按 UID、活动 ID 和服务器 UTC+8 日期隔离。同步失败允许在当前弹窗点击当天卡片重试,但不清除当天已弹记录;关闭后当天不会再次自动弹出。弹窗打开期间切回前台不重复查询。 - -当前沿用客户端增加资产并调用资产保存接口的方式;查询响应必须是可消费的领取快照。后端若已经直接增加资产,必须改为读取资产最终值,不能再使用客户端累加。服务器需要维护跨日进度和幂等;前端不会把自己计算的 claimedCount 写回活动接口。 - -### 4.3 当前奖励配置 - -当前已联调的后端数据为: - -| 天数 | 奖励 | -| ---: | --- | -| 1 | 无限体力 900 秒(15 分钟) | -| 2 | 锤子 ×1 | -| 3 | 无限体力 1800 秒(30 分钟) | -| 4 | 冻结 ×1、魔法棒 ×1 | -| 5 | 金币 ×600 | -| 6 | 锤子 ×1、冻结 ×1(策划调整:删除魔法棒,服务端待同步确认) | -| 7 | 无限体力 3600 秒(1 小时)、猫皮肤 `itemId=12` ×1 | - -正式奖励完全以服务端 `rewards` 为准,前端不再维护模拟奖励配置。 - -## 5. 环境和服务器路由 - -服务器地址定义在 `assets/Script/module/Pay/Utils.ts`: - -```text -正式服务器:https://q6rvwvtnga.sealoshzh.site/ -测试服务器:https://sor779u2w8.sealoshzh.site/ -``` - -路由规则: - -| `envVersion` | 项目识别 | 使用地址 | -| --- | --- | --- | -| `develop` | 开发版 | 测试服务器 | -| `trial` | 体验版 | 测试服务器 | -| `release` | 正式版 | 正式服务器 | -| 其他/未知 | 未知版本 | 正式服务器兜底 | - -因此正常发布流程不需要上线前手工把 `testHttpip` 改成正式地址。体验版继续访问测试服,正式发布后自动切换正式服。 - -正式上线前必须同时确认: - -- 微信后台已经配置正式请求域名。 -- 开发/体验测试需要的测试域名也已配置。 -- 两个服务器部署了兼容的数据结构和对应接口。 -- 正式服的活动配置、奖励、触发等级、活动期限已经检查。 - -## 6. 对主项目原有文件的修改 - -### 6.1 `assets/Scene/HomeScene.fire` - -语义上的新增内容只有 `Canvas/sevenDayGift` 活动宿主节点,并挂载主包中的 `SevenDayGiftHost`。场景不再序列化引用活动 Prefab;宿主通过 Bundle 名和资源路径动态加载,避免 Prefab 依赖把整个活动反向带入主包。 - -由于 Cocos 场景文件使用数组 `__id__` 交叉引用,插入节点后大量后续编号发生位移,Git 会显示上千行机械差异。评审时应重点确认新增节点、父节点、组件和 UUID 引用,不应把所有 `__id__` 位移误判成业务改动。 - -### 6.2 `assets/Script/JiaZai.ts` - -每日任务数据增加空字段保护: - -- `levelPass`、`share`、`useEnergy`、`useProp` 缺失时建立默认对象。 -- 后端任务数据不完整时只更新实际存在的字段。 - -这属于联调期间为避免每日任务接口变化导致主页 `checkTasks()` 崩溃而增加的兼容,不是七日活动核心逻辑,但主页如果在这里抛异常,会连带影响七日活动初始化和测试。七日活动已删除入口,不再修改主页入口渐隐列表。 - -### 6.3 `assets/Script/GameManager.ts` - -登录返回的 `data.data.task` 同时兼容: - -- JSON 字符串。 -- 已经解析好的对象。 -- 缺少部分任务字段。 -- 无法解析的异常字符串。 - -原实现无条件 `JSON.parse()`,后端改为对象或返回异常结构时会抛错;现在使用类型判断和 `try/catch`,只覆盖实际存在的任务字段。 - -### 6.4 `assets/Script/module/Pay/Utils.ts` - -修改内容: - -- 恢复独立测试服务器 `testHttpip`。 -- `POST()` 根据微信环境选择 `testHttpip` 或 `httpip`。 -- 每日任务保存和领取结果增加空字段保护。 - -这项环境路由是七日活动安全测试和上线的关键。不要为了临时联调再次把 `testHttpip` 指向正式服,否则开发版和体验版会修改正式用户数据。 - -### 6.5 `assets/Script/Reward.ts` - -项目公共奖励弹窗原来只支持 Prefab 中预先存在的固定图标节点。本次增加 `getOrCreateRewardIcon()`: - -- 优先查找 `icon/` 现有节点。 -- 找不到节点但调用方传入 `spriteFrame` 时,运行时创建 Sprite 节点。 -- 找不到节点且没有 `spriteFrame` 时打印警告,不让空引用直接崩溃。 -- `cat_skin` 使用 1.1 缩放。 - -七日活动把 `magic_wand` 转为公共奖励弹窗原有名称 `magic`;猫皮肤则额外传入活动中的 `catArt` SpriteFrame。 - -### 6.6 `build-templates` - -记录时 `build-templates` 相对 `main` 没有差异,不属于本次七日活动功能改动。后续排查 `game.json`、`project.config.json` 或分包模板问题时,应单独检查负责人提供的模板版本,不要把模板问题和七日活动脚本混为一谈。 - -## 7. 日志和排查方式 - -上线版本只保留超时、领取失败、资产同步失败和缺失资源等异常日志,不再打印完整请求参数及响应。联调时使用微信开发者工具 Network 面板,并结合后端日志确认接口: - -```text -signInActivityInfo -userCoin / userProp / userPower / setCatArr -``` - -常见问题排查: - -| 现象 | 优先检查 | -| --- | --- | -| 达到 23 关但没有自动弹 | `signInActivityInfo` 的 `activityId`、`triggerReached`、`status`、`endAt`、`canClaim`;再查服务器 `levelAmount` 和本地当天自动弹记录 | -| 每次回主页都重复弹 | 是否每次清缓存;UID/activityId 是否变化;自动弹出本地记录是否被其他逻辑清除 | -| 卡片不能领取 | `canClaim`、`nextRewardDay`、当前卡片 `claimed`;查看 `signInActivityInfo` 返回及资产同步错误 | -| 奖励数量为 0 | 后端是否返回 `count` 或 `amount`;值是否能转换为数字 | -| 猫皮肤动画不显示 | `Reward.ts` 是否收到 `spriteFrame`;活动猫图片 UUID 是否有效 | -| 猫皮肤没有保存 | 查看 `setCatArr` 的请求、`itemId` 和返回内容 | -| 微信报合法域名错误 | 微信后台 request 合法域名是否包含当前环境服务器域名 | -| 活动测试 UID 变化 | 登录接口、本地 `uid` 缓存、`GM_INFO.uid` 是否被其他流程重写 | - -## 8. 正确测试流程 - -### 8.1 UI 验收 - -测试代码已从上线分支删除。请由后端准备不同活动进度的测试 UID,在微信开发版或体验版依次验证: - -- 第 1~7 天布局。 -- 单奖励和多奖励的图片大小与重叠,确认不显示数量文字。 -- 今日已领取状态。 -- 七天完成状态。 -- 活动过期状态。 -- 自动弹出、自动领取、领取期间禁止关闭和领取后关闭。 -- 公共奖励动画。 - -前端不再提供模拟日期、清除自动弹出记录或增加资产按钮。 - -### 8.2 完整测试服流程 - -准备干净测试 UID:服务器等级 22,并且没有七日活动记录。 - -1. 22 级进入主页,确认没有自动弹窗。 -2. 通关并让服务器等级变成 23。 -3. 返回主页,确认自动弹一次并自动发起领取。 -4. 自动领取完成前确认关闭按钮不可用,完成后可以关闭。 -5. 再进主页或切前后台,确认当天不重复自动弹。 -6. 确认领取接口、Loading、奖励动画和资产变化。 -7. 重启游戏,确认资产持久化。 -8. 当天重复点击领取,确认后端不重复发放。 -9. 由后端推进测试日期或重置测试活动,完成第 2~7 天验证。 -10. 领满后确认不再弹出。 -11. 使用另一条未领满记录推进到 `endAt` 之后,确认不再弹出。 -12. 使用一个等级大于 23 且没有活动记录的老玩家 UID,验证补触发逻辑。 - -修改服务器等级不会删除已经创建的活动记录,也不会清除本地自动弹出记录。要重新测试“22 → 23 首次触发”,必须使用新 UID,或者让后端删除该 UID 的活动记录,并同时清除本地自动弹出记录。 - -### 8.3 异常测试 - -- 断网进入主页。 -- 查询接口超时后恢复网络。 -- 领取时连续快速点击。 -- 领取响应返回后立即杀进程。 -- 第 7 天保存猫皮肤时断网。 -- 切后台后重新进入。 -- 清缓存后重新登录。 -- 同一设备切换两个 UID。 -- 后端缺少部分每日任务字段时主页不崩溃。 - -其中“后端已经确认领取,但客户端资产同步尚未完成时退出”是需要重点关注的边界。当前流程消费 `signInActivityInfo` 返回的奖励快照,再更新金币、道具、无限体力和猫皮肤;服务端必须提供可查询、可重试且幂等的最终结果,不能只依赖本地领取标记。 - -## 9. 上线流程 - -1. 整理工作区,只保留确认需要的业务改动。 -2. 把七日活动目录和所有对应 `.meta` 纳入 Git。 -3. 提交功能分支。 -4. 获取并合并最新 `main`。 -5. 冲突解决后重新执行测试服完整流程。 -6. 合并到发布分支或 `main`。 -7. 从确定的发布 commit 做一次干净微信小游戏构建。 -8. 微信开发者工具确认无新增红色业务错误、分包正确、请求域名正常。 -9. 上传开发版本并设置体验版。 -10. Android、iOS 真机测试,确认体验版仍访问测试服务器。 -11. 后端确认正式接口和活动配置已部署。 -12. 提交审核;审核通过后发布。 -13. 如果后台支持灰度,优先灰度并观察活动查询、领取、重复领取拦截和猫皮肤保存错误率。 - -正式发布后需用正式环境测试账号做最小冒烟验证: - -- 页面上不存在“7日测试”和“接口反馈”按钮。 -- `signInActivityInfo` 请求正式服务器。 -- 达标且可领取用户当天自动弹出一次并自动领取。 -- 一次领取可以完整到账。 -- 领取后状态和资产重登仍一致。 - -## 10. 后续修改指南 - -### 10.1 修改触发等级或活动期限 - -触发等级和期限应优先修改后端配置。前端只消费: - -- `triggerLevel` -- `triggerReached` -- `startAt` -- `endAt` -- `status` - -前端没有触发等级和期限的本地模拟配置。 - -### 10.2 修改奖励数量 - -修改后端 `rewards` 配置。保持 `count` 为首选字段,并继续兼容 `amount`。 - -### 10.3 增加新的奖励类型 - -至少检查以下位置: - -1. `SevenDayRewardItem.type` 类型声明。 -2. `SevenDayGift.getRewardIcon()` 的活动卡片图标。 -3. `SevenDayGiftReward.grant()` 的真实资产发放。 -4. `SevenDayGiftRuntime.showRewardWindow()` 对公共奖励类型的转换。 -5. `Reward.ts` 的公共奖励动画图标创建逻辑。 -6. 图片资源及 `.meta`。 -7. 后端奖励配置与服务端幂等处理。 - -只增加图片但不增加发奖分支,会出现“界面能看到、资产不增加”;只增加发奖分支但不配置图标,会出现“奖励到账但动画没有图”。 - -### 10.4 修改 Bundle 加载策略 - -- 主包只能依赖 `SevenDayGiftHost.ts` 和 `SevenDayGiftBootstrapApi.ts`。 -- 不要在主包脚本中静态 `import` Bundle 内的 `SevenDayGift`、`SevenDayGiftRuntime`、完整 API 或 Reward。 -- `HomeScene.fire` 不要重新添加活动 Prefab 的序列化引用。 -- 正式版保持按需加载;如果修改释放逻辑,必须验证关闭活动后 `cc.assetManager.getBundle("seven_day_gift")` 返回空,并验证第二天仍可重新加载。 - -### 10.5 修改活动图片或 Prefab - -- 优先在 Cocos Creator 2.4.15 中操作 Prefab 和场景。 -- 保留已有 `.meta`,不要删除后让 Creator 生成新 UUID。 -- 替换图片时检查透明边距、原始尺寸和 Sprite `sizeMode`。 -- 保存场景后检查是否只产生预期语义变化。 -- 构建后必须在微信开发者工具再次验证,不能只点微信开发者工具“编译”来代替 Cocos 重新构建。 - -## 11. 当前工作区风险快照 - -当前工作区仍有数千项状态变化,绝大多数为 `.meta` 修改,并有 3 个与七日活动无关的 `.meta` 删除: - -```text -assets/gacha_bundle/img/cat.meta -assets/libs/dn-sdk-minigame.meta -assets/pause/texture.meta -``` - -不要使用未经检查的 `git add -A`,否则可能把大量 Creator 自动改写或无关资源变化一起提交。 - -建议提交前逐项确认以下范围: - -```text -assets/seven_day_gift.meta -assets/seven_day_gift/ -assets/Script/seven_day_gift.meta -assets/Script/seven_day_gift/ -assets/Script/ActivityPopupAnimator.ts -assets/Script/ActivityPopupAnimator.ts.meta -assets/Scene/HomeScene.fire -assets/Script/GameManager.ts -assets/Script/JiaZai.ts -assets/Script/Reward.ts -assets/Script/module/Pay/Utils.ts -docs/seven-day-gift-maintenance.md -``` - -项目配置文件和 `build-templates` 不属于当前七日活动相对 `main` 的有效内容差异,除非负责人明确要求更新,否则不要顺手提交。 - -## 12. 已知边界与维护原则 - -- 活动创建、触发等级、自然日、可领取状态和过期判断的最终权威是后端。 -- 上线分支没有内置测试面板,活动状态测试依赖后端测试账号和微信开发者工具 Network 面板。 -- 自动弹出记录是设备本地状态,清缓存和换设备后可能再次弹出;但后端 `canClaim` 仍决定是否有奖励可领。 -- 客户端 `claimId` 防重不能代替服务端幂等。 -- 正式版不打印七日 API 的详细前端日志,因此正式环境需要后端监控。 -- 体验版走测试服,无法仅靠体验版证明正式服务器配置正确;正式发布前必须单独验证正式接口部署和配置。 -- 场景和 Prefab 的 UUID 依赖 `.meta`,资源提交必须完整。 -- 修改主项目公共奖励窗口或网络基类时,要回归其他活动,避免只验证七日活动。 -- Bundle 卸载只能保证七日活动自身持有的资源引用被释放;若其他主包节点重新持有 Bundle 内 SpriteFrame、Prefab 或脚本对象,资源仍可能无法及时回收。 diff --git a/docs/testSeven-local-preview.md b/docs/testSeven-local-preview.md deleted file mode 100644 index 573d85d9..00000000 --- a/docs/testSeven-local-preview.md +++ /dev/null @@ -1,39 +0,0 @@ -# 七日活动本地预览 - -使用 Cocos Creator 2.4.15 打开 `assets/testSeven/TestSeven.fire`,选择「预览当前场景」。无需登录或测试 UID。 - -顶部提供「预览弹出上浮(不领取)」可反复播放当前天数的图标和数量,不改变领取状态。底部可选择第 1~7 天、今日已领、全部完成、已过期、重置、重新打开和下次失败。 - -建议逐项检查: - -- 没有关闭按钮;点击弹窗背景、标题、卡片等有颜色的 UI 不算点击外部;贴图透明空白算外部,但若下方仍有可见 UI 则由下方 UI 处理。 -- 打开后不自动领取。点击当前奖励卡片或外部,一次只领取当前奖励,成功后保留活动弹窗;之后再次点击外部才关闭并交还后续弹窗判定。 -- 本地领取立即响应,没有模拟请求延迟;播放效果期间连点卡片、实际遮罩都不能重复领取或预约关闭。 -- 「下次失败」后领取失败,保持弹窗且不播放效果,可重试。 -- 上浮:道具位置显示图标和数量,缓慢上移少许后淡出。 -- 第 3 天双奖励、第 6 天锤子+冻结双奖励、第 5 天无限体力秒数(1800 秒)、第 7 天猫皮肤;可重复预览上浮效果。 -- 已领取、完成、过期状态不会再发奖;关闭后重新打开保留内存状态。 - -七日活动使用独立 `assets/reward_claim_effect/RewardClaimEffect.ts`,不再使用旧 RewardWindow 或数字图集。正式领取只使用弹出上浮:在道具中心上方一个道具高度处生成(跟随图标缩放),从小弹到 1.25 倍并快速回正,再缩至 0.9 倍、弹到 1.25 倍并快速回正;停留 0.25 秒后,用 0.6 秒上移 150px 并同时淡出。测试仅修改内存,不连接正式 Runtime、不增加资产。主页触发、服务端状态和真实到账仍需测试服验证。 - -## 接口测试面板 - -预览 `TestSeven.fire` 后,点击顶部「打开接口测试面板」。输入测试服账号 UID 和登录 token,或点击「读取当前登录」填入当前运行环境里的账号。独立场景没有登录流程,取不到 token 时需要手动填入;token 只保存在输入框内存中。 - -「发送查询」向 `Utils.testHttpip` 的 `signInActivityInfo` 发起 POST,并显示 HTTP 状态、耗时、活动字段和可滚动的完整 JSON;控制台可搜索 `[testSeven][signInActivityInfo]`。查询可能修改后端签到记录。浏览器预览需要测试服允许跨域,网络失败时会提示。 - -「预览返回数据」用真实七日 Prefab 展示响应状态,可在该响应的内存副本上模拟点击领取、奖励动画、点击外部只领取、再次点击才关闭和失败重试,不增加资产,也不提交领取状态。「清除该账号弹窗记录」只清除最近一次成功查询的 UID + activityId 对应的本地自动弹窗记录,不清除奖励防重记录或后端状态。此操作仅影响当前预览环境的存储,不能清除微信开发者工具或真机中的记录。 - -## 打包排除 - -`testSeven` 是独立测试 Bundle,主场景没有引用它,但这不意味着构建器会自动排除它。打包前把 `assets/testSeven/` 和 `assets/testSeven.meta` 一起移到项目 `assets` 外的本地备份目录,等待 Creator 刷新后构建;测试结束再移回原位并保留 UUID。不要将 TestSeven 选作发布启动场景。脚本额外使用 `CC_PREVIEW` 限制执行,但该限制不能代替构建排除。 - -确认本地效果后,再使用原有正式场景构建测试服版本。 - -## 透明区域点击回归 - -选择「今日已领」,点击背景和标题的透明边角应关闭;点击有颜色的区域应保持打开。选择第 1 天后点透明处应只领取,效果结束后再次点透明处才关闭。也要检查弹出缩放、卡片呼吸缩放时的边缘判定。 - -命中数据按原图 Alpha ≥ 16/255 生成,忽略几乎透明的柔边。修改七日活动贴图后运行 `python tools/generate-seven-hit-masks.py`(需要 Pillow),再让 Creator 导入更新。当前 16 张图片使用约 44 KB 数据,运行时不读取纹理像素;文字仍使用文本节点范围判定。 - -多奖励新效果排成同一水平行,以原道具区域居中,按左到右每隔 0.145 秒生成(第一次放大并回正的时长)。所有道具弹出完成后停留 0.25 秒,再从左到右每隔 0.145 秒开始上移渐隐。可用第 3 天双奖励、第 6 天锤子+冻结双奖励、第 7 天不同高度图标检查排列和时序。 diff --git a/settings/project.json b/settings/project.json index cf0610ac..3c518e75 100644 --- a/settings/project.json +++ b/settings/project.json @@ -1,5 +1,5 @@ { - "last-module-event-record-time": 1789474233869, + "last-module-event-record-time": 1789116749030, "group-list": [ "default", "Map" diff --git a/tools/test-first-game-entry.cjs b/tools/test-first-game-entry.cjs index 69636470..2cd8d692 100644 --- a/tools/test-first-game-entry.cjs +++ b/tools/test-first-game-entry.cjs @@ -202,6 +202,7 @@ function mapFixture() { const manager = Object.assign(new Manager(), { node: { getChildByName: () => ({}) }, isPopupRuntimeAlive: () => !state.destroyed, scheduleOnce: done => state.frames.push(done), + scheduleGameplayIntroPredownload: () => state.events.push('intro-idle'), loadDynamicPopup(name, bundle, prefab, parent, done, showLoading) { assert.equal(showLoading, false); state.popupCallbacks.push({ name, done }); }, @@ -299,7 +300,7 @@ test('memory downgrade before map readiness still reveals the map but skips Pref ready.wall(); assert.equal(state.events.includes('down'), false); ready.block(); state.frames.shift()(); assert.equal(Config.firstGameplayEntryComplete, true); - assert.equal(state.holds, 0); assert.equal(state.events.at(-1), 'down'); + assert.equal(state.holds, 0); assert.deepEqual(state.events.slice(-2), ['down', 'intro-idle']); assert.equal(state.popupCallbacks.length, 0); }); diff --git a/tools/test-gameplay-intro-loading.cjs b/tools/test-gameplay-intro-loading.cjs new file mode 100644 index 00000000..f4436f61 --- /dev/null +++ b/tools/test-gameplay-intro-loading.cjs @@ -0,0 +1,196 @@ +// Run: node --test tools/test-gameplay-intro-loading.cjs +const test = require('node:test'); +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const vm = require('node:vm'); +const ts = require('typescript'); + +function loadClass(file, names, globals) { + const source = ts.createSourceFile(file, fs.readFileSync(file, 'utf8'), ts.ScriptTarget.Latest, true); + const declaration = source.statements.find(ts.isClassDeclaration); + const members = names.map(name => declaration.members.find(m => m.name && m.name.getText(source) === name).getText(source)); + return vm.runInNewContext(ts.transpileModule(`class ${declaration.name.text} { ${members.join('\n')} }\n${declaration.name.text}`, { + compilerOptions: { target: ts.ScriptTarget.ES2017 }, + }).outputText, globals); +} +const flush = async () => { for (let i = 0; i < 5; i++) await Promise.resolve(); }; + +function fixture() { + const state = { blocksBusy: false, entryBusy: false, destroyed: false, requests: [], schedules: [], timers: [], bundles: new Map(), released: [] }; + const pipeline = () => ({ pipes: [], insert(fn, index) { this.pipes.splice(index, 0, fn); } }); + const cc = { + sys: { platform: 'wechat', WECHAT_GAME: 'wechat' }, fx: {}, warn() {}, + Node: { EventType: { TOUCH_END: 'touchend' } }, + isValid: node => !!node && !node.destroyed, + assetManager: { + pipeline: pipeline(), fetchPipeline: pipeline(), + getBundle: name => state.bundles.get(name), + removeBundle: bundle => state.bundles.delete(bundle.name), + loadBundle: () => assert.fail('background predownload must not load a Bundle'), + }, + }; + const wx = { preDownloadSubpackage: options => state.requests.push(options) }; + const BlockAssetManager = { instance: { hasPendingLoads: () => state.blocksBusy } }; + const mod = { exports: {} }; + vm.runInNewContext(ts.transpileModule(fs.readFileSync('assets/Script/module/Tool/GameTool.ts', 'utf8'), { + compilerOptions: { target: ts.ScriptTarget.ES2017, module: ts.ModuleKind.CommonJS }, + }).outputText, { + module: mod, exports: mod.exports, cc, wx, console: { log() {} }, + require: name => name.endsWith('/BlockAssetManager') ? { default: BlockAssetManager } : { default: {}, MiniGameSdk: {} }, + }); + const tool = cc.fx.GameTool = mod.exports.GameTool; + tool.trackResourceLoads(); + cc.fx.GameConfig = { isGameplayEntryPreparing: () => state.entryBusy }; + const Manager = loadClass('assets/Script/SceneManager.ts', [ + 'activeInstance', 'scheduleGameplayIntroPredownload', 'warmupGameplayPopupBundles', + 'releaseDynamicPopup', 'releaseDynamicPopupBundle', 'releaseDynamicPopupBundleIfUnused', + 'releaseOrphanedPopupBundle', 'onDestroy', + ], { cc, wx, console: { log() {} }, setTimeout: fn => state.timers.push(fn) }); + const manager = Object.assign(new Manager(), { + node: { getChildByName: () => null, off() {} }, + dynamicPopupStates: {}, dynamicPopupLoads: {}, + isPopupRuntimeAlive: () => !state.destroyed, + scheduleOnce: (fn, delay) => state.schedules.push({ fn, delay }), + finishDynamicPopupLoad() {}, unbindLosePanel() {}, unbindPropWindowPanel() {}, + clearDynamicPopupRetry() {}, clearFlyCoins() {}, disposeJungleTreasure() {}, + }); + tool.shouldRetainGameplayPopupBundlesForGameSceneReload = () => true; + Manager.activeInstance = manager; + const tick = () => { assert.ok(state.schedules.length); state.schedules.shift().fn(); }; + const bundle = name => { + const result = { name, releaseAll: () => state.released.push(name) }; + state.bundles.set(name, result); return result; + }; + return { state, cc, wx, tool, manager, Manager, tick, bundle }; +} + +test('resource tracking preserves pipeline input/results and drains success and failure exactly once', () => { + const { cc, tool } = fixture(); + tool.trackResourceLoads(); + for (const pipeline of [cc.assetManager.pipeline, cc.assetManager.fetchPipeline]) { + assert.equal(pipeline.pipes.length, 1, 'tracking is installed once'); + let callbackArgs; + const task = { input: ['asset'], onComplete(...args) { callbackArgs = args; } }; + pipeline.pipes[0](task, () => assert.equal(task.output, task.input)); + assert.equal(tool.hasPendingGameplayResourceLoads(), true); + const error = new Error('download failed'); + task.onComplete(error, 'result'); + assert.deepEqual(callbackArgs, [error, 'result']); + assert.equal(tool.hasPendingGameplayResourceLoads(), false); + } +}); + +test('Block idle check includes queued, in-flight, decoding and whole background batches', () => { + const Block = loadClass('assets/Script/module/Tool/BlockAssetManager.ts', ['hasPendingLoads'], {}); + const block = Object.assign(new Block(), { + foregroundLoads: 0, entryDownloadHolds: 0, backgroundRunning: false, + loading: new Map(), fileDownloads: new Map(), downloadQueue: [], + }); + assert.equal(block.hasPendingLoads(), false); + for (const key of ['foregroundLoads', 'entryDownloadHolds']) { + block[key] = 1; assert.equal(block.hasPendingLoads(), true); block[key] = 0; + } + for (const key of ['loading', 'fileDownloads']) { + block[key].set('pending', {}); assert.equal(block.hasPendingLoads(), true); block[key].clear(); + } + block.backgroundRunning = true; assert.equal(block.hasPendingLoads(), true); block.backgroundRunning = false; + block.downloadQueue.push({}); assert.equal(block.hasPendingLoads(), true); +}); + +test('intro waits for block queue, engine loading, popup downloads, user popup and stable idle', async () => { + const { state, cc, tool, manager, tick } = fixture(); + manager.scheduleGameplayIntroPredownload(); + manager.scheduleGameplayIntroPredownload(); + assert.equal(state.schedules.length, 1); + state.blocksBusy = true; tick(); tick(); + state.blocksBusy = false; + const task = { input: 'queued asset' }; + cc.assetManager.pipeline.pipes[0](task, () => {}); tick(); + task.onComplete(null, {}); + tool._gameplayPopupSubpackagePreloadPromise = {}; tick(); + tool._gameplayPopupSubpackagePreloadPromise = null; + tool._gameplayPopupMemoryWarmupPromise = {}; tick(); + tool._gameplayPopupMemoryWarmupPromise = null; + manager.dynamicPopupLoads.pause = true; tick(); + delete manager.dynamicPopupLoads.pause; + state.entryBusy = true; tick(); state.entryBusy = false; + tick(); assert.equal(state.requests.length, 0); + tick(); assert.equal(state.requests.length, 1); + assert.equal(state.requests[0].name, 'gameplay_intro'); + state.requests[0].success(); await flush(); + assert.equal(tool.isGameplayIntroDownloaded(), true); + assert.equal(state.bundles.size, 0, 'disk caching does not register a Bundle'); + await tool.predownloadGameplayIntro(); + assert.equal(state.requests.length, 1, 'successful session cache avoids duplicate download checks'); +}); + +test('failure retries only after a delay and another idle check; leaving scene cancels pending work', async () => { + const { state, manager, tick } = fixture(); + manager.scheduleGameplayIntroPredownload(); tick(); tick(); + state.requests[0].fail(new Error('offline')); await flush(); + assert.equal(state.schedules[0].delay, 10); + state.blocksBusy = true; tick(); tick(); + assert.equal(state.requests.length, 1); + state.blocksBusy = false; tick(); tick(); + assert.equal(state.requests.length, 2); + state.destroyed = true; state.requests[1].fail(new Error('offline')); await flush(); + assert.equal(state.schedules.length, 0); +}); + +test('departing before idle never starts a download; old SDK does not execute a subpackage', () => { + const f = fixture(); f.manager.scheduleGameplayIntroPredownload(); + f.state.destroyed = true; f.tick(); assert.equal(f.state.requests.length, 0); + const old = fixture(); delete old.wx.preDownloadSubpackage; + old.wx.loadSubpackage = () => assert.fail('must not execute scripts as background predownload'); + old.manager.scheduleGameplayIntroPredownload(); assert.equal(old.state.schedules.length, 0); +}); + +test('concurrent callers share one download, and cached Bundle needs no predownload', async () => { + const { tool, state, bundle } = fixture(); + const first = tool.predownloadGameplayIntro(); + assert.equal(tool.predownloadGameplayIntro(), first); + state.requests[0].success(); assert.equal(await first, true); + const second = fixture(); second.bundle('gameplay_intro'); + assert.equal(await second.tool.predownloadGameplayIntro(), true); + assert.equal(second.state.requests.length, 0); +}); + +test('scene reload releases intro resources while retaining ordinary popup bundles', () => { + const { state, manager, bundle } = fixture(); + for (const [name, bundleName] of [['gameplayIntro', 'gameplay_intro'], ['pause', 'pause']]) { + const root = { active: true, removeFromParent() {}, destroy() { this.destroyed = true; } }; + manager.dynamicPopupStates[name] = { bundleName, bundle: bundle(bundleName), root, callbacks: [], requestId: 1 }; + } + manager.onDestroy(); + assert.deepEqual(state.released, ['gameplay_intro']); + assert.equal(state.bundles.has('pause'), true); + assert.equal(state.bundles.has('gameplay_intro'), false); +}); + +test('unowned intro bundle is cleaned even with retention enabled and no popup state', () => { + const { state, manager, bundle } = fixture(); bundle('gameplay_intro'); manager.onDestroy(); + assert.deepEqual(state.released, ['gameplay_intro']); +}); + +for (const owned of [false, true]) { + test(`late old-scene intro callback respects actual new-scene ownership: ${owned}`, () => { + const { state, manager, Manager, bundle } = fixture(); const intro = bundle('gameplay_intro'); + if (owned) manager.dynamicPopupStates.gameplayIntro = { bundleName: 'gameplay_intro', loading: true }; + Manager.releaseOrphanedPopupBundle('gameplay_intro', intro); state.timers.shift()(); + assert.equal(state.bundles.has('gameplay_intro'), owned); + }); +} + +for (const mode of ['skip', 'cached', 'load', 'failure']) { + test(`low-memory warmup signals completion so idle download can start: ${mode}`, () => { + const { cc, tool, manager, bundle } = fixture(); let calls = 0, done; + tool.isIOSDevice = () => mode !== 'skip'; + if (mode === 'cached') bundle('pause'); + cc.assetManager.loadBundle = (name, callback) => { assert.equal(name, 'pause'); done = callback; }; + manager.warmupGameplayPopupBundles(false, null, error => { + assert.equal(!!error, mode === 'failure'); calls++; + }); + if (done) { assert.equal(calls, 0); done(mode === 'failure' ? new Error('offline') : null, {}); } + assert.equal(calls, 1); + }); +} diff --git a/tools/test-prop-guide.cjs b/tools/test-prop-guide.cjs index a45ce18e..d6d3e3fa 100644 --- a/tools/test-prop-guide.cjs +++ b/tools/test-prop-guide.cjs @@ -176,7 +176,7 @@ test('guide hammer cannot be cancelled after GuideMask is destroyed; striking cl assert.equal(map.ishammer, true); assert.equal(map.hammerMask.active, true); assert.equal(gameNode.getChildByName('Mask').active, true); - assert.equal(map.pause, true); + assert.equal(map.pause, false); assert.equal(info.hammerAmount, 3); map.costHammer(); // The valid block hit calls this existing consumption entry point. diff --git a/tools/test-seven-day-debug.cjs b/tools/test-seven-day-debug.cjs new file mode 100644 index 00000000..7ede5645 --- /dev/null +++ b/tools/test-seven-day-debug.cjs @@ -0,0 +1,107 @@ +const test = require('node:test'); +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const vm = require('node:vm'); +const ts = require('typescript'); +function load(path, cc, dependencies) { + const context = { cc, exports: {}, require: id => dependencies(id), setTimeout, clearTimeout }; + vm.runInNewContext(ts.transpileModule(fs.readFileSync(path, 'utf8'), { compilerOptions: { + experimentalDecorators: true, module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2017, + } }).outputText, context); + return context.exports.default; +} +test('test entry requires develop/trial and a distinct configured test origin', () => { + let version = '开发版'; + const utils = { httpip: 'https://production.example/', testHttpip: 'https://test.example/' }; + const cc = { fx: { GameTool: { getWechatGameVersion: () => version } } }; + const api = load('assets/Script/seven_day_gift/SevenDayGiftBootstrapApi.ts', cc, () => ({ default: utils })); + for (const v of ['正式版', '未知版本', '网页版']) { version = v; assert.equal(api.getTestEnvironment().allowed, false); } + for (const v of ['开发版', '体验版']) { version = v; assert.equal(api.getTestEnvironment().allowed, true); } + utils.testHttpip = 'https://PRODUCTION.example/test/'; + assert.equal(api.getTestEnvironment().allowed, false); + utils.testHttpip = ''; + assert.equal(api.getTestEnvironment().allowed, false); +}); +test('cache clearing preserves other users, activities and rounds and blocks stale snapshots', () => { + const store = new Map(); + let uid = 'user1', url = 'https://test.example/'; + const api = { getUid: () => uid, getTestEnvironment: () => ({ allowed: true, baseUrl: url }) }; + const cc = { Component: class {}, _decorator: { ccclass: x => x }, fx: { StorageMessage: { + getStorage: key => store.get(key), setStorage: (key, value) => store.set(key, value), removeStorage: key => store.delete(key), + } } }; + const Panel = load('assets/seven_day_gift/test/SevenDayTest.ts', cc, () => ({ default: api })); + const p = new Panel(); p.render = () => {}; + p.snapshot = { activityId: 'activity1', startAt: 123 }; + p.snapshotUid = uid; p.snapshotUrl = url; + const key = (user, activity, start, day) => user + ':' + JSON.stringify([activity, start, day]); + const own = key(uid, 'activity1', 123, 1), own2 = key(uid, 'activity1', 123, 2); + const other = [key('user2', 'activity1', 123, 1), key(uid, 'activity2', 123, 1), key(uid, 'activity1', 456, 1)]; + const records = Object.fromEntries([own, own2, ...other].map(k => [k, true])); + store.set('seven_day_gift_processed_claims_v1', records); + p.isActivityOpen = () => true; p.clearCache(true); assert.equal(records[own], true); + p.isActivityOpen = () => false; uid = 'user2'; p.clearCache(true); assert.equal(records[own], true); + uid = 'user1'; url = 'https://changed.example/'; p.clearCache(true); assert.equal(records[own], true); + url = p.snapshotUrl; p.clearCache(true); + assert.equal(records[own], undefined); assert.equal(records[own2], undefined); + other.forEach(k => assert.equal(records[k], true)); + const auto = 'seven_day_gift_auto_open_v1:user1:activity1'; + store.set(auto, '123'); store.set('seven_day_gift_auto_open_v1:user2:activity1', '123'); + p.clearCache(false); assert.equal(store.has(auto), false); + assert.equal(store.get('seven_day_gift_auto_open_v1:user2:activity1'), '123'); +}); +test('debug prefab references and required controls exist', () => { + const a = JSON.parse(fs.readFileSync('assets/seven_day_gift/test/SevenDayTest.prefab')); + function walk(x) { if (!x || typeof x !== 'object') return; if ('__id__' in x) assert.ok(a[x.__id__]); Object.values(x).forEach(walk); } + a.forEach(walk); + for (const name of ['entry', 'panel', 'close', 'query', 'clearClaim', 'clearAuto', 'recheck', 'viewport', 'content']) + assert.equal(a.filter(n => n.__type__ === 'cc.Node' && n._name === name).length, 1); + assert.equal(a.find(n => n._name === 'panel')._active, false); + for (const node of a.filter(n => n.__type__ === 'cc.Node')) { + for (const ref of node._components) { + assert.ok(ref && a[ref.__id__], 'no null component slots'); + assert.ok(a[ref.__id__].__type__.startsWith('cc.'), 'UI prefab must not serialize custom script references'); + } + } +}); + +test('test entry attaches the registered constructor without calling getComponent on the prefab', () => { + let added = 0, initialized = false, mounted = false; + class TestPanel {} + const panel = { initialize() { assert.equal(node.active, false); initialized = true; } }; + const node = { active: true, getComponent: () => { throw new TypeError("Cannot read property 'constructor' of null"); }, + addComponent(type) { assert.equal(type, TestPanel); added++; return panel; }, destroy() { assert.fail('unexpected destruction'); } }; + const bundle = { load(path, type, done) { assert.equal(path, 'test/SevenDayTest'); done(null, {}); } }; + const canvas = { getComponent: () => ({ loadHomeBundleWithDependencies(name, priority, done) { done(null, bundle); } }), + addChild(child) { assert.equal(child, node); assert.equal(initialized, true); mounted = true; } }; + const api = { getTestEnvironment: () => ({ allowed: true }) }; + const cc = { Component: class {}, Prefab: class {}, _decorator: { ccclass: x => x }, + js: { getClassByName: name => { assert.equal(name, 'SevenDayTest'); return TestPanel; } }, + find: () => canvas, isValid: () => true, instantiate: () => node }; + const Host = load('assets/Script/seven_day_gift/SevenDayGiftHost.ts', cc, () => ({ default: api })); + const host = new Host(); host.node = {}; + host.loadTestEntry(); + assert.equal(added, 1); + assert.equal(mounted, true); + assert.equal(node.active, true); +}); + +test('entry touch opens panel and close touch hides it', () => { + const api = { getTestEnvironment: () => ({ allowed: true }) }; + const controls = new Map(); + function control(name) { + if (!controls.has(name)) controls.set(name, { active: false, handlers: {}, + on(event, action) { this.handlers[event] = action; }, getChildByName: control, + getComponent: () => ({}), addComponent: () => ({ roundRect() {}, fill() {} }), + }); + return controls.get(name); + } + const cc = { Component: class {}, Graphics: class {}, Label: class {}, color: () => ({}), + Node: { EventType: { TOUCH_END: 'touchend' } }, _decorator: { ccclass: x => x } }; + const Panel = load('assets/seven_day_gift/test/SevenDayTest.ts', cc, () => ({ default: api })); + const p = new Panel(); p.node = control('root'); p.render = () => {}; + p.onLoad(); + control('entry').handlers.touchend({ stopPropagation() {} }); + assert.equal(control('panel').active, true); + control('close').handlers.touchend({ stopPropagation() {} }); + assert.equal(control('panel').active, false); +}); diff --git a/tools/test-seven-day-prefab.cjs b/tools/test-seven-day-prefab.cjs new file mode 100644 index 00000000..ca3ee36a --- /dev/null +++ b/tools/test-seven-day-prefab.cjs @@ -0,0 +1,156 @@ +const test = require('node:test'); +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const vm = require('node:vm'); +const ts = require('typescript'); + +const prefab = JSON.parse(fs.readFileSync('assets/seven_day_gift/prefab/sevenDayGift.prefab')); +const source = fs.readFileSync('assets/seven_day_gift/SevenDayGift.ts', 'utf8'); +const frameData = new Map(); +function scan(dir) { + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + const path = dir + '/' + entry.name; + if (entry.isDirectory()) scan(path); + else if (path.endsWith('.png.meta')) { + const meta = JSON.parse(fs.readFileSync(path)); + for (const frame of Object.values(meta.subMetas || {})) frameData.set(frame.uuid, frame); + } + } +} +scan('assets/seven_day_gift/texture'); +const frame = uuid => ({ uuid, getRect() { return { height: frameData.get(uuid).height }; }, getOriginalSize() { + const data = frameData.get(uuid); + assert.ok(data, 'SpriteFrame resolves: ' + uuid); + return { width: data.rawWidth, height: data.rawHeight }; +} }); +const rewards = [ + [{ type: 'infinite_health', count: 900 }], [{ type: 'hammer', count: 1 }], + [{ type: 'infinite_health', count: 1800 }], [{ type: 'freeze', count: 1 }, { type: 'magic_wand', count: 1 }], + [{ type: 'coin', count: 600 }], [{ type: 'hammer', count: 1 }, { type: 'freeze', count: 1 }], + [{ type: 'infinite_health', count: 3600 }, { type: 'cat_skin', count: 1 }], +]; +function fixture() { + const cc = { Component: class {}, Animation: 'cc.Animation', Sprite: 'cc.Sprite', Label: 'cc.Label', LabelOutline: 'cc.LabelOutline', + SpriteFrame: class {}, Enum: x => x, Color: { WHITE: {} }, color: (...x) => x, + _decorator: { ccclass: x => x, property: () => () => {} }, + Node: class { constructor() { throw Error('Runtime node creation is forbidden'); } }, + warn() {}, tween() { return { to() { return this; }, repeatForever() { return this; }, start() {} }; }, + }; + const context = { cc, exports: {}, require: () => ({ default: class {}, ActivityPopupAnimationType: { 'Q弹弹出': 1 } }) }; + vm.runInNewContext(ts.transpileModule(source, { compilerOptions: { + experimentalDecorators: true, target: ts.ScriptTarget.ES2017, module: ts.ModuleKind.CommonJS, + } }).outputText, context); + const nodes = new Map(); + prefab.forEach((data, id) => { + if (data.__type__ !== 'cc.Node') return; + const node = { name: data._name, active: data._active, x: data._trs.array[0], y: data._trs.array[1], + width: data._contentSize.width, height: data._contentSize.height, children: [], components: {}, + get childrenCount() { return this.children.length; }, + getChildByName(name) { return this.children.find(child => child.name === name); }, + getComponent(type) { return this.components[type]; }, + setContentSize(w, h) { this.width = w; this.height = h; }, + setPosition(x, y) { this.x = x; this.y = y; }, stopAllActions() {}, + }; + for (const ref of data._components) { + const c = prefab[ref.__id__]; + node.components[c.__type__] = { node, string: c._string, fontSize: c._fontSize, + spriteFrame: c._spriteFrame && frame(c._spriteFrame.__uuid__) }; + if (c.__type__ === 'cc.Animation') { + const state = { isPlaying: false }; + node.components[c.__type__] = { state, starts: 0, getAnimationState: () => state, + play() { this.starts++; state.isPlaying = true; }, stop() { state.isPlaying = false; } }; + } + } + nodes.set(id, node); + }); + for (const [id, node] of nodes) node.children = prefab[id]._children.map(ref => nodes.get(ref.__id__)); + const view = new context.exports.default(); + const serialized = prefab.find(x => x.rewardNumberFrames); + for (const [key, value] of Object.entries(serialized)) { + if (value && value.__uuid__) view[key] = frame(value.__uuid__); + } + view.rewardNumberFrames = serialized.rewardNumberFrames.map(value => frame(value.__uuid__)); + view.node = nodes.get(1); + assert.equal(view.cacheView(), true); + const info = { canClaim: true, nextRewardDay: 1, rewards: rewards.map((items, i) => ({ day: i + 1, items, claimed: false })) }; + return { view, info, nodes }; +} + +test('prefab retains only fixed reward slots and required claim-state nodes', () => { + function visit(value) { + if (!value || typeof value !== 'object') return; + if ('__id__' in value) assert.ok(prefab[value.__id__], 'reference ' + value.__id__); + Object.values(value).forEach(visit); + } + prefab.forEach(visit); + const { view } = fixture(); + for (const [day, card] of view.cards.entries()) { + assert.ok(card.getChildByName('claimedOverlay')); + assert.ok(card.getChildByName('claimedBadge')); + const container = card.getChildByName('rewardItems'); + assert.equal(container.children.length, rewards[day].length); + for (const icon of container.children) assert.ok(icon.getChildByName('amount').children.every(n => n.active && /^digit\d+$/.test(n.name))); + } + assert.ok(prefab.filter(n => n.__type__ === 'cc.Node' && !n._active).every(n => ['claimedOverlay', 'claimedBadge'].includes(n._name))); + assert.ok(!prefab.some(n => n.__type__ === 'cc.Node' && /^(layout\d+|amountLabel|close|message|title|subtitle)$/.test(n._name))); + const glow = view.cards[6].getChildByName('catGlow'); + assert.ok(glow && glow.active); + assert.equal(glow.width, 480); + const clip = JSON.parse(fs.readFileSync('assets/seven_day_gift/CatRewardGlow.anim')); + assert.equal(clip.wrapMode, 2); + assert.equal(clip._duration, 6); + assert.equal(clip.curveData.props.angle[1].value, 360); + assert.deepEqual(fs.readFileSync('assets/seven_day_gift/texture/catAnimation3.png'), fs.readFileSync('assets/gacha_bundle/img/catAnimation3.png')); +}); + +test('default data matches baked icon and amount geometry without creating nodes', () => { + const { view, info, nodes } = fixture(); + const before = [...nodes.values()].map(n => [n.x, n.y, n.width, n.height, n.active]); + view.setData(info, () => {}); + const after = [...nodes.values()].map(n => [n.x, n.y, n.width, n.height, n.active]); + assert.deepEqual(after, before); +}); + +test('cat glow starts explicitly, survives refresh and stops after claiming', () => { + const { view, info } = fixture(); + const glow = view.cards[6].getChildByName('catGlow'); + const animation = glow.getComponent('cc.Animation'); + view.setData(info, () => {}); + assert.equal(animation.state.isPlaying, true); + view.setData(info, () => {}); + assert.equal(animation.starts, 1, 'refresh must not restart the rotation'); + info.rewards[6].claimed = true; + view.setData(info, () => {}); + assert.equal(glow.active, false); + assert.equal(animation.state.isPlaying, false); + info.rewards[6].claimed = false; + view.setData(info, () => {}); + assert.equal(animation.state.isPlaying, true); +}); + +test('claim states and quantity updates use existing nodes without text fallback', () => { + const { view, info } = fixture(); + for (let day = 1; day <= 7; day++) { + info.nextRewardDay = day; + info.rewards.forEach(reward => reward.claimed = reward.day < day); + view.setData(info, () => {}); + view.cards.forEach((card, i) => assert.equal(card.getChildByName('claimedBadge').active, i + 1 < day)); + } + const container = view.cards[0].getChildByName('rewardItems'); + const amount = container.children[0].getChildByName('amount'); + for (const value of [1.5, 123456789]) { + info.rewards[0].items = [{ type: 'coin', amount: value }]; + view.setData(info, () => {}); + assert.ok(amount.children.every(n => !n.active), 'unsupported quantities do not display a truncated number'); + } + info.rewards[0].items = [{ type: 'infinite_health', count: 600 }]; + view.setData(info, () => {}); + assert.ok(amount.children.every(n => n.active), 'existing image digits are restored after invalid data'); + info.rewards[0].items = []; + view.setData(info, () => {}); + assert.equal(view.cards[0].getChildByName('rewardItems').children.some(x => x.active), false); + info.rewards[6].claimed = true; + view.setData(info, () => {}); + assert.equal(view.cards[6].getChildByName('catGlow').active, false); + assert.doesNotMatch(source, /new cc\.Node|addComponent\(|createAmount\(/); +}); diff --git a/tools/test-starter-pack.cjs b/tools/test-starter-pack.cjs index 59d9c3ac..9672e19e 100644 --- a/tools/test-starter-pack.cjs +++ b/tools/test-starter-pack.cjs @@ -114,12 +114,15 @@ test('server clock correction and confirmed purchase win over stale local status }); function homeFixture() { const f = fixture(); + f.globals.MiniProgramBenefitsBridge = { instance: { refreshEntry() {} } }; + f.globals.HomePopupQueue = { get: () => ({ enqueue: (_key, _priority, run) => run(() => {}) }) }; const Home = methods(homePath, ['checkStarter_pack', 'openStarter_pack', 'startStarter_pack', 'stopStarter_pack'], f.globals); const h = new Home(); h.node = { addChild() {} }; h.newbieGift = false; h.isHomeRuntimeAlive = () => true; h.deferHomePopupWhileTransfer = () => false; h.vibrateButtonClick = () => {}; h.schedule = () => {}; h.unschedule = () => {}; const button = { getChildByName: () => ({ getComponent: () => ({}) }) }; h.getStarterPackHomeButton = () => button; + h.refreshHomeActivityEntryLayout = () => {}; h.setStarterPackHomeButtonVisible = v => { h.visible = v; }; let opens = 0; f.cc.instantiate = () => ({ active: false, getComponent: () => ({ init() { opens++; }, refreshCountdown() {} }) }); @@ -137,6 +140,23 @@ test('first activation counts today; same-day reentry does not popup; next day d assert.equal(f.h.visible, true); f.setNow(f.getNow() + 86400000); f.h.checkStarter_pack(); assert.equal(f.opens(), 2); }); +test('starter activation keeps its request guard until success or failure', () => { + for (const response of [{ code: 0 }, { code: 1, data: { starter_pack: 0, starter_packState: 1 } }]) { + const f = homeFixture(); + let read, activate; + f.api.getStarter_pack = done => { read = done; }; + f.api.setStarter_pack = done => { activate = done; }; + f.h.checkStarter_pack(); + assert.equal(f.h.starterPackChecking, true); + read({ code: 1, data: { starter_pack: 0, starter_packState: 0 } }); + assert.equal(f.h.starterPackChecking, true); + activate(response); + assert.equal(f.h.starterPackChecking, false); + } + const f = homeFixture(); f.info.level = 0; + f.h.checkStarter_pack(); + assert.ok(!f.h.starterPackChecking); +}); test('failed prefab load does not consume daily reminder; account keys differ', () => { const f = homeFixture(); f.Home.cachedActionPrefab = null; f.h.loadHomeBundleWithDependencies = (name, priority, done) => done(new Error('offline')); diff --git a/tools/tests/mini-program-benefits-client.test.cjs b/tools/tests/mini-program-benefits-client.test.cjs new file mode 100644 index 00000000..bbc58df7 --- /dev/null +++ b/tools/tests/mini-program-benefits-client.test.cjs @@ -0,0 +1,483 @@ +const test = require('node:test'); +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const path = require('node:path'); +const vm = require('node:vm'); +const ts = require(process.env.TYPESCRIPT_PATH || 'typescript'); +const root = path.resolve(__dirname, '../..'); +const bridgeFile = 'assets/Script/module/MiniProgramBenefitsBridge.ts'; +const panelFile = 'assets/mini_program_benefits/script/MiniProgramBenefitsPanel.ts'; +const tick = () => new Promise(resolve => setImmediate(resolve)); +function deferred() { let resolve, reject; const promise = new Promise((a,b) => { resolve=a; reject=b; }); return {promise,resolve,reject}; } + +function environment() { + const destroyed = [], afterDraw = [], assetLoads = [], bundleLoads = [], releases = []; + const classes = {}; + class Component { schedule() {} unscheduleAllCallbacks() {} } + class Color { fromHEX(value) { this.hex = value; return this; } } + Color.WHITE = new Color().fromHEX('#FFFFFF'); + class Graphics { roundRect() {} fill() {} circle() {} } + class Label { } + Label.HorizontalAlign = {CENTER:1}; Label.VerticalAlign = {CENTER:1}; Label.Overflow = {SHRINK:2}; + class Sprite { } + Sprite.SizeMode = {CUSTOM:0}; + class Node { + constructor(name) { this.name = name; this.children=[]; this.components=[]; this.events={}; this.active=true; this.valid=true; this.x=this.y=0; this.scale=1; this.width=720; this.height=1280; } + set parent(node) { this._parent=node; if(node) node.children.push(this); } + get parent() { return this._parent; } + setPosition(x,y) { this.x=x; this.y=y; } + setContentSize(w,h) { if(typeof w === 'object') {this.width=w.width;this.height=w.height;} else {this.width=w;this.height=h;} } + getContentSize() { return {width:this.width,height:this.height}; } + addComponent(type) { const C = typeof type === 'string' ? classes[type] : type; const c=new C(); c.node=this; this.components.push(c); return c; } + getComponent(type) { const C=typeof type==='string'?classes[type]:type;return C?this.components.find(c=>c instanceof C):null; } + getChildByName(name) { return this.children.find(node=>node.name===name && node.valid); } + on(name, callback) { this.events[name]=callback; } + off(name, callback) { if(this.events[name]===callback)delete this.events[name]; } + destroy() { if(this.pending) return; this.pending=true; destroyed.push(this); } + } + Node.EventType = {TOUCH_END:'touchend'}; + const bundle = { getInfoWithPath:()=>false, load(name,type,callback) { assetLoads.push({name,callback}); }, releaseAll() { releases.push('assets'); } }; + const info = {uid:'player',token:'token',level:1,freezeAmount:5,hammerAmount:6,magicAmount:7}; + const storage = {}; + const cc = {Node,Component,Color,Graphics,Label,Sprite,Prefab:class {},SpriteFrame:class {},BlockInputEvents:class {}, tween:target=>({to(){return this},delay(){return this},call(){return this},start(){return this}}),Tween:{stopAllByTarget(){}}, + _decorator:{property:()=>()=>{},ccclass:value=>{if(typeof value==="function"){classes[value.name]=value;return value;}return C=>{classes[value]=C;return C;};}}, + color:(r,g,b)=>({r,g,b}),sys:{platform:'wechat',WECHAT_GAME:'wechat',localStorage:{getItem:key=>storage[key]||null,setItem:(key,value)=>{storage[key]=value;}}}, + js:{getClassByName:name=>classes[name]}, + view:{getVisibleSize:()=>({width:720,height:1280})}, + find(route,node) { if(route==='Canvas') return null; return route.split('/').reduce((n,key)=>n&&n.getChildByName(key),node); }, + isValid:(node,strict)=>!!node && node.valid && (!strict || !node.pending), + Director:{EVENT_AFTER_DRAW:'draw'},director:{once(event,cb) {afterDraw.push(cb);}}, + assetManager:{getBundle:()=>null,loadBundle(name,cb) {bundleLoads.push(cb);},removeBundle() {releases.push('bundle');}}, + fx:{GameConfig:{GM_INFO:info},StorageMessage:{setStorage:(key,value)=>{storage[key]=value;}}}, + }; + const wx = {getSystemInfoSync:()=>({platform:'android',version:'test',SDKVersion:'test'}),showToast() {},getAccountInfoSync:()=>({miniProgram:{envVersion:'release'}})}; + const testEnvironment = {allowed:false,version:'体验版',baseUrl:'https://test.example'}; + function load(file) { + const output = ts.transpileModule(fs.readFileSync(path.join(root,file),'utf8'),{compilerOptions:{target:ts.ScriptTarget.ES2017,module:ts.ModuleKind.CommonJS,experimentalDecorators:true}}).outputText; + const module={exports:{}}; + vm.runInNewContext(output,{module,exports:module.exports,require:name=>{ + if(name==='../seven_day_gift/SevenDayGiftBootstrapApi')return {default:{getTestEnvironment:()=>testEnvironment}}; + if(name==='../LoadingCatAnimation')return {default:{play:node=>{node.active=true;return true},stop:node=>{node.active=false}}}; + if(name==='./MiniProgramBenefitsReward')return {default:class {request(){throw Error('Unexpected network adapter call in UI test');}}}; + if(name.endsWith('/MiniProgramBenefitsBridge'))return {default:Bridge}; + throw new Error('Unexpected dependency: '+name); + },cc,wx,window:{wx},console,setTimeout,clearTimeout,Promise,Set},{filename:file}); + return module.exports.default; + } + const Bridge=load(bridgeFile), bridge=Bridge.instance; + bridge.onLogin({_id:'player'}); + const Panel=load(panelFile); + function instantiatePrefab(name='BenefitsWindow') { + const a=JSON.parse(fs.readFileSync(path.join(root,'assets/mini_program_benefits/prefab',name+'.prefab'),'utf8')); + const nodes={};a.forEach((v,i)=>{if(v.__type__==='cc.Node'){const n=nodes[i]=new Node(v._name);n.setContentSize(v._contentSize);n.setPosition(v._trs.array[0],v._trs.array[1]);n.scale=v._trs.array[7];n.active=v._active;n.opacity=v._opacity;}}); + for(const [i,n] of Object.entries(nodes)){const v=a[i];if(v._parent)n.parent=nodes[v._parent.__id__];for(const r of v._components){const c=a[r.__id__];if(c.__type__==='cc.Label')n.addComponent(Label).string=c._string;}} + if(name==='BenefitsWindow'){const p=nodes[1].addComponent(Panel);p.mainPrefab={prefabName:'BenefitsMain'};p.favoritePrefab={prefabName:'BenefitsFavoriteGuide'};p.desktopPrefab={prefabName:'BenefitsDesktopGuide'};p.rewardPrefab={prefabName:'BenefitsReward'};} + return nodes[1]; + } + cc.instantiate=asset=>instantiatePrefab(asset&&asset.prefabName||'BenefitsWindow'); + function draw() { + while(destroyed.length) { + const node=destroyed.shift(); node.valid=false; + node.children.forEach(child=>child.destroy()); + node.components.forEach(c=>c.onDestroy&&c.onDestroy()); + if(node.parent) node.parent.children=node.parent.children.filter(child=>child!==node); + } + afterDraw.splice(0).forEach(callback=>callback()); + } + function attach() { + const home=new Node('Canvas'); const load=new Node('Load');load.parent=home; + const top=new Node('Top');top.parent=load; + const shop=new Node('shop');shop.parent=top;shop.setPosition(-280,250); + const entry=new Node('chengxu');entry.parent=top;entry.setPosition(-280,30);entry.setContentSize(178,165); + bridge.attach(home);return home; + } + return {bridge,Panel,Node,info,storage,wx,cc,attach,draw,bundle,bundleLoads,assetLoads,releases,classes,load}; +} +const frame = {getOriginalSize:()=>({width:100,height:100}),getRect:()=>({width:100,height:100})}; + +test('runtime test eligibility preserves server claims, receipts and other accounts',()=>{ + const e=environment(),b=e.bridge; + b.getTestEnvironment=()=>({allowed:true}); + b.onLogin({_id:'player',miniProgramWelfare:{favorite:true,desktop:false}}); + b.state.favorite_entry.receiptId='keep';b.state.favorite_entry.deliveryPending=true; + e.storage['mini_program_benefits_eligibility_v1:other']='untouched'; + b.setTestEligibility('desktop_entry');assert.ok(b.state.desktop_entry.eligibleAt); + assert.equal(b.state.favorite_entry.claimedAt,1); + b.setTestEligibility();assert.equal(b.state.desktop_entry.eligibleAt,0); + assert.equal(b.state.favorite_entry.receiptId,'keep');assert.equal(b.state.favorite_entry.deliveryPending,true); + assert.equal(e.info.miniProgramWelfare.favorite,true); + assert.equal(e.storage['mini_program_benefits_eligibility_v1:other'],'untouched'); +}); + +test('runtime test changes reject production, missing login, active sessions and failed saves',()=>{ + const e=environment(),b=e.bridge; + assert.throws(()=>b.setTestEligibility('desktop_entry'),/测试服/); + b.getTestEnvironment=()=>({allowed:true});b.uid='';assert.throws(()=>b.setTestEligibility(),/登录/); + b.uid='player';b.session={};assert.throws(()=>b.setTestEligibility(),/关闭/);b.session=null; + assert.throws(()=>b.setTestEligibility('invalid'),/未知/); + e.cc.sys.localStorage.setItem=()=>{throw Error('disk full');}; + assert.throws(()=>b.setTestEligibility('desktop_entry'),/disk full/); + assert.equal(b.state.desktop_entry.eligibleAt,0); +}); + +test('claim cache reset preserves balances, eligibility, server flags and other accounts',()=>{ + const e=environment(),b=e.bridge; + e.cc.fx.StorageMessage.getStorage=key=>e.storage[key]; + b.getTestEnvironment=()=>({allowed:true}); + b.onLogin({_id:'player',miniProgramWelfare:{favorite:true,desktop:false}}); + b.state.favorite_entry={eligibleAt:123,claimedAt:456,receiptId:'old',deliveryPending:true}; + e.storage.prop={freezeAmount:9,hammerAmount:8,magicAmount:7,timestamp:12,welfareCredits:{'welfare:player:favorite':true,'welfare:player:desktop':true,'welfare:other:favorite':true}}; + b.clearTestClaimCache(); + assert.equal(e.storage.prop.freezeAmount,9);assert.equal(e.storage.prop.timestamp,12); + assert.deepEqual(Object.keys(e.storage.prop.welfareCredits),['welfare:other:favorite']); + assert.equal(b.state.favorite_entry.eligibleAt,123);assert.equal(b.state.favorite_entry.claimedAt,1); + assert.equal(b.state.favorite_entry.receiptId,undefined);assert.equal(b.state.favorite_entry.deliveryPending,undefined); + assert.equal(e.info.miniProgramWelfare.favorite,true); +}); + +test('claim cache reset rejects production, missing login, sessions and outstanding requests',()=>{ + const e=environment(),b=e.bridge; + assert.throws(()=>b.clearTestClaimCache(),/测试服/); + b.getTestEnvironment=()=>({allowed:true});b.uid='';assert.throws(()=>b.clearTestClaimCache(),/登录/); + b.uid='player';b.session={};assert.throws(()=>b.clearTestClaimCache(),/关闭/);b.session=null; + b.rewardRequests=1;assert.throws(()=>b.clearTestClaimCache(),/请求完成/);b.rewardRequests=0; + e.cc.fx.StorageMessage.getStorage=()=>({welfareCredits:{'welfare:player:favorite':true}}); + e.cc.fx.StorageMessage.setStorage=()=>{throw Error('disk full')};b.state.favorite_entry.receiptId='keep'; + assert.throws(()=>b.clearTestClaimCache(),/disk full/);assert.equal(b.state.favorite_entry.receiptId,'keep'); +}); + +test('runtime test bundle mounts only on isolated test server and ignores detached load',()=>{ + const e=environment(),b=e.bridge;b.getTestEnvironment=()=>({allowed:true}); + const home=e.attach();assert.equal(e.bundleLoads.length,0);b.mountTestPanel(home);assert.equal(e.bundleLoads.length,1);b.detach(); + e.bundleLoads[0](null,e.bundle);assert.equal(e.assetLoads.length,0);assert.equal(b.testNode,null); +}); + +test('close animation waits before closing and repeated taps do not start another close',()=>{ + const e=environment(),panel=new e.Panel();panel.node=new e.Node('panel'); + panel.motion=new e.Node('motion');panel.mask=new e.Node('mask'); + let closed=0;const completions=[];panel.host={close:()=>closed++}; + e.cc.tween=()=>({to(){return this},call(cb){completions.push(cb);return this},start(){return this}}); + panel.closeWithAnimation();panel.closeWithAnimation(); + assert.equal(closed,0);assert.equal(completions.length,1);assert.equal(panel.closing,true); + completions[0]();assert.equal(closed,1); +}); + +test('entry loader appears immediately and disappears after successful loading without touching the shared template',async()=>{ + const e=environment(),home=e.attach();e.cc.macro={MAX_ZINDEX:32767}; + const template=new e.Node('Loading');template.parent=home;template.active=false; + const instantiate=e.cc.instantiate;e.cc.instantiate=asset=>asset===template?new e.Node('Loading'):instantiate(asset); + const pending=e.bridge.open();const loading=home.getChildByName('BenefitsLoading'); + assert.ok(loading&&loading.active);assert.equal(template.active,false); + e.bundleLoads[0](null,e.bundle);await tick();e.assetLoads.forEach(item=>item.callback(null,frame));await pending; + assert.equal(loading.active,false);assert.equal(template.active,false); +}); + +test('entry loader closes on cancellation or bundle failure',async()=>{ + for(const cancel of [true,false]){ + const e=environment(),home=e.attach();e.cc.macro={MAX_ZINDEX:32767}; + const template=new e.Node('Loading');template.parent=home;e.cc.instantiate=()=>new e.Node('Loading'); + const pending=e.bridge.open(),loading=home.getChildByName('BenefitsLoading'); + if(cancel){e.bridge.close();assert.equal(loading.active,false);e.bundleLoads[0](null,e.bundle)} + else e.bundleLoads[0](new Error('download failed')); + await pending;assert.equal(loading.active,false); + } +}); + +function receiptPanel(e) { + const panel=new e.Panel();panel.node=new e.Node('panel');panel.render=()=>{}; + const state={favorite_entry:{eligibleAt:1}};let shown=0,acks=0; + const host={getState:()=>state,refresh:async()=>{},claim:async task=>{state[task]={claimedAt:1,receiptId:task,acknowledged:false}}, + showReward:async count=>{shown+=count},acknowledge:async task=>{acks++;state[task].acknowledged=true}}; + panel.showRewardAnimation=count=>host.showReward(count);panel.host=host;return {panel,host,state,shown:()=>shown,acks:()=>acks}; +} + +test('claim plays the bundle reward animation and confirms after presentation',async()=>{ + const e=environment(),p=receiptPanel(e); + await p.panel.claim('favorite_entry'); + assert.equal(p.panel.page,'list');assert.equal(p.shown(),1);assert.equal(p.acks(),1); + assert.equal(p.state.favorite_entry.acknowledged,true);assert.equal(p.panel.renderReward,undefined); +}); + +test('animation load failure leaves the receipt pending; refresh retries without a second claim',async()=>{ + const e=environment(),p=receiptPanel(e);p.host.showReward=async()=>{throw Error('animation load failed')}; + await p.panel.claim('favorite_entry');assert.equal(p.acks(),0);assert.equal(p.panel.page,'list'); + assert.match(p.panel.message,/animation load failed/); + let shown=0;p.host.showReward=async()=>{shown++};await p.panel.refresh(); + assert.equal(shown,1);assert.equal(p.acks(),1); +}); + +test('ack retry does not replay an already shown animation in the same panel session',async()=>{ + const e=environment(),p=receiptPanel(e);const ack=p.host.acknowledge; + p.host.acknowledge=async()=>{throw Error('save failed')};await p.panel.claim('favorite_entry'); + assert.equal(p.shown(),1);p.host.acknowledge=ack;await p.panel.refresh(); + assert.equal(p.shown(),1);assert.equal(p.acks(),1); +}); + +test('multiple pending receipts are shown together rather than replacing one another',async()=>{ + const e=environment(),p=receiptPanel(e);p.state.favorite_entry={claimedAt:1,receiptId:'a'}; + p.state.desktop_entry={claimedAt:1,receiptId:'b'};const calls=[];p.host.showReward=async count=>calls.push(count); + await p.panel.refresh();assert.deepEqual(calls,[2]);assert.equal(p.acks(),2); +}); + + + + + + + +test('scene-owned chengxu keeps its sprite and position across detach and reattach',()=>{ + const e=environment(),home=e.attach(),entry=e.bridge.entryNode; + e.bridge.detach();e.draw();assert.equal(entry.valid,true);assert.equal(entry.active,false); + const sprite=entry.addComponent(e.cc.Sprite);sprite.spriteFrame=frame; + entry.setPosition(123,-456);e.cc.resources={load(){throw Error('Scene artwork must not reload')}}; + e.bridge.attach(home);e.bridge.attach(home); + assert.equal(e.bridge.entryNode,entry);assert.equal(entry.x,123);assert.equal(entry.y,-456); + assert.equal(entry.children.filter(n=>n.valid&&!n.pending&&n.name==='red').length,1); + let opens=0;e.bridge.open=()=>{opens++};entry.events.touchend();assert.equal(opens,1); + e.bridge.detach();e.draw();assert.equal(entry.valid,true);assert.equal(sprite.spriteFrame,frame); + assert.equal(entry.events.touchend,undefined); +}); + +test('entry artwork holds one reference and releases it after the entry is destroyed',()=>{ + const e=environment(),loads=[]; + e.cc.resources={load:(name,type,callback)=>loads.push({name,callback})}; + e.attach();assert.equal(e.bundleLoads.length,0); + assert.equal(loads[0].name,'texture/mini-program-benefits-entry'); + const art={refs:0,addRef(){this.refs++;return this},decRef(){this.refs--;return this}}; + loads[0].callback(null,art);assert.equal(art.refs,1); + assert.equal(e.bridge.entryVisual.getComponent(e.cc.Sprite).spriteFrame,art); + e.bridge.detach();assert.equal(art.refs,1);e.draw();assert.equal(art.refs,0); +}); + +test('late entry artwork after leaving HomeScene is released without mounting a sprite',()=>{ + const e=environment(),loads=[]; + e.cc.resources={load:(name,type,callback)=>loads.push(callback)}; + e.attach();e.bridge.detach();e.draw(); + const art={refs:0,addRef(){this.refs++;return this},decRef(){this.refs--;return this}}; + loads[0](null,art);assert.equal(art.refs,0);assert.equal(e.bridge.entryFrame,null); +}); + +test('never loads UI bundle at login/attach; first-level gate and red dot follow current state',()=>{ + const e=environment(); e.info.level=0;e.attach();assert.equal(e.bundleLoads.length,0);assert.equal(e.bridge.entryNode.active,false); + e.info.level=1;e.bridge.state={favorite_entry:{eligibleAt:10}};e.bridge.changed(); + assert.equal(e.bridge.entryNode.active,true);assert.equal(e.bridge.entryRed.active,true); + e.bridge.state={favorite_entry:{claimedAt:10,acknowledged:true},desktop_entry:{claimedAt:20,acknowledged:true}};e.bridge.changed(); + assert.equal(e.bridge.entryNode.active,false); +}); + +test('closing during bundle download releases the late bundle without starting texture loads',async()=>{ + const e=environment();e.attach();const opening=e.bridge.open();e.bridge.close();e.bundleLoads[0](null,e.bundle);await opening; + assert.equal(e.assetLoads.length,0);assert.deepEqual(e.releases,['assets','bundle']);assert.equal(e.bridge.session,null); +}); + +test('cancelled prefab load releases before reopening; prefab failure permits retry',async()=>{ + const e=environment();e.attach();const first=e.bridge.open();e.bundleLoads[0](null,e.bundle);await tick(); + e.bridge.close();const second=e.bridge.open();e.assetLoads[0].callback(new Error('prefab failed'));await first;await tick(); + assert.equal(e.bundleLoads.length,2);assert.deepEqual(e.releases,['assets','bundle']); + e.bridge.close();e.bundleLoads[1](null,e.bundle);await second;assert.equal(e.bridge.session,null); +}); + +test('mounted panel destroys listeners/nodes before textures; HomeScene exit unloads bundle',async()=>{ + const e=environment();e.bridge.refresh=()=>Promise.resolve();const home=e.attach(); + const opening=e.bridge.open();e.bundleLoads[0](null,e.bundle);await tick();e.assetLoads.forEach(item=>item.callback(null,frame));await opening; + assert.equal(e.bridge.listeners.length,1);assert.equal(e.releases.length,0); + e.bridge.detach(home);assert.equal(e.releases.length,0);e.draw();await tick(); + assert.equal(e.bridge.listeners.length,0);assert.deepEqual(e.releases,['assets','bundle']);assert.equal(e.bridge.session,null); +}); + +test('entry observations are bounded and never qualify a task or store query values',()=>{ + const e=environment(); + for(let i=0;i<35;i++)e.bridge.capture({scene:1089,query:{secret:'do-not-store'}},'show'); + assert.equal(e.bridge.getDiagnostics().length,24); + assert.equal(JSON.stringify(e.bridge.getDiagnostics()).includes('do-not-store'),false); + assert.ok(Object.values(e.bridge.getState()).every(item=>!item.eligibleAt&&!item.claimedAt)); + assert.equal(Object.keys(e.storage).length,0); +}); + +test('non-WeChat builds do not create an entry, load a bundle or capture eligibility',()=>{ + const e=environment();e.cc.sys.platform='douyin';e.attach();e.bridge.capture({scene:90001},'show'); + assert.equal(e.bridge.entryNode,null);assert.equal(e.bundleLoads.length,0);assert.equal(e.bridge.getDiagnostics().length,0); +}); + +test('chengxu follows xinshou in HomeScene and preserves the scene position without overlapping other entries',()=>{ + const e=environment(); + const scene=JSON.parse(fs.readFileSync(path.join(root,'assets/Scene/HomeScene.fire'),'utf8')); + const source=scene.find(n=>n.__type__==='cc.Node'&&n._name==='Top'&&n._children.length>10); + const home=new e.Node('Canvas');home.setContentSize(1080,1920); + const load=new e.Node('Load');load.parent=home; + const top=new e.Node('Top');top.parent=load;top.setPosition(source._trs.array[0],source._trs.array[1]); + for(const ref of source._children){const data=scene[ref.__id__];const n=new e.Node(data._name);n.parent=top;n.setContentSize(data._contentSize);n.setPosition(data._trs.array[0],data._trs.array[1]);} + const configured=top.getChildByName('chengxu');const x=configured.x,y=configured.y; + e.bridge.attach(home);const entry=e.bridge.entryNode; + assert.equal(entry,configured);assert.equal(entry.x,x);assert.equal(entry.y,y); + assert.equal(top.children[top.children.indexOf(entry)-1].name,'xinshou'); + assert.equal(top.children.some(n=>n.name==='miniProgramBenefits'),false); + for(const n of top.children.filter(n=>n!==entry&&Math.abs(n.x-entry.x)<70))assert.ok(Math.abs(n.y-entry.y)>(n.height+entry.height)/2, n.name); + assert.ok(top.y+entry.y-entry.height/2>=-960); + assert.ok(entry.x-entry.width/2>=-540); +}); + +test('bundle icons own unique UUIDs and no feature bundle is statically pulled into main',()=>{ + const meta=JSON.parse(fs.readFileSync(path.join(root,'assets/mini_program_benefits.meta'),'utf8')); + assert.equal(meta.isBundle,true);assert.equal(meta.compressionType.wechatgame,'subpackage'); + const game=JSON.parse(fs.readFileSync(path.join(root,'build-templates/wechatgame/game.json'),'utf8')); + assert.deepEqual(game.subpackages.filter(item=>item.name===meta.bundleName),[{name:meta.bundleName,root:'subpackages/'+meta.bundleName}]); + for(const [name,original] of [['freeze','dongjie'],['hammer','chuizi'],['magic','mofabang']]){ + const a=JSON.parse(fs.readFileSync(path.join(root,'assets/mini_program_benefits/icons',name+'.png.meta'),'utf8')); + const b=JSON.parse(fs.readFileSync(path.join(root,'assets/jungle_treasure/img',original+'.png.meta'),'utf8')); + assert.notEqual(a.uuid,b.uuid);assert.notEqual(Object.values(a.subMetas)[0].uuid,Object.values(b.subMetas)[0].uuid); + } + const source=fs.readFileSync(path.join(root,bridgeFile),'utf8'); + assert.equal(/^import .*mini_program_benefits/m.test(source),false); + assert.equal(/^import .*jungle_treasure|^import .*shop\//m.test(fs.readFileSync(path.join(root,panelFile),'utf8')),false); +}); + + +test('qualification uses the same latest entry as the panel instead of stale launch options',()=>{ + const e=environment();e.wx.getEnterOptionsSync=()=>({scene:1104}); + e.bridge.capture({scene:1011},'cold');assert.ok(e.bridge.getState().favorite_entry.eligibleAt); + assert.equal(e.bridge.getDiagnostics()[0].scene,1104); + const other=environment();other.wx.getEnterOptionsSync=()=>({scene:1089}); + other.bridge.capture({scene:1104},'show');assert.ok(Object.values(other.bridge.getState()).every(item=>!item.eligibleAt)); + const fallback=environment();fallback.wx.getEnterOptionsSync=()=>{throw Error('unsupported');}; + fallback.bridge.capture({scene:1104},'show');assert.ok(fallback.bridge.getState().favorite_entry.eligibleAt); +}); + +test('release, unknown version and missing account API never load phone test bundle',()=>{ + for(const env of ['release','unknown',undefined]){ + const e=environment();e.wx.getAccountInfoSync=()=>({miniProgram:{envVersion:env}});e.attach();assert.equal(e.bundleLoads.length,0); + } + const e=environment();e.wx.getAccountInfoSync=()=>{throw Error('unavailable');};e.attach();assert.equal(e.bundleLoads.length,0); +}); + + + + + + + +test('receipt stays pending until the player dismisses the independent reward overlay',async()=>{ + const e=environment(),p=receiptPanel(e),wait=deferred();p.panel.showRewardAnimation=()=>wait.promise; + const claim=p.panel.claim('favorite_entry');await tick();assert.equal(p.acks(),0);assert.equal(p.panel.busy,true); + wait.resolve();await claim;assert.equal(p.acks(),1);assert.equal(p.panel.busy,false); +}); + +test('cancelled independent reward presentation leaves receipt available for retry',async()=>{ + const e=environment(),p=receiptPanel(e);p.panel.showRewardAnimation=async()=>{throw Error('presentation cancelled');}; + await p.panel.claim('favorite_entry');assert.equal(p.acks(),0);assert.equal(p.state.favorite_entry.acknowledged,false); +}); + + +test('benefits entry depends on its own state even while other activities are pending',()=>{ + const e=environment();const home=e.attach(); + home.getComponent=()=>({isBenefitsEntryLayoutReady:()=>false}); + e.bridge.state={favorite_entry:{eligibleAt:1}};e.bridge.refreshEntry(); + assert.equal(e.bridge.entryNode.active,true);assert.equal(e.bridge.entryRed.active,true); + e.bridge.state={favorite_entry:{claimedAt:1,acknowledged:true},desktop_entry:{claimedAt:1,acknowledged:true}}; + e.bridge.refreshEntry();assert.equal(e.bridge.entryNode.active,false); + e.bridge.state.desktop_entry.acknowledged=false; + e.bridge.refreshEntry();assert.equal(e.bridge.entryNode.active,true); +}); + +test('real home uses a separate receipt store and never mounts the reset button',()=>{ + const e=environment(); + e.wx.getAccountInfoSync=()=>({miniProgram:{envVersion:'trial'}}); + e.bridge.onLogin({_id:'player'}); + assert.equal(e.bridge.getRewardStorageKey(),'mini_program_benefits_rewards_v1:player'); + e.attach();assert.equal(e.bundleLoads.length,0); +}); + + +test('all five editable prefabs reference only bundle assets and valid local node ids',()=>{ + const dir=path.join(root,'assets/mini_program_benefits'),ids=new Set(['eca5d2f2-8ef6-41c2-bbe6-f9c79d09c432']); + function metas(d){for(const item of fs.readdirSync(d,{withFileTypes:true})){const p=path.join(d,item.name);if(item.isDirectory())metas(p);else if(p.endsWith('.meta')){const m=JSON.parse(fs.readFileSync(p));ids.add(m.uuid);for(const sub of Object.values(m.subMetas||{}))ids.add(sub.uuid);}}}metas(dir); + for(const name of ['BenefitsWindow','BenefitsMain','BenefitsFavoriteGuide','BenefitsDesktopGuide','BenefitsReward']){ + const a=JSON.parse(fs.readFileSync(path.join(dir,'prefab',name+'.prefab'))); + function visit(v){if(!v||typeof v!=='object')return;if(v.__id__!==undefined)assert.ok(a[v.__id__],name+' node reference');if(v.__uuid__)assert.ok(ids.has(v.__uuid__),name+' foreign asset '+v.__uuid__);Object.values(v).forEach(visit);}visit(a); + assert.equal(a[0].__type__,'cc.Prefab');assert.ok(a.some(n=>n.__type__==='cc.Sprite')); + } + const panel=fs.readFileSync(path.join(root,panelFile),'utf8');assert.equal(panel.includes('new cc.Node'),false);assert.equal(panel.includes('cc.Graphics'),false); + const bridge=fs.readFileSync(path.join(root,bridgeFile),'utf8');assert.ok(bridge.includes('bundle.load("prefab/BenefitsWindow", cc.Prefab')); +}); + +test('prefab task buttons update existing nodes without rebuilding editable layout',()=>{ + const e=environment();const node=e.cc.instantiate({prefabName:'BenefitsWindow'}),p=node.getComponent('MiniProgramBenefitsPanel');p.refresh=async()=>{};p.playOpenAnimation=()=>{}; + let state={};const host={getUid:()=>"player",bindRewardApi(){},getRewardStorageKey:()=> 'test',getState:()=>state,subscribe:()=>()=>{},close(){}};p.init(host); + const row=p.views.list.getChildByName('Task0'),view=row.getChildByName('View');assert.equal(view.active,true); + state={favorite_entry:{eligibleAt:1}};p.render();assert.equal(view.active,false);assert.equal(row.getChildByName('Claim').active,true); + state.favorite_entry.claimedAt=2;p.render();assert.equal(row.getChildByName('Claimed').active,true);assert.equal(p.views.list.getChildByName('Task0'),row); +}); + +test('production login ignores old local claims and hides completed welfare after cache clear',()=>{ + const e=environment(); + e.storage[e.bridge.getRewardStorageKey()]=JSON.stringify({favorite_entry:{claimedAt:123},desktop_entry:{claimedAt:123}}); + e.bridge.onLogin({_id:'player',miniProgramWelfare:{favorite:false,desktop:false}}); + assert.equal(e.bridge.getState().favorite_entry.claimedAt,0); + e.bridge.capture({scene:1023},'show');assert.ok(e.bridge.getState().desktop_entry.eligibleAt); + Object.keys(e.storage).forEach(key=>delete e.storage[key]); + e.bridge.onLogin({_id:'player',miniProgramWelfare:{favorite:true,desktop:true}}); + const home=e.attach();e.bridge.refreshEntry(); + assert.equal(e.cc.find('Load/Top/chengxu',home).active,false); + assert.equal(e.bridge.getState().favorite_entry.acknowledged,true); +}); + +test('production eligibility survives a new session and remains isolated by account',()=>{ + const first=environment();first.bridge.uid="";first.bridge.pendingEntries={}; + first.bridge.capture({scene:1104},'cold'); + first.bridge.onLogin({_id:'alice',miniProgramWelfare:{favorite:false,desktop:false}}); + first.bridge.capture({scene:1023},'show'); + const next=environment();Object.assign(next.storage,first.storage); + next.bridge.capture({scene:1001},'cold'); + next.bridge.onLogin({_id:'alice',miniProgramWelfare:{favorite:false,desktop:false}}); + assert.ok(next.bridge.getState().favorite_entry.eligibleAt); + assert.ok(next.bridge.getState().desktop_entry.eligibleAt); + assert.equal(next.bridge.getState().favorite_entry.claimedAt,0); + next.bridge.onLogin({_id:'bob',miniProgramWelfare:{favorite:false,desktop:false}}); + assert.equal(next.bridge.getState().favorite_entry.eligibleAt,0); + next.bridge.onLogin({_id:'alice',miniProgramWelfare:{favorite:true,desktop:true}}); + assert.ok(next.bridge.getState().favorite_entry.claimedAt); + assert.ok(next.bridge.getState().desktop_entry.claimedAt); + const home=next.attach();assert.equal(next.cc.find('Load/Top/chengxu',home).active,false); +}); + +test('production eligibility ignores malformed cache and reports failed persistence',()=>{ + const e=environment(); + e.storage['mini_program_benefits_eligibility_v1:alice']='{"favorite_entry":"yes","desktop_entry":-1}'; + e.bridge.onLogin({_id:'alice',miniProgramWelfare:{favorite:false,desktop:false}}); + assert.equal(e.bridge.getState().favorite_entry.eligibleAt,0); + e.cc.sys.localStorage.setItem=()=>{throw Error('full')}; + e.bridge.capture({scene:1104},'show'); + assert.equal(e.bridge.getState().favorite_entry.eligibleAt,0); +}); + + + +test('activity close keeps the shared test bundle alive until leaving home',async()=>{ + const e=environment(),b=e.bridge;b.getTestEnvironment=()=>({allowed:true}); + e.classes.BenefitsRuntimeTest=class {initialize(host){this.host=host;}}; + e.cc.instantiate=()=>new e.Node('BenefitsRuntimeTest'); + const home=e.attach();assert.equal(e.bundleLoads.length,0);b.mountTestPanel(home);e.bundleLoads[0](null,e.bundle); + assert.equal(e.assetLoads[0].name,'test/BenefitsRuntimeTest');e.assetLoads[0].callback(null,{}); + assert.ok(b.testNode);assert.equal(b.bundleUsers,1); + const opening=b.open();b.close();e.bundleLoads[1](null,e.bundle);await opening; + assert.equal(b.bundleUsers,1);assert.deepEqual(e.releases,[]); + b.detach();e.draw();assert.equal(b.bundleUsers,0);assert.deepEqual(e.releases,['assets','bundle']); +}); + + +test('both real entry qualifications captured before login survive and preserve server claims',()=>{ + const e=environment(),b=e.bridge;b.uid='';e.info.level=0; + b.capture({scene:1104},'cold');b.capture({scene:1023},'show');assert.equal(Object.keys(e.storage).length,0); + b.onLogin({_id:'player',miniProgramWelfare:{favorite:true,desktop:false}});e.attach(); + assert.ok(b.state.favorite_entry.eligibleAt);assert.ok(b.state.desktop_entry.eligibleAt); + assert.equal(b.state.favorite_entry.claimedAt,1);assert.equal(b.entryNode.active,false); + e.info.level=1;b.refreshEntry();assert.equal(b.entryNode.active,true);assert.equal(b.entryRed.active,true); + b.state.favorite_entry.receiptId='keep';b.capture({scene:1104},'show');assert.equal(b.state.favorite_entry.receiptId,'keep'); +}); + +test('account switch rejects delayed bridge responses without replacing new account state',async()=>{ + const e=environment(),b=e.bridge,pending=deferred();b.session={api:{request:()=>pending.promise}}; + const request=b.refresh();b.onLogin({_id:'other',miniProgramWelfare:{favorite:true,desktop:true}}); + pending.resolve({state:{favorite_entry:{claimedAt:0}}});await assert.rejects(request,/账号/); + assert.equal(b.getUid(),'other');assert.equal(b.state.favorite_entry.claimedAt,1);assert.equal(b.state.desktop_entry.claimedAt,1); +}); diff --git a/tools/tests/mini-program-benefits-reward.test.cjs b/tools/tests/mini-program-benefits-reward.test.cjs new file mode 100644 index 00000000..4a38d3ed --- /dev/null +++ b/tools/tests/mini-program-benefits-reward.test.cjs @@ -0,0 +1,41 @@ +const test = require('node:test'); +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const vm = require('node:vm'); +const ts = require(process.env.TYPESCRIPT_PATH || 'typescript'); +function fixture() { + const info = {uid:'u1',miniProgramWelfare:{favorite:false,desktop:false},freezeAmount:5,hammerAmount:6,magicAmount:7}; + const state = {favorite_entry:{eligibleAt:1},desktop_entry:{eligibleAt:1}}; + const storage = {prop:{hourglassAmount:4}}, posts=[]; + let handler=(url,data,cb)=>cb(url==='userProp'?{code:1,data:{freeze:6,hammer:7,magic_wand:8}}:{code:1}); + const cc={fx:{GameConfig:{GM_INFO:info},StorageMessage:{getStorage:k=>storage[k],setStorage:(k,v)=>storage[k]=v}}}; + const Utils={POST:(url,data,cb)=>{posts.push({url,data});handler(url,data,cb);}}; + const module={exports:{}}; + vm.runInNewContext(ts.transpileModule(fs.readFileSync('assets/mini_program_benefits/script/MiniProgramBenefitsReward.ts','utf8'),{compilerOptions:{target:ts.ScriptTarget.ES2017,module:ts.ModuleKind.CommonJS}}).outputText,{module,exports:module.exports,require:()=>({default:Utils}),cc,setTimeout,clearTimeout}); + const Reward=module.exports.default; + return {info,state,storage,posts,api:new Reward('u1','u1',()=>state),Reward,setHandler:h=>handler=h}; +} +test('deduplicates claims, maps task names, uploads fixed client rewards once',async()=>{ + const f=fixture(); await Promise.all([f.api.request('claim',{task:'favorite_entry'},1),new f.Reward('u1','u1',()=>f.state).request('claim',{task:'favorite_entry'},1)]); + assert.equal(f.posts.length,2); assert.equal(f.posts[0].url,'miniProgramWelfare');assert.equal(f.posts[0].data.type,'favorite');assert.equal(f.posts[1].data.action,'save');assert.deepEqual(JSON.parse(f.posts[1].data.propData),{freeze:6,hammer:7,magic_wand:8}); + assert.equal(f.info.freezeAmount,6);assert.equal(f.storage.prop.hourglassAmount,4);assert.equal(f.info.miniProgramWelfare.favorite,true); + await f.api.request('ack',{task:'favorite_entry',receiptId:f.state.favorite_entry.receiptId});assert.equal(f.state.favorite_entry.acknowledged,true); +}); +test('server login claims remain claimed without local storage',async()=>{ + const f=fixture();f.state.favorite_entry={claimedAt:1,acknowledged:true};await f.api.request('claim',{task:'favorite_entry'},1);assert.equal(f.posts.length,0); +}); +test('failed inventory upload retries without requesting or adding another award',async()=>{ + const f=fixture();let reads=0;f.setHandler((url,data,cb)=>cb(url==='userProp'?(++reads===1?{code:0,msg:'offline'}:{code:1,data:{freeze:6,hammer:7,magic_wand:8}}):{code:1})); + await assert.rejects(f.api.request('claim',{task:'desktop_entry'},1),/offline/);assert.ok(f.state.desktop_entry.claimedAt);assert.equal(f.info.freezeAmount,6); + await new f.Reward('u1','u1',()=>f.state).request('read');assert.equal(f.posts.filter(p=>p.url==='miniProgramWelfare').length,1);assert.equal(f.info.freezeAmount,6); +}); +test('failed claim does not mutate inventory or mark claimed',async()=>{ + const f=fixture();f.setHandler((u,d,cb)=>cb({code:0,msg:'已领取'}));await assert.rejects(f.api.request('claim',{task:'favorite_entry'},1),/已领取/);assert.equal(f.info.freezeAmount,5);assert.ok(!f.state.favorite_entry.claimedAt); +}); +test('account switch ignores delayed response',async()=>{ + const f=fixture();f.setHandler((u,d,cb)=>{f.info.uid='u2';cb({code:1})});await assert.rejects(f.api.request('claim',{task:'favorite_entry'},1),/账号/);assert.ok(!f.state.favorite_entry.claimedAt);assert.equal(f.info.freezeAmount,5); +}); +test('missing contract and invalid eligibility cannot claim',async()=>{ + const f=fixture();await assert.rejects(f.api.request('claim',{task:'favorite_entry'},0));delete f.info.miniProgramWelfare;await assert.rejects(f.api.request('claim',{task:'favorite_entry'},1),/重新登录/);await assert.rejects(f.api.request('reset'));assert.equal(f.posts.length,0); +}); +