CatGunner CookbookBardCat 1.1.59 · L1 ANALYSIS · tài liệu học
Trang chủThang mở khoá › UNLOCK_GATES — Điều kiện mở khoá từng feature, chứng minh từ code
Nguồn: UNLOCK_GATES.md · Cập nhật lần cuối: 2026-09-04 19:26 +07 · sha256 nguồn 3ccad179bf91

UNLOCK_GATES — Điều kiện mở khoá từng feature, chứng minh từ code

Lane R7 · static only · 2026-09-04 Mọi con số đều trích từ dump.cs + decompile headless IDA headless trên [native: libil2cpp.so.i64]. Không có ngưỡng nào được suy đoán.


1. Biến cổng trung tâm: Tree_manager.Stage_Value_Max

1.1 Định nghĩa field (VERIFIED — dump.cs:602139-602141)

public class Tree_manager : MonoBehaviour   // TypeDefIndex: 8349
    public int Stage_Now;        // 0x28
    public int Level_Now;        // 0x2C
    public int Stage_Value_Max;  // 0x30
    public static Tree_manager instance;  // static 0x10

1.2 Công thức (VERIFIED — Tree_manager.Game_Win RVA 0x2B452E4, lệnh tại 0x2B45520)

v33 = *(_DWORD *)(a1 + 44) + 10 * *(_DWORD *)(a1 + 40);   // Level_Now + 10*Stage_Now
if ( v33 >= *(_DWORD *)(a1 + 48) ) {                       // >= Stage_Value_Max
    *(_DWORD *)(a1 + 48) = v33;                            // Stage_Value_Max = v33   @0x2B45534
    Rank_manager__SubmitScore(...);                        // @0x2B45574
    Tree_manager__Contents_Lock_Reload(a1);                // @0x2B4557C
}

Stage_Value = Level_Now + 10 × Stage_Now, và Stage_Value_Maxgiá trị CAO NHẤT từng đạt (monotonic — KHÔNG reset khi Rebirth, vì chỉ ghi khi >=).

1.3 Bước tiến stage (VERIFIED — Tree_manager.StageAdvance RVA 0x2B45820)

if (Level_Now >= 4) { Level_Now = 0; Stage_Now += 1; }
else                { Level_Now += 1; }

Level_Now chạy 0..4 (5 level/stage), Stage_Now 0-based.

1.4 Quy đổi 0-based ↔ hiển thị (VERIFIED — GameSlider.Stage_Reload(int Stage, int Lv) RVA 0x2B156E4)

v22 = a2 + 1;                                   //  Stage + 1   @0x2B4573C
v21 = a3 + 1;                                   //  Lv    + 1   @0x2B45758
String.Format("Stage {0}-{1}", v22, v21)        //  literal @0x5E94A48

UI hiển thị "Stage (Stage_Now+1)-(Level_Now+1)". Xác nhận chéo 2: FreeCash_manager.get_MaxStageDisplay() RVA 0x2A6D118, lệnh 0x2A6D1F0 = Tree_manager.instance.Stage_Value_Max / 10 + 1 → "số stage hiển thị cao nhất".

1.5 Đối chiếu với save thật của user (ĐỘC LẬP — [device evidence: user_screenshot_stage5-4.png])

Hiển thị "Stage 5-4" ⇒ Stage_Now = 4, Level_Now = 3Stage_Value = 3 + 40 = 43. Với bảng §2: mở Rebirth(20)✓ Mine(30)✓ ; khoá Fish(50)✗ Boss(90)✗ Pet(110)✗ Hunt(110)✗ Trip(340)✗. Khớp 100 % với ảnh chụp.


2. BẢNG NGƯỠNG MỞ KHOÁ — 7 feature cổng chính

Hàm cổng: Tree_manager.Contents_Lock_Reload() RVA 0x2B4441C (mẫu chung: Locked_obj.SetActive(Stage_Value_Max < N)hiện ổ khoá khi < N, mở khi ≥ N). Hàm nút: Tree_manager.Content_Btn_* — kiểm tra lại cùng ngưỡng, nếu chưa đủ thì UI_manager.Alert(String.Format(I2.Loc ScriptLocalization.Alarm.StageUnlock, <số stage hiển thị>)).

