UNLOCK_GATES.md · Cập nhật lần cuối: 2026-09-04 19:26 +07 · sha256 nguồn 3ccad179bf91UNLOCK_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_Max là giá 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 = 3 ⇒ Stage_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 |
Vì 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()RVA0x2B44418(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
SequenceLockedtheoReward_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á
Raidnào ở runtime hay không (bằng chứng tĩnh: KHÔNG).