CatGunner CookbookBardCat 1.1.59 · L1 ANALYSIS · tài liệu học
Trang chủCookbook › 03 — Prestige / Rebirth: vòng lặp lõi của idle
Nguồn: 03-prestige-rebirth.md · Cập nhật lần cuối: 2026-09-05 04:55 +07 · sha256 nguồn 583351cd8534

03 — Prestige / Rebirth: vòng lặp lõi của idle

Nguồn framework: docs/framework/09-prestige-rebirth.md §1–§5, docs/framework/01-economy-money.md §3.2 (mắt Rebirth trong chuỗi), [liveops catalog: UNLOCK_GATES.md] §1–§2 (cổng mở Rebirth), [phân tích nội bộ] U1–U4. Cấp bằng chứng: L1 ANALYSIS — dựng lại clean-room từ disasm + metadata + quan sát runtime; không phải source gốc. Mỗi dòng bên dưới mang nhãn bằng chứng riêng.

Mục tiêu

Idle không có "hết game"; nó có reset có thưởng: người chơi tự nguyện vứt tiến độ để đổi lấy một hệ số vĩnh viễn, rồi chạy lại quãng đường cũ nhanh gấp N. Muốn làm prestige đúng, bạn cần bốn thứ: (1) một tiền tệ meta tách khỏi tiền thường, (2) đường cong thưởng khuyến khích đi sâu thêm trước khi reset, (3) danh sách reset / persist rõ ràng, (4) một cây nâng cấp vĩnh viễn cắm vào chuỗi thu nhập như mọi nguồn khác. CatGunner (gọi là Rebirth, 환생) làm đủ bốn và mọi con số đều đọc được từ binary + scene.

Game gốc làm gì