# Feature (nhãn UI) Field ổ khoá Stage_Value_Max ≥ RVA SetActive Handler nút (RVA) Ngưỡng trong handler Số stage trong Alert ⇒ Mở tại stage HIỂN THỊ Trạng thái
1 Rebirth Rebirth_manager.Rebirth_Btn_Locked_obj (0x30) 20 0x2B444EC Content_Btn_Rebirth 0x2B44B58 >= 20 @0x2B44B8C 3 @0x2B44BAC Stage 3-1 VERIFIED
2 Mine Mine_manager.Mine_Btn_Locked_obj (0x50) 30 0x2B44554 Content_Btn_Mine 0x2B44CE4 >= 30 @0x2B44D18 4 @0x2B44D38 Stage 4-1 VERIFIED
3 Fish Fish_manager.Fish_Btn_Locked_obj (0x70) 50 0x2B44520 Content_Btn_Fish 0x2B44C10 >= 50 @0x2B44C44 6 @0x2B44C64 Stage 6-1 VERIFIED
4 Boss Boss_manager.Boss_Btn_Locked_obj (0x38) 90 0x2B44598 Content_Btn_Boss 0x2B44DCC >= 90 @0x2B44E00 10 @0x2B44E20 Stage 10-1 VERIFIED
5 Pet Pet_manager.Pet_Btn_Locked_obj (0x38) 110 0x2B445DC Content_Btn_Pet 0x2B44E94 >= 110 @0x2B44EC8 12 @0x2B44EE8 Stage 12-1 VERIFIED
6 Hunt (Monster) Monster_manager.Monster_Btn_Locked_obj (0x30) 110 0x2B44620 Content_Btn_Monster 0x2B44F54 >= 110 @0x2B44F88 12 @0x2B44FA8 Stage 12-1 VERIFIED
7 Trip (Adventure) Adventure_manager.Adventure_Btn_Locked_obj (0x50) 340 0x2B4466C Content_Btn_Adventure 0x2B4501C >= 340 @0x2B45050 35 @0x2B45070 Stage 35-1 VERIFIED

Stage_Value ≡ 0..4 (mod 10), mọi ngưỡng đều là bội số của 10 ⇒ feature luôn mở đúng ở level 1 của stage tương ứng, không bao giờ mở giữa stage.

2.1 Cách khớp offset → feature (chuỗi bằng chứng)

Contents_Lock_Reload truy cập static-instance qua off_XXXX[23] + <static offset> rồi obj + <field offset>. Ánh xạ được xác nhận bằng public static <T> instance; trong dump.cs: Mine_manager 0x0 · Fish_manager 0x0 · Rebirth_manager 0x0 · Boss_manager 0x8 · Monster_manager 0x8 · Adventure_manager 0x10 · Pet_manager 0x28. Kết hợp với field-offset của từng *_Locked_obj ⇒ ánh xạ 1-1.

2.2 Xác nhận ĐỘC LẬP từ scene YAML (VERIFIED)

Field *_Locked_obj có được serialize trong Main.unity, trỏ đúng object:

Field trong scene fileID Đường dẫn GameObject m_IsActive
Monster_Btn_Locked_obj (line 20297252) 1529 Canvas/SafeArea/Main_UI/Btn_list/Monster_Btn/Locked_obj 1
Adventure_Btn_Locked_obj (20323826) 1243 .../Btn_list/Adventure_Btn/Locked_obj 1
Pet_Btn_Locked_obj (20324019) 1326 .../Btn_list/'Pet_Btn '/Locked_obj 1
Boss_Btn_Locked_obj (20443909) 540 .../Btn_list/Boss_Btn/Locked_obj 1
Mine_Btn_Locked_obj (20451002) 2030 .../Btn_list/Mine_Btn/Locked_obj 1
Rebirth_Btn_Locked_obj (20611323) 1929 .../Btn_list/Rebirth_Btn/Locked_obj 1
Fish_Btn_Locked_obj (20930397) 84 .../Btn_list/Fish_Btn/Locked_obj 1

Cả 7 nút đều nối onClick → Tree_manager.Content_Btn_* (m_MethodName: tại các dòng 20310425 / 20353033 / 20430337 / 20442896 / 20448559 / 20642360 / 20642642).

2.3 GIẢI QUYẾT ghi chú "Rebirth_Btn_Locked_obj là field không được tham chiếu"

SAI — field ĐƯỢC nối và ĐƯỢC điều khiển. Nó được serialize trong scene (fileID 1929) và được Contents_Lock_Reload gọi SetActive(Stage_Value_Max < 20) tại RVA 0x2B444EC. Lý do tra cứu tĩnh trước đây trượt: Contents_Lock_Reload đọc field qua static-instance Rebirth_manager.instance (static offset 0x0) rồi offset thô +48, không qua tên field; và Contents_Lock_Reload không xuất hiện trong scene YAML (nó được gọi từ code: Tree_manager.Start RVA 0x2B44418 — thân hàm chỉ là return Contents_Lock_Reload(this) — và từ Game_Win @0x2B4557C; tổng cộng 5 code-xref).

2.4 Điểm gọi Contents_Lock_Reload (VERIFIED, 5 code xrefs)

  • Tree_manager.Start() RVA 0x2B44418 (thunk trực tiếp) — chạy mỗi lần vào game.
  • Tree_manager.Game_Win() @ 0x2B4557C — mỗi lần lập kỷ lục stage mới.
  • (2 xref còn lại chưa định danh — UNKNOWN, đưa vào PROBE).

3. Các cổng phụ (không phải 7 nút chính)

