Files
BABA_YAGA/BABA_YAGA_Updater/sections/02_mechanics.md
2026-06-07 19:41:43 +07:00

14 KiB

Cơ chế Cốt lõi (Core Mechanics)

Kiến trúc gameplay của BABA_YAGA được xây dựng dựa trên nguyên lý "Thông tin Bất xứng" (Information Asymmetry). Hai phe tham gia không chỉ khác biệt về công cụ, mà còn trải nghiệm trò chơi ở hai chiều không gian và logic hoàn toàn trái ngược nhau.


Hệ sinh thái Bất đối xứng (The Asymmetric Paradigm)

THE SEEKER

Thực thể Động (Kinetic Survivor)

THE TRAPPER

Kiến trúc sư Bóng tối (Environment Architect)
Vai trò (Role)
Chủ động điều hướng (Navigation), quản lý tài nguyên sinh tồn và tìm điểm Extraction Point. Phải di chuyển liên tục để tránh bị cô lập.
Vai trò (Role)
Thiết lập hệ thống phòng ngự tĩnh, chặn luồng di chuyển (Choke points) và dồn ép tâm lý con mồi vào bẫy tử thần.
Tầm nhìn (Perception)
Góc nhìn thứ nhất (Immersive FPS). Bị giới hạn hoàn toàn bởi bóng tối, chỉ thấy được những gì chùm sáng đèn pin quét qua.
Tầm nhìn (Perception)
Góc nhìn Thượng đế (Top-down / Surveillance Cams). Quản lý bản đồ qua hệ thống Heatmap và Camera an ninh đa điểm.
Cơ động (Mobility)
Tốc độ bứt tốc cao (Sprinting: 9.0m/s). Khả năng tương tác vật lý trực tiếp với môi trường (Vaulting, Sliding).
Cơ động (Mobility)
Tốc độ vật lý thấp, nhưng bù đắp bằng khả năng Dịch chuyển Tức thời (Teleportation) qua các node mạng lưới bóng tối.
Khí tài (Arsenal)
Khí tài (Arsenal)

Vòng lặp Gameplay & Đồng bộ Hóa (Deterministic Game Loop)

Toàn bộ logic bên dưới được xử lý trong FixedUpdateNetwork() của Photon Fusion. Chúng tôi sử dụng kiến trúc Server Reconciliation kết hợp Client Prediction để đảm bảo Seeker di chuyển mượt mà (không delay), trong khi Trapper vẫn có quyền kiểm soát toàn vẹn trạng thái bản đồ (Server Authority).

(Lưu ý kỹ thuật: Sơ đồ dưới đây đã được cấu trúc lại thuộc tính HTML bên trong để đảm bảo khả năng render không bị lỗi trên các bộ phân tích Markdown của GitHub/Gitea)