Điều game làm Con số / hằng số Mức bằng chứng Nguồn
Tiền tệ prestige là Ruby (Gamemanager.Ruby, static InfVal @0x68); thưởng trao qua Get_Ruby disasm-proven doc 09 §1, §2 (RVA 0x2B22F18)
Rebirth không tốn tiền tệ nào — trả bằng tiến độ Rebirth() không trừ gì disasm-proven doc 09 §2 (RVA 0x2B22AE0)
Nút Rebirth mở khi đạt mốc tiến độ, và không khoá lại Rebirth_Btn_Locked_obj.SetActive(Stage_Value_Max < 20); Stage_Value_Max monotonic, không bị Rebirth() reset ⇒ mở từ Stage 3-1 hiển thị VERIFIED UNLOCK_GATES §2 (RVA 0x2B444EC, 0x2B44B58); CONVERGENCE U1
Công thức thưởng n = Level_Now + 5·Stage_Now; reward = n² · √n · Relic_manager.Rebirth_Value / 100 (= n^2.5 · relic%/100), ToPrecision(5) cắt disasm-proven doc 09 §2 (RVA 0x2B22F18)
Baseline relic Rebirth_Value = 100 ⇒ không relic thì reward = n^2.5 đúng disasm-proven doc 09 §2; CONVERGENCE
Cổng chống farm if (Stage_Now <= 1) reward = 0 — rebirth trước Stage 2 (0-based) được 0 Ruby disasm-proven doc 09 §2
Boost thưởng ×3 nếu is_UpgradeRebirth (UpgradeRebirth_Multiplier = 3) disasm-proven + metadata-proven doc 09 §2
RESET khi Rebirth() Money Money_Accum → 0; mọi Lv upgrade thường → 0; Stage_Now = 0, Level_Now = 0 (+ Game_Exit() + Game_Start()); Cat_manager.Balance_Reload() disasm-proven doc 09 §2 (RVA 0x2B22AE0, 0x2A4F1F8, 0x2B4A61C, 0x2B45EF8)
PERSIST Ruby (+ thưởng), Rebirth_Count (++), Lv cây prestige, Dia, PetCoin, súng / pet / relic / skin / mission (không hề được Rebirth() tham chiếu), Stage_Value_Max disasm-proven (kể cả bằng chứng phủ định) + VERIFIED doc 09 §2; UNLOCK_GATES §1.2
Rebirth() cũng làm ẩn rebirth_panel_ui, Review_manager.Review_Panel_Open(), Mission_manager.MissionValue_Increase(Mission_Type.Rebirth), SaveSystem.Save() disasm-proven doc 09 §2
Cây prestige: 3 node, tiêu Ruby Upgrade_list[0]=Damage, [1]=Speed, [2]=Money; MaxLv = 20000 (const UpgradeMaxLv) disasm-proven + metadata-proven doc 09 §3.1 (RVA 0x2B22500; dump.cs:598987)
Điều kiện mua node (int)Lv < MaxLv Price_return() <= Gamemanager.Ruby; chạm trần ⇒ UI_manager.Alert(Alarm.MaxLv) disasm-proven doc 09 §2 (RVA 0x2B23768)
Mắt Rebirth trong chuỗi thu nhập Money_return() = Upgrade_list[2].Value_return() + 100, dùng như × /100 disasm-proven doc 09 §2 (RVA 0x2B22434)
Bảng giá trị node Damage / Money (mảng scene) Value(lv) = trunc3(int(trunc3(1.05^lv·100 − 100)))xấp xỉ 1.05^lv, luôn thấp hơn (lv 50: ×11.40 vs 11.4674) scene-YAML + VERIFIED doc 09 §2 (Main.unity:20451299 / :20531317)
Bảng giá trị node Speed Value(lv) = 5·lv ⇒ hệ số 1 + 0.05·lv, tuyến tính, khớp chính xác scene-YAML + VERIFIED doc 09 §2 (Main.unity:20491308)
Bảng giá node (Ruby), dùng chung cho cả 3 node Price(lv) = trunc3(int(trunc4(3·(lv+1)^1.6))) — 0/60 lệch; lv 0/1/9/25/46/59 = 3 / 9 / 119 / 550 / 1 420 / 2 090 scene-YAML + VERIFIED doc 09 §2, §3.4 (Main.unity:20571320)
Balance_Reload của Rebirth_managerdead code CodeRefsTo = [] cho 0x2B21CB4; hệ số ×1.002 từ lv 14 999 chỉ tồn tại trong hàm chết VERIFIED doc 09 §2; G138a
Level cây prestige là dữ liệu nhạy cảm ObscuredInt (Anti-Cheat Toolkit, Asset Store 202695) metadata-proven + package-source doc 09 §2 (dump.cs:598957)
Biến thể "rebirth tăng cường" UpgradeRebirth_DailyLimit = 1, UpgradeRebirth_IAP_DailyLimit = 1, UpgradeRebirth_IAP_UnlockStageValue = 989 (⇒ Stage_Value_Max > 988), reset theo chuỗi ngày metadata-proven + VERIFIED doc 09 §2, §3.5; UNLOCK_GATES §3
Cờ chọn đường boost Shop_manager.Is_Remove_AD_All (static @0x9): kind 1 = xem quảng cáo, 2 = đã mua Remove-AD-All, 3 = IAP VERIFIED doc 09 §2; CONVERGENCE U2
Runtime early-game (Stage 1-1, 40 s) Money_return 93×, Damage_return 10×, Speed_return 10×, SaveData_return 8×; 0 lần Rebirth() runtime-observed doc 09 §2, §5
Mô phỏng một chu kỳ (mảng scene thật) Stage 10 / upgrade Money lv 25 ⇒ mắt Upgrade 653 % → rebirth n = 50, thưởng 17 677 Ruby → mua 40 level node Money (dư 270) → mắt Rebirth 703 % (×7.03 vĩnh viễn), mắt Upgrade về 100 % derived (sim mục [K]) doc 09 §3.3

Công thức / pseudocode