Đối tượng Điều kiện RVA / bằng chứng Mức
Nâng cấp Rebirth bằng IAP Tree_manager.instance.Stage_Value_Max > 988 (⇒ giá trị đạt được kế tiếp là 990 ⇒ Stage hiển thị 100-1) Rebirth_manager.UpgradeRebirth_IAP_Unlocked_return() RVA 0x2B232D0, so sánh tại 0x2B23394 VERIFIED (ngưỡng); ⚠ quy đổi "Stage 100" là suy luận từ §1.2/1.3
Trip — mở từng map Adventure_manager.instance.Lv >= Adventure_manager.Adventure_Unlock_Balance[map_index] (Lv của Trip, không phải stage; MaxLv = 15) Adventure_manager.is_Unlock_return(int) RVA 0x2ADB684, return v5 >= arr[a2] @0x2ADB70C; public static int[] Adventure_Unlock_Balance; // 0x8 VERIFIED (công thức). Giá trị mảng: UNKNOWN → PROBE
Skin — mở từng skin num == 0 → luôn mở; ngược lại bool[] @ Skin_manager+0x28 [num] (dữ liệu save, không phải ngưỡng stage) Skin_manager.is_Unlock(int) RVA 0x2B3F514 VERIFIED
DiaPig (heo kim cương) <class @off_5E30D10>.static[+8] \|\| static[+9] (2 cờ bool tĩnh — nhiều khả năng cờ mua IAP) Shop_manager.is_DiaPig_Unlock() RVA 0x2B27764 Công thức VERIFIED; ý nghĩa 2 cờ: UNKNOWN
WeeklyShop VIP (VIP_Locked_obj @0x48) WeeklyShop.Is_VIP_Unlocked() RVA 0x2B3EA58; public const int Unlock_Degree = 3 Hằng VERIFIED; thân hàm chưa giải mã → PROBE
StepUp banner public const int Banner_Unlock_Degree = 2; StepUp.Banner_ShouldShow() RVA 0x2B3A670; Duration_Days = 7, StepCount = 5 dump.cs class StepUp Hằng VERIFIED
PlusPack banner public const int Banner_Stage_Min = 190 (⇒ Stage hiển thị 20-1) dump.cs class PlusPack Hằng VERIFIED
Pet — khoá slot (lock group) Pet_manager.IsPetLocked(int) dump.cs:598030, IsSelectedLocked :598033, LockOwned/LockSelected/UnlockGroup :598042-598048 — khoá do người chơi tự đặt, không phải cổng tiến trình dump.cs VERIFIED
Mission — SequenceLocked / LuxuryLocked / VIPLocked Mission_Item_UI.is_Reward_SequenceLocked(Reward_Degree, int Lv) dump.cs:587516; field LuxuryLocked_obj(0x90)/VIPLocked_obj(0x98) — gắn với battle-pass Luxury/VIP (IAP catgunner_luxury_pass) dump.cs:587575-587576 Cấu trúc VERIFIED; ngưỡng UNKNOWN
Gun_Item_Collection.Locked_obj (0x50) Gun_Item_Collection.Reload(int gunNum) RVA 0x2B0CDF4 — khoá theo "đã sưu tầm" (Gun_manager.Gun_Collect[]) dump.cs:597301 Cấu trúc VERIFIED; logic chưa giải mã
Relic_Item.Unlock_obj/Locked_obj (0x40/0x48) Relic_manager dump.cs:592110-592111 UNKNOWN
Adventure_Map_item.Locked_obj(0x38) / Adventure_Pet_Slot.Locked_obj(0x38) theo is_Unlock_return / Adventure_PetSlot_Unlock_Balance (Adventure_manager field 0x78) dump.cs:592460, 592589 Cấu trúc VERIFIED; giá trị UNKNOWN
Raid KHÔNG có cổng nào — không xuất hiện trong Contents_Lock_Reload, không có Raid_Btn §6 SCREEN_CATALOG VERIFIED (negative evidence)

4. Các nút KHÔNG có cổng tiến trình (luôn mở từ Stage 1-1)

Shop_Btn, Gun_Btn, Skin_Btn, SpeedRun_Btn (Play), Mission_Btn, EcoMode_Btn, Auto_Btn, Setting_Btn, DailyCheck_Btn, DiaPig_Btn, PowerBuff_Btn, MoneyBuff_Btn, Rank_Btn — không có Locked_obj con trong Btn_list và không xuất hiện trong Contents_Lock_Reload. (Các nút liveops StepUp_Btn/DailyGun_Btn/WeeklyShop_Btn/FreeCash_Btn/OfferWall_Btn mặc định m_IsActive: 0 và được bật bởi liveops/thời gian, không phải stage — xem LIVEOPS_SURFACE.)

5. Điều KHÔNG chứng minh được (UNKNOWN — không được bịa)

  • Giá trị cụ thể của Adventure_Unlock_Balance[], Adventure_PetSlot_Unlock_Balance[], Adventure_manager.Exp_balance[] (mảng khởi tạo runtime/serialize).
  • Ngưỡng Mission SequenceLocked theo Reward_Degree/Lv.
  • Ý nghĩa 2 cờ tĩnh trong is_DiaPig_Unlock.
  • 2/5 code-xref còn lại tới Contents_Lock_Reload.
  • Có tồn tại đường mở khoá Raid nào ở runtime hay không (bằng chứng tĩnh: KHÔNG).