graph TD
    %% Định nghĩa Style cho các nhóm (Dark Theme Optimized)
    classDef initStyle fill:#1a2b3c,stroke:#33CCFF,stroke-width:2px,color:#E0E0E0;
    classDef seekerStyle fill:#332200,stroke:#FFD700,stroke-width:2px,color:#FFD700;
    classDef trapperStyle fill:#2b0000,stroke:#FF3333,stroke-width:2px,color:#FF3333;
    classDef netStyle fill:#111111,stroke:#888888,stroke-dasharray: 5 5,color:#E0E0E0;
    classDef winStyle fill:#003311,stroke:#00FF55,stroke-width:3px,color:#00FF55;
    classDef criticalStyle fill:#4d0000,stroke:#FF0000,stroke-width:2px,color:#FF0000;

    %% Phase 1: Initialization
    subgraph Initialization ["<b>1. KHỞI TẠO HỆ THỐNG (NET-SYNC)</b>"]
        A["<img src='https://api.iconify.design/lucide/rocket.svg?color=%2333CCFF' width='20' height='20' style='vertical-align: middle;'> Bắt đầu Trận đấu"] --> B{"<img src='https://api.iconify.design/lucide/handshake.svg?color=%23E0E0E0' width='20' height='20' style='vertical-align: middle;'> Matchmaking<br/>(Photon Fusion)"}
        B --> C["<img src='https://api.iconify.design/lucide/masks-theater.svg?color=%23E0E0E0' width='20' height='20' style='vertical-align: middle;'> Phân vai: Seeker vs Trapper"]
        C --> D["<img src='https://api.iconify.design/lucide/puzzle.svg?color=%23E0E0E0' width='20' height='20' style='vertical-align: middle;'> Maze Generator<br/>(Prims/Wilsons)"]
        D --> E["<img src='https://api.iconify.design/lucide/building-2.svg?color=%23E0E0E0' width='20' height='20' style='vertical-align: middle;'> Baking NavMesh & Colliders"]
        E --> F["<img src='https://api.iconify.design/lucide/user.svg?color=%23E0E0E0' width='20' height='20' style='vertical-align: middle;'> Character Auto-Setup"]
        F --> G["<img src='https://api.iconify.design/lucide/map-pin.svg?color=%23E0E0E0' width='20' height='20' style='vertical-align: middle;'> Spawn Players"]
    end
    class Initialization,A,B,C,D,E,F,G initStyle;

    %% Phase 2: Core Loop
    subgraph Active_Round ["<b>2. VÒNG LẶP CHIẾN ĐẤU (CORE LOOP)</b>"]
        G --> Loop((TICK: FixedUpdateNetwork))
        
        %% Seeker Branch
        subgraph Seeker_Logic ["<b><img src='https://api.iconify.design/lucide/run.svg?color=%23FFD700' width='20' height='20' style='vertical-align: middle;'> SEEKER (POV 1st)</b>"]
            S1["<img src='https://api.iconify.design/lucide/keyboard.svg?color=%23FFD700' width='20' height='20' style='vertical-align: middle;'> Input: WASD/Space"] --> S2["<img src='https://api.iconify.design/lucide/run.svg?color=%23FFD700' width='20' height='20' style='vertical-align: middle;'> State: Move/Dash"]
            S2 --> S3{"<img src='https://api.iconify.design/lucide/zap.svg?color=%23FFD700' width='20' height='20' style='vertical-align: middle;'> Hành động?"}
            S3 -- "Sprinting" --> S4["<img src='https://api.iconify.design/lucide/volume-2.svg?color=%23FFD700' width='20' height='20' style='vertical-align: middle;'> Noise Up"]
            S3 -- "Sneaking" --> S5["<img src='https://api.iconify.design/lucide/volume-x.svg?color=%23FFD700' width='20' height='20' style='vertical-align: middle;'> Noise Down"]
            S3 -- "Flashlight" --> S6["<img src='https://api.iconify.design/lucide/flashlight.svg?color=%23FFD700' width='20' height='20' style='vertical-align: middle;'> Lộ vị trí"]
            
            S4 & S5 & S6 --> S_Check{"<img src='https://api.iconify.design/lucide/search.svg?color=%23FFD700' width='20' height='20' style='vertical-align: middle;'> Check Env"}
            S_Check -- "Dẫm bẫy" --> S_Trap["<img src='https://api.iconify.design/lucide/alert-triangle.svg?color=%23FF0000' width='20' height='20' style='vertical-align: middle;'> Bị khống chế"]
        end

        %% Trapper Branch
        subgraph Trapper_Logic ["<b><img src='https://api.iconify.design/lucide/settings.svg?color=%23FF3333' width='20' height='20' style='vertical-align: middle;'> TRAPPER (STRATEGY)</b>"]
            T1["<img src='https://api.iconify.design/lucide/mouse.svg?color=%23FF3333' width='20' height='20' style='vertical-align: middle;'> Mouse Input"] --> T2["<img src='https://api.iconify.design/lucide/map.svg?color=%23FF3333' width='20' height='20' style='vertical-align: middle;'> View: Heatmap/Cams"]
            T2 --> T3{"<img src='https://api.iconify.design/lucide/wrench.svg?color=%23FF3333' width='20' height='20' style='vertical-align: middle;'> Kỹ năng?"}
            T3 -- "Đặt bẫy" --> T4["<img src='https://api.iconify.design/lucide/binary.svg?color=%23FF3333' width='20' height='20' style='vertical-align: middle;'> Sync Trap"]
            T3 -- "Scan" --> T5["<img src='https://api.iconify.design/lucide/rss.svg?color=%23FF3333' width='20' height='20' style='vertical-align: middle;'> Ping Seeker"]
            T3 -- "Lock" --> T6["<img src='https://api.iconify.design/lucide/door-closed.svg?color=%23FF3333' width='20' height='20' style='vertical-align: middle;'> Khóa cửa"]
            
            T4 & T5 & T6 --> T_Check{"<img src='https://api.iconify.design/lucide/eye.svg?color=%23FF3333' width='20' height='20' style='vertical-align: middle;'> Theo dõi"}
        end

        %% Networking Layer
        subgraph Network_Sync ["<b><img src='https://api.iconify.design/lucide/globe.svg?color=%23E0E0E0' width='20' height='20' style='vertical-align: middle;'> NETWORK SYNC LAYER</b>"]
            Loop --> NS1["⏩ Client Prediction"]
            NS1 --> NS2["<img src='https://api.iconify.design/lucide/refresh-cw.svg?color=%23E0E0E0' width='20' height='20' style='vertical-align: middle;'> Server Reconciliation"]
            NS2 --> NS3["<img src='https://api.iconify.design/lucide/package.svg?color=%23E0E0E0' width='20' height='20' style='vertical-align: middle;'> State Sync"]
        end
    end
    class Seeker_Logic,S1,S2,S3,S4,S5,S6,S_Check seekerStyle;
    class Trapper_Logic,T1,T2,T3,T4,T5,T6,T_Check trapperStyle;
    class Network_Sync,NS1,NS2,NS3,Loop netStyle;
    class S_Trap criticalStyle;

    %% Phase 3: Results
    subgraph Result_Logic ["<b>3. KẾT THÚC & THƯỞNG</b>"]
        S_Check -- "Chạm Exit" --> Win_S["<img src='https://api.iconify.design/lucide/trophy.svg?color=%2300FF55' width='20' height='20' style='vertical-align: middle;'> SEEKER THẮNG"]
        T_Check -- "Bắt được Seeker" --> Win_T["<img src='https://api.iconify.design/lucide/trophy.svg?color=%2300FF55' width='20' height='20' style='vertical-align: middle;'> TRAPPER THẮNG"]
        Loop -- "Timer = 0" --> Win_T
        
        Win_S & Win_T --> Post_Match["<img src='https://api.iconify.design/lucide/bar-chart-3.svg?color=%2333CCFF' width='20' height='20' style='vertical-align: middle;'> Thống kê Match"]
        Post_Match --> Buff{"<img src='https://api.iconify.design/lucide/scale.svg?color=%23E0E0E0' width='20' height='20' style='vertical-align: middle;'> Hệ thống Adaptive"}
        Buff -- "Thua liên tiếp" --> Buff_Apply["<img src='https://api.iconify.design/lucide/gem.svg?color=%23FFD700' width='20' height='20' style='vertical-align: middle;'> Kích hoạt Comeback Buff"]
        Buff_Apply --> A
    end
    class Win_S,Win_T winStyle;
    class Result_Logic,Post_Match,Buff,Buff_Apply initStyle;

    %% Interactions (Dashed Lines)
    S_Trap -.->|Cảnh báo State| T_Check
    S4 -.->|Phát xạ Sóng âm| T2
    T4 -.->|Collision Vô hình| S_Check
    NS3 --> Loop