1. Hai tầng — L1 ANALYSIS (doc 09 §3.1)

Vòng ngoài — Rebirth()  [RVA 0x2B22AE0]
    n      = Tree_manager.Level_Now + 5 * Tree_manager.Stage_Now
    reward = n^2.5 * Relic_manager.Rebirth_Value / 100        # ToPrecision(5), CẮT
    if (Stage_Now <= 1) reward = 0                            # cổng chống rebirth spam
    if (is_UpgradeRebirth) reward *= 3                        # [R1] boost quảng cáo / IAP
    Gamemanager.Get_Ruby(reward)                              # PERSIST
    Rebirth_Count++                                           # PERSIST
    Gamemanager.Money_Reset()                                 # RESET  Money + Money_Accum
    Upgrade_manager.Reset_Upgrade()                           # RESET  mọi Upgrade_list[i].Lv = 0
    Tree_manager.Rebirth_Reset()                              # RESET  Stage_Now = Level_Now = 0; Game_Exit + Game_Start
    Cat_manager.Balance_Reload()                              # tính lại chỉ số mèo từ state mới
    Mission_manager.instance.MissionValue_Increase(Mission_Type.Rebirth)
    SaveSystem.Save()
    # KHÔNG chạm: Gun / Pet / Relic / Skin manager, Stage_Value_Max  (bằng chứng phủ định đọc từ disasm)

Vòng trong — Rebirth_Upgrade(num)  [RVA 0x2B22500]
    node = Upgrade_list[num]        # 0 = Damage, 1 = Speed, 2 = Money
    if ((int)node.Lv < 20000 && Price_balance[node.Lv] <= Gamemanager.Ruby):
        Ruby -= Price_balance[node.Lv]; node.Lv++
    else: UI_manager.Alert(Alarm.MaxLv)

2. Thưởng theo tiến độ — derived từ công thức disasm (doc 09 §3.4, relic 100 %)

Level_Now Stage_Now n thưởng (Ruby) hiển thị
9 1 0 (cổng) 0
0 2 10 316.22 316
5 2 15 871.42 871
0 10 50 17 677 17.67a
20 20 120 157 740 157.74a

2.5 là siêu tuyến tính: đi sâu gấp đôi ⇒ thưởng gấp 2^2.5 ≈ 5.66. Đó là động cơ "đẩy thêm một chút rồi mới reset".

3. Nối vào chuỗi thu nhập — L1 ANALYSIS, RVA 0x2A4E7B0

r = value * Upgrade_manager.Money_return() / 100;   // Money_balance[Lv]        -> về 100 % sau rebirth
r = r * Rebirth_manager.Money_return()     / 100;   // Value_balance[2][Lv]+100 -> GIỮ và nhân lên mọi thu nhập vòng mới
r = r * Skin_manager.Money_Accum / 100 * Pet_manager.Pet_Money_Accum / 100 * Relic_manager.Money_Value / 100;
if (Money_Buff active) r = r * 3;

Prestige kéo giãn toàn bộ đường cong (nhân), không cộng thêm. Đó là cơ chế "chạy lại nhanh hơn".

4. Ba tốc độ tăng trưởng — tham số hoá tách bạch (doc 09 §4.4)

Trục Upgrade trong vòng Prestige
Trần level 10 000 20 000
Sức mạnh / level ×1.08 lãi kép, đệ quy có cắt ×1.05 lãi kép, cắt từng phần tử
Tốc độ đánh / level +8 tuyến tính +5 % tuyến tính
Giá — dạng 50 · 1.38^lv (hàm mũ, double nhị phân) 3 · (lv+1)^1.6 (đa thức)
Tường cuối ×2.0 / level từ lv ≥ 5 000 (chỉ trong hàm chết — UNKNOWN trong mảng) ×1.002 / level từ lv ≥ 14 999 (như trên)
Lượng tử ToPrecision(3) cắt ToPrecision(3) cắt

