graph TD
%% --- STYLE DEFINITIONS ---
classDef pool fill:#fff,stroke:#333,stroke-width:2px,shape:cylinder;
classDef source fill:#dfd,stroke:#333,stroke-width:1px,shape:trapezoid;
classDef conv fill:#ddf,stroke:#333,stroke-width:1px,shape:rect;
classDef gate fill:#f9f,stroke:#333,stroke-width:1px,shape:rhombus;
classDef register fill:#ff9,stroke:#333,stroke-width:1px,shape:rect,stroke-dasharray: 5 5;
%% --- 1. GAMEPLAY INPUT & TOKENS ---
subgraph INPUT ["1. Gameplay Loop & Input"]
Src_Play[/"Source: Play Levels"/]:::source -->|Step| P_Level[("Pool: Current Level")]:::pool
P_Level -.->|L| Cond_Unlock{"Check: L >= 15?"}:::gate
Cond_Unlock -->|Yes: Gen 3| Src_Token[/"Source: Earn Tokens"/]:::source
Src_Token --> P_Token[("Pool: User Tokens")]:::pool
end
%% --- 2. THE GACHA ENGINE ---
subgraph ENGINE ["2. Gacha Engine & Rarity Logic"]
P_Token -->|"Pull (Cost 5)"| Conv_Pull["Converter: Pull Action"]:::conv
Conv_Pull -->|"Count +1"| P_Counter[("Pool: Total Pulls (P)")]:::pool
Conv_Pull --> Gate_Rarity{"Gate: Pack Rarity"}:::gate
%% Dynamic Probability Logic based on P
P_Counter -.->|"Reads P"| Gate_Rarity
Gate_Rarity --"Rate(P)"--> Conv_Brown["Brown Pack"]:::conv
Gate_Rarity --"Rate(P)"--> Conv_Green["Green Pack"]:::conv
Gate_Rarity --"Rate(P)"--> Conv_Pink["Pink Pack"]:::conv
Gate_Rarity --"Rate(P)"--> Conv_Blue["Blue Pack"]:::conv
Gate_Rarity --"Rate(P)"--> Conv_Purple["Purple Pack"]:::conv
end
%% --- 3. PACK EXPLOSION (GUARANTEED + RANDOM) ---
subgraph PACKS ["3. Pack Content Logic"]
%% Brown: 1 Guaranteed Tier 1
Conv_Brown -->|"Guaranteed (x1)"| Gate_Dup_T1
%% Green: 1 Guar T2 + 1 Random
Conv_Green -->|"Guaranteed (x1)"| Gate_Dup_T2
Conv_Green -->|"Random Slot (x1)"| Gate_Rand_Green{"Rand Green"}:::gate
Gate_Rand_Green -->|45%| Gate_Dup_T1
Gate_Rand_Green -->|30%| Gate_Dup_T2
Gate_Rand_Green -->|14%| Gate_Dup_T3
%% Pink: 1 Guar T3 + 1 Random
Conv_Pink -->|"Guaranteed (x1)"| Gate_Dup_T3
Conv_Pink -->|"Random Slot (x1)"| Gate_Rand_Pink{"Rand Pink"}:::gate
Gate_Rand_Pink -->|40%| Gate_Dup_T1
Gate_Rand_Pink -->|28%| Gate_Dup_T2
Gate_Rand_Pink -->|18%| Gate_Dup_T3
Gate_Rand_Pink -->|7%| Gate_Dup_T4
%% Blue: 1 Guar T4 + 3 Random
Conv_Blue -->|"Guaranteed (x1)"| Gate_Dup_T4
Conv_Blue -->|"Random Slot (x3)"| Gate_Rand_Blue{"Rand Blue"}:::gate
Gate_Rand_Blue -->|35%| Gate_Dup_T1
Gate_Rand_Blue -->|28%| Gate_Dup_T2
Gate_Rand_Blue -->|20%| Gate_Dup_T3
Gate_Rand_Blue -->|8%| Gate_Dup_T4
Gate_Rand_Blue -->|3%| Gate_Dup_T5
%% Purple: 1 Guar T5 + 4 Random
Conv_Purple -->|"Guaranteed (x1)"| Gate_Dup_T5
Conv_Purple -->|"Random Slot (x4)"| Gate_Rand_Purple{"Rand Purple"}:::gate
Gate_Rand_Purple -->|31%| Gate_Dup_T1
Gate_Rand_Purple -->|25%| Gate_Dup_T2
Gate_Rand_Purple -->|25%| Gate_Dup_T3
Gate_Rand_Purple -->|8%| Gate_Dup_T4
Gate_Rand_Purple -->|4%| Gate_Dup_T5
end
%% --- 4. COLLECTION & DUPLICATE LOGIC ---
subgraph COLLECTION ["4. Collection & Star Conversion"]
%% Tier 1 Logic
Gate_Dup_T1{"Check Dup T1"}:::gate
Gate_Dup_T1 -->|"New (1-a/Cap)"| P_Coll_T1[("Pool: T1 Collection (Cap 33)")]:::pool
Gate_Dup_T1 -->|"Dup (a/Cap)"| Conv_Star["Conv: To Stars"]:::conv
P_Coll_T1 -.->|"State (a)"| Gate_Dup_T1
%% Tier 2 Logic
Gate_Dup_T2{"Check Dup T2"}:::gate
Gate_Dup_T2 -->|"New"| P_Coll_T2[("Pool: T2 Collection (Cap 22)")]:::pool
Gate_Dup_T2 -->|"Dup"| Conv_Star
P_Coll_T2 -.->|"State (b)"| Gate_Dup_T2
%% Tier 3 Logic
Gate_Dup_T3{"Check Dup T3"}:::gate
Gate_Dup_T3 -->|"New"| P_Coll_T3[("Pool: T3 Collection (Cap 20)")]:::pool
Gate_Dup_T3 -->|"Dup"| Conv_Star
P_Coll_T3 -.->|"State (c)"| Gate_Dup_T3
%% Tier 4 Logic
Gate_Dup_T4{"Check Dup T4"}:::gate
Gate_Dup_T4 -->|"New"| P_Coll_T4[("Pool: T4 Collection (Cap 11)")]:::pool
Gate_Dup_T4 -->|"Dup"| Conv_Star
P_Coll_T4 -.->|"State (d)"| Gate_Dup_T4
%% Tier 5 Logic
Gate_Dup_T5{"Check Dup T5"}:::gate
Gate_Dup_T5 -->|"New"| P_Coll_T5[("Pool: T5 Collection (Cap 9)")]:::pool
Gate_Dup_T5 -->|"Dup"| Conv_Star
P_Coll_T5 -.->|"State (e)"| Gate_Dup_T5
end
%% --- 5. STAR SHOP & SMART SLOTS ---
subgraph SHOP ["5. Star Shop (Smart Luck)"]
Conv_Star -->|"Accumulate"| P_Stars[("Pool: Star Wallet")]:::pool
P_Stars -->|"Buy Chest 1 (150)"| Conv_Chest1["Chest 1"]:::conv
P_Stars -->|"Buy Chest 2 (250)"| Conv_Chest2["Chest 2"]:::conv
%% Smart Slot Logic: Connects directly to Pools, bypassing Dup Gate
Conv_Chest1 -->|"If T1 < 33"| P_Coll_T1
Conv_Chest1 -->|"Else If T2 < 22"| P_Coll_T2
Conv_Chest2 -->|"If T3 < 20"| P_Coll_T3
Conv_Chest2 -->|"Else If T4 < 11"| P_Coll_T4
end