Tầng trong dốc và ngắn (giá hàm mũ vượt sức mạnh hàm mũ ⇒ tự tắc, buộc prestige); tầng prestige thoải và dài (giá đa thức thua lãi kép ⇒ tự mở dần).

5. Gợi ý framework (doc 09 §4 — không phải SOT)

public interface IPrestigeLayer {
    bool   CanPrestige { get; }     // CatGunner: luôn true; thưởng có cổng riêng (Stage_Now <= 1 ⇒ 0)
    BigNum PreviewReward();         // ~ Rebirth_Reward_return()
    void   Prestige();              // duyệt registry: OnPrestige() cho mọi hệ đã khai báo phe
    int    PrestigeCount { get; }
}
[PrestigeScope(PrestigeScope.ResetOnPrestige)]   // hoặc .Persistent — BẮT BUỘC khai báo
public sealed class StageProgress : IPrestigeAware { public void OnPrestige() { … } }
// Thưởng là META-CURRENCY, cây meta là IMultiplierSource trả phần trăm (100 = trung tính) → cắm vào chuỗi nhân như mọi nguồn khác.

Bẫy đã gặp

  • Đọc hàm sinh và tưởng đã hiểu nền kinh tế. Balance_Reload của Rebirth_manager/Upgrade_manager/Gun_manager không bao giờ chạy; bảng thật là mảng scene sinh bằng lặp có cắt. Gọi Balance_Reload với một InfVal khác version = một nền kinh tế khác SOT (doc 09 §3.2; G138a).
  • Reset-set bằng kỷ luật con người. Rebirth() gọi tay 3 hàm reset; hệ thống thứ N+1 thêm sau dễ bị quên ⇒ người chơi giữ lại thứ lẽ ra phải mất. Bảng PERSIST của SOT là bằng chứng phủ định (phải đọc disasm mới biết Gun/Pet/Relic/Skin không bị chạm) — framework nên bắt khai báo phe.
  • Quên rằng Money_Accum cũng reset. "Lifetime earnings" ở đây không sống qua rebirth (Money_Reset xoá cả hai) — nếu bạn muốn mốc thành tựu bền, cần một biến khác.
  • Kết luận nút Rebirth "không có cổng" vì dump.cs không thấy tham chiếu. Sai: dump.cs chỉ có khai báo. Cổng là Stage_Value_Max < 20 qua static-instance + offset thô (UNLOCK_GATES §2.3; G139 METHODOLOGY).
  • Khoá nút thay vì trả 0. SOT cho rebirth bất cứ lúc nào sau khi mở, nhưng trả 0 Ruby nếu Stage_Now <= 1 — người chơi luôn thoát được, hệ thống chỉ không thưởng cho hành vi thoái hoá (doc 09 §4.1).
  • Stub trao ×3. UpgradeRebirth_Start_By_Ad / _By_IAP là R1; NullService trả NotAvailable, không bao giờ cấp boost (doc 09 §3.5).
  • Giới hạn ngày bằng timestamp cục bộ. SOT reset theo chuỗi ngày (UpgradeRebirth_LastDate vs Today_str_return()) và có cả hệ chống chỉnh giờ (Time_manager, doc 07 §2.6) — dùng nguồn thời gian đáng tin.

Checklist khi tự làm

  • [ ] Tiền tệ meta riêng (Ruby), tách khỏi tiền thường và tiền premium; prestige không tốn tiền tệ.
  • [ ] Thưởng siêu tuyến tính theo tiến độ (n^2.5 là số đã ship) + cổng "quá sớm ⇒ 0".
  • [ ] Reset-set / persist-set là khai báo trên từng hệ thống; test tự động liệt kê hệ nào chưa khai báo.
  • [ ] Cây meta có maxLevel, valueCurve, priceCurve, softCapLevel, lateGrowth, quantizeDigits — và cắm vào chuỗi nhân như một IMultiplierSource.
  • [ ] Bake bảng ra asset, đối chiếu bằng số thật ở ≥ 3 level; asset là nguồn sự thật.
  • [ ] State prestige bọc chống gian lận (ObscuredInt hoặc tương đương) và là một phần save.
  • [ ] Mọi booster prestige (ad / IAP) đi qua interface fail-closed; giới hạn theo ngày với thời gian đáng tin.
  • [ ] Nút prestige mở theo mốc monotonic (không khoá lại sau reset), ví dụ Stage_Value_Max ≥ 20.
  • [ ] Chạy mô phỏng một chu kỳ đầy đủ (trước → rebirth → mua node → sau) và in hai mắt Upgrade / Rebirth trước-sau.

Điều chưa biết (UNKNOWN)

Chép từ doc 09 §5, cập nhật theo CONVERGENCE / UNLOCK_GATES:

  • ~~Relic_manager.Rebirth_Value nhận giá trị từ đâu~~: ĐÃ ĐÓNG (G361)Relic_manager.Value_Reload: baseline 100, cộng relic Rebirth tuyến tính 5·Lv + 5 (%). Cùng hàm: Skip = 2·Lv+2 (% bỏ màn, chỉ trong vùng đã chinh phục), Offline = 10·Lv+10 phút, MoveSpeed = 2·Lv+2; Damage/Money/CriDmg dùng chung một đường cong seed 105 ×1.05/cấp (3 chữ số) −100, bậc ×1/×1.5/×2 (doc 07 §2.4).
  • Mảng Price_balance / Value_balance chỉ đối chiếu lv 0…59; điểm gãy ×1.002 (lv ≥ 14 999) và giá ở level cao hơn: UNKNOWN trong mảng thật.
  • Trong cửa sổ trace 40 s (early game) không có lần rebirth nàoRebirth(), Rebirth_Upgrade, Rebirth_Reward_return, UpgradeRebirth_* đều 0 lần. Hệ thống được đọc liên tục nhưng chỉ kích hoạt cuối vòng — negative evidence hợp lệ.
  • Đã giải quyết sau khi doc 09 viết (ghi để khỏi tìm lại): cổng Rebirth_Btn_Locked_obj = Stage_Value_Max < 20 (UNLOCK_GATES §2, CONVERGENCE U1); cờ "kind" 1/2/3 = Shop_manager.Is_Remove_AD_All (U2); tham số thứ 3 của MathInfVal.Pow = conservePrecision (U3); bảng từ xa không ghi đè (U4), trừ rủi ro G144 còn phải probe.
  • Doc 09 §5 vẫn ghi "Price_balance của Rebirth_manager chưa đối chiếu với mảng scene" trong bảng UNKNOWN, trong khi §2/§3.2 của cùng doc đã đối chiếu 0/60 lệch — dòng UNKNOWN đó là dư thừa từ bản cũ; cookbook lấy §3.2.

Đọc thêm

  • docs/framework/09-prestige-rebirth.md — toàn bộ, đặc biệt §3.2 và §4.2; §4b — cây prestige vẫn sinh lợi offline (mắt Rebirth Money Speed được áp; skin/pet/relic cũng vậy — đính chính G382), relic Offline kéo dài trần, relic Skip chỉ nhảy trong vùng đã chinh phục (G347)
  • 14 — Lưu game & offline — cửa sổ offline, hai lần ComputeElapsed, bảng Degree*
  • docs/framework/01-economy-money.md §3.2, §5 — chuỗi nhân và simulator
  • [liveops catalog: UNLOCK_GATES.md] §1–§3 — Stage_Value_Max, ngưỡng 20, Rebirth-IAP > 988
  • [phân tích nội bộ] — U1–U4
  • 02 Kinh tế & số lớn — bảng bake bằng lặp cắt cụt
  • 10 Tiến trình & mở khoá — thang 20/30/50/90/110/110/340
  • gap list (nội bộ) — G138, G138a, G139, G140, G142