update
This commit is contained in:
File diff suppressed because one or more lines are too long
21
.idea/.idea.BABA_YAGA/.idea/workspace.xml
generated
21
.idea/.idea.BABA_YAGA/.idea/workspace.xml
generated
@@ -5,13 +5,22 @@
|
||||
</component>
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="d308d1cb-09fc-4331-ba20-00f7b43d1576" name="Changes" comment="">
|
||||
<change beforePath="$PROJECT_DIR$/.gemini-workspace-history/active-context.md" beforeDir="false" afterPath="$PROJECT_DIR$/.gemini-workspace-history/active-context.md" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/.idea/.idea.BABA_YAGA/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/.idea.BABA_YAGA/.idea/workspace.xml" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/BABA_YAGA_Updater/core/models.py" beforeDir="false" afterPath="$PROJECT_DIR$/BABA_YAGA_Updater/core/models.py" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/BABA_YAGA_Updater/main.py" beforeDir="false" afterPath="$PROJECT_DIR$/BABA_YAGA_Updater/main.py" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/BABA_YAGA_Updater/mappers/markdown_builder.py" beforeDir="false" afterPath="$PROJECT_DIR$/BABA_YAGA_Updater/mappers/markdown_builder.py" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/BABA_YAGA_Updater/mappers/sheet_mapper.py" beforeDir="false" afterPath="$PROJECT_DIR$/BABA_YAGA_Updater/mappers/sheet_mapper.py" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/BABA_YAGA_Updater/.gemini-workspace-history/active-context.md" beforeDir="false" afterPath="$PROJECT_DIR$/BABA_YAGA_Updater/.gemini-workspace-history/active-context.md" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/BABA_YAGA_Updater/sections/00_header.md" beforeDir="false" afterPath="$PROJECT_DIR$/BABA_YAGA_Updater/sections/00_header.md" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/BABA_YAGA_Updater/sections/01_vision.md" beforeDir="false" afterPath="$PROJECT_DIR$/BABA_YAGA_Updater/sections/01_vision.md" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/BABA_YAGA_Updater/sections/02_mechanics.md" beforeDir="false" afterPath="$PROJECT_DIR$/BABA_YAGA_Updater/sections/02_mechanics.md" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/BABA_YAGA_Updater/sections/03_architecture.md" beforeDir="false" afterPath="$PROJECT_DIR$/BABA_YAGA_Updater/sections/03_architecture.md" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/BABA_YAGA_Updater/sections/04_maze.md" beforeDir="false" afterPath="$PROJECT_DIR$/BABA_YAGA_Updater/sections/04_maze.md" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/BABA_YAGA_Updater/sections/05_networking.md" beforeDir="false" afterPath="$PROJECT_DIR$/BABA_YAGA_Updater/sections/05_networking.md" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/BABA_YAGA_Updater/sections/06_comeback.md" beforeDir="false" afterPath="$PROJECT_DIR$/BABA_YAGA_Updater/sections/06_comeback.md" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/BABA_YAGA_Updater/sections/07_roadmap.md" beforeDir="false" afterPath="$PROJECT_DIR$/BABA_YAGA_Updater/sections/07_roadmap.md" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/BABA_YAGA_Updater/sections/08_team_standards.md" beforeDir="false" afterPath="$PROJECT_DIR$/BABA_YAGA_Updater/sections/08_team_standards.md" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/BABA_YAGA_Updater/services/readme_editor.py" beforeDir="false" afterPath="$PROJECT_DIR$/BABA_YAGA_Updater/services/readme_editor.py" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/BABA_YAGA_Updater/sections/09_structure.md" beforeDir="false" afterPath="$PROJECT_DIR$/BABA_YAGA_Updater/sections/09_structure.md" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/BABA_YAGA_Updater/sections/10_footer.md" beforeDir="false" afterPath="$PROJECT_DIR$/BABA_YAGA_Updater/sections/10_footer.md" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ProjectSettings/Packages/com.unity.probuilder/Settings.json" beforeDir="false" afterPath="$PROJECT_DIR$/ProjectSettings/Packages/com.unity.probuilder/Settings.json" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/ProjectSettings/ShaderGraphSettings.asset" beforeDir="false" afterPath="$PROJECT_DIR$/ProjectSettings/ShaderGraphSettings.asset" afterDir="false" />
|
||||
<change beforePath="$PROJECT_DIR$/README.md" beforeDir="false" afterPath="$PROJECT_DIR$/README.md" afterDir="false" />
|
||||
</list>
|
||||
<option name="SHOW_DIALOG" value="false" />
|
||||
@@ -103,7 +112,7 @@
|
||||
<option name="number" value="Default" />
|
||||
<option name="presentableId" value="Default" />
|
||||
<updated>1780826181670</updated>
|
||||
<workItem from="1780826183468" duration="11195000" />
|
||||
<workItem from="1780826183468" duration="14344000" />
|
||||
</task>
|
||||
<servers />
|
||||
</component>
|
||||
|
||||
71
Assets/Editor/ReadmeUpdater.cs
Normal file
71
Assets/Editor/ReadmeUpdater.cs
Normal file
@@ -0,0 +1,71 @@
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
|
||||
public class ReadmeUpdater : EditorWindow
|
||||
{
|
||||
private const string PythonScriptPath = "BABA_YAGA_Updater/main.py";
|
||||
private const string VenvPythonPath = "BABA_YAGA_Updater/.venv/Scripts/python.exe";
|
||||
private const string UpdaterDir = "BABA_YAGA_Updater";
|
||||
|
||||
[MenuItem("BABA YAGA/Update README")]
|
||||
public static void UpdateReadme()
|
||||
{
|
||||
string projectRoot = Directory.GetParent(Application.dataPath).FullName;
|
||||
string fullVenvPath = Path.Combine(projectRoot, VenvPythonPath);
|
||||
string fullScriptPath = Path.Combine(projectRoot, PythonScriptPath);
|
||||
string workingDir = Path.Combine(projectRoot, UpdaterDir);
|
||||
|
||||
if (!File.Exists(fullVenvPath))
|
||||
{
|
||||
UnityEngine.Debug.LogError($"[README Updater] Python venv not found at: {fullVenvPath}. Please ensure the .venv is set up in BABA_YAGA_Updater.");
|
||||
return;
|
||||
}
|
||||
|
||||
UnityEngine.Debug.Log("[README Updater] Starting update process...");
|
||||
|
||||
ProcessStartInfo startInfo = new ProcessStartInfo
|
||||
{
|
||||
FileName = fullVenvPath,
|
||||
Arguments = $"\"{fullScriptPath}\"",
|
||||
WorkingDirectory = workingDir,
|
||||
UseShellExecute = false,
|
||||
RedirectStandardOutput = true,
|
||||
RedirectStandardError = true,
|
||||
StandardOutputEncoding = System.Text.Encoding.UTF8,
|
||||
StandardErrorEncoding = System.Text.Encoding.UTF8,
|
||||
CreateNoWindow = true
|
||||
};
|
||||
|
||||
// Force Python to use UTF-8 for IO to handle emojis
|
||||
startInfo.EnvironmentVariables["PYTHONIOENCODING"] = "utf-8";
|
||||
|
||||
using (Process process = Process.Start(startInfo))
|
||||
{
|
||||
using (StreamReader reader = process.StandardOutput)
|
||||
{
|
||||
string result = reader.ReadToEnd();
|
||||
if (!string.IsNullOrEmpty(result))
|
||||
UnityEngine.Debug.Log($"[README Updater] Output:\n{result}");
|
||||
}
|
||||
|
||||
using (StreamReader reader = process.StandardError)
|
||||
{
|
||||
string errors = reader.ReadToEnd();
|
||||
if (!string.IsNullOrEmpty(errors))
|
||||
UnityEngine.Debug.LogError($"[README Updater] Errors:\n{errors}");
|
||||
}
|
||||
|
||||
process.WaitForExit();
|
||||
if (process.ExitCode == 0)
|
||||
{
|
||||
UnityEngine.Debug.Log("🎉 [README Updater] README.md successfully updated!");
|
||||
}
|
||||
else
|
||||
{
|
||||
UnityEngine.Debug.LogError($"[README Updater] Process exited with code {process.ExitCode}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
2
Assets/Editor/ReadmeUpdater.cs.meta
Normal file
2
Assets/Editor/ReadmeUpdater.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ae55b686282bc5248a82e3164817a074
|
||||
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
@@ -41,7 +41,7 @@
|
||||
## <img src="https://api.iconify.design/lucide/eye.svg?color=%23FF3333&flip=horizontal" width="28" height="28" style="vertical-align: middle;"> Tầm nhìn Dự án (Project Vision)
|
||||
|
||||
<div align="center">
|
||||
<img src="https://scove-vault.duckdns.org/files/share/vakALUeH" width="100%" style="border-radius: 10px; border: 1px solid #333;">
|
||||
<img src="https://scove-vault.duckdns.org/files/api/public/dl/vakALUeH" width="100%" style="border-radius: 10px; border: 1px solid #333;">
|
||||
</div>
|
||||
|
||||
> **BABA_YAGA** không chỉ là một trò chơi; nó là một thí nghiệm về sự cô lập. Dự án được xây dựng trên triết lý **"High-Stakes Hide & Seek"**, nơi mỗi giây im lặng đều mang trọng lượng ngàn cân.
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
<div id="vision"></div>
|
||||
|
||||
## <img src="https://api.iconify.design/lucide/eye.svg?color=%23FF3333" width="28" height="28" style="vertical-align: middle;"> Tầm nhìn Dự án (Project Vision)
|
||||
|
||||
<div align="center">
|
||||
<img src="https://scove-vault.duckdns.org/files/share/vakALUeH" width="100%" style="border-radius: 12px; border: 1px solid #222; box-shadow: 0 4px 20px rgba(0,0,0,0.5);">
|
||||
<img src="https://scove-vault.duckdns.org/files/api/public/dl/vakALUeH" width="100%" style="border-radius: 12px; border: 1px solid #222; box-shadow: 0 4px 20px rgba(0,0,0,0.5);">
|
||||
<br>
|
||||
<img src="https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/rainbow.png" width="100%" height="2px">
|
||||
</div>
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
<div id="mechanics"></div>
|
||||
|
||||
## <img src="https://api.iconify.design/lucide/gamepad-2.svg?color=%2333CCFF" width="28" height="28" style="vertical-align: middle;"> 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.
|
||||
@@ -86,80 +88,71 @@
|
||||
|
||||
```mermaid
|
||||
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 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"]
|
||||
subgraph Initialization ["1. KHỞI TẠO HỆ THỐNG (NET-SYNC)"]
|
||||
A["🚀 Bắt đầu Trận đấu"] --> B{"🤝 Matchmaking\nPhoton Fusion"}
|
||||
B --> C["🎭 Phân vai: Seeker vs Trapper"]
|
||||
C --> D["🧩 Maze Generator\nPrims/Wilsons"]
|
||||
D --> E["🏛️ Baking NavMesh & Colliders"]
|
||||
E --> F["👤 Character Auto-Setup"]
|
||||
F --> G["📍 Spawn Players"]
|
||||
end
|
||||
class Initialization,A,B,C,D,E,F,G initStyle;
|
||||
class 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ế"]
|
||||
subgraph Active_Round ["2. VÒNG LẶP CHIẾN ĐẤU (CORE LOOP)"]
|
||||
G --> Loop(["⚙️ TICK: FixedUpdateNetwork"])
|
||||
|
||||
subgraph Seeker_Logic ["⚡ SEEKER - POV 1st Person"]
|
||||
S1["⌨️ Input: WASD/Space"] --> S2["🏃 State: Move/Dash"]
|
||||
S2 --> S3{"❓ Hành động?"}
|
||||
S3 -- "Sprinting" --> S4["🔊 Noise Up"]
|
||||
S3 -- "Sneaking" --> S5["🔇 Noise Down"]
|
||||
S3 -- "Flashlight" --> S6["🔦 Lộ vị trí"]
|
||||
S4 & S5 & S6 --> S_Check{"🔍 Check Env"}
|
||||
S_Check -- "Dẫm bẫy" --> S_Trap["⚠️ 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"}
|
||||
subgraph Trapper_Logic ["🔧 TRAPPER - Strategy View"]
|
||||
T1["🖱️ Mouse Input"] --> T2["🗺️ View: Heatmap/Cams"]
|
||||
T2 --> T3{"🔨 Kỹ năng?"}
|
||||
T3 -- "Đặt bẫy" --> T4["💾 Sync Trap"]
|
||||
T3 -- "Scan" --> T5["📡 Ping Seeker"]
|
||||
T3 -- "Lock" --> T6["🚪 Khóa cửa"]
|
||||
T4 & T5 & T6 --> T_Check{"👁️ 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>"]
|
||||
subgraph Network_Sync ["🌐 NETWORK SYNC LAYER"]
|
||||
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"]
|
||||
NS1 --> NS2["🔄 Server Reconciliation"]
|
||||
NS2 --> NS3["📦 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 S1,S2,S3,S4,S5,S6,S_Check seekerStyle;
|
||||
class T1,T2,T3,T4,T5,T6,T_Check trapperStyle;
|
||||
class 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"]
|
||||
subgraph Result_Logic ["3. KẾT THÚC & THƯỞNG"]
|
||||
S_Check -- "Chạm Exit" --> Win_S["🏆 SEEKER THẮNG"]
|
||||
T_Check -- "Bắt được Seeker" --> Win_T["🏆 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"]
|
||||
|
||||
Win_S & Win_T --> Post_Match["📊 Thống kê Match"]
|
||||
Post_Match --> Buff{"⚖️ Hệ thống Adaptive"}
|
||||
Buff -- "Thua liên tiếp" --> Buff_Apply["💎 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;
|
||||
class 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
|
||||
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
|
||||
```
|
||||
@@ -1,3 +1,5 @@
|
||||
<div id="arch"></div>
|
||||
|
||||
## <img src="https://api.iconify.design/lucide/cpu.svg?color=%2333CCFF" width="28" height="28" style="vertical-align: middle;"> Kiến trúc Kỹ thuật (Technical Architecture)
|
||||
|
||||
> Hệ thống của **BABA_YAGA** được thiết kế theo chuẩn **Modular Architecture** (Kiến trúc Module), tách biệt hoàn toàn giữa logic xử lý vật lý (Kinematics), trạng thái mạng (Net-State) và phản hồi thị giác (Visual Feedbacks). Điều này đảm bảo hiệu năng cao (High Tickrate) ngay cả trong các môi trường mê cung phức tạp.
|
||||
@@ -14,83 +16,81 @@ Hệ thống điều khiển nhân vật cốt lõi được xây dựng trên m
|
||||
stateDiagram-v2
|
||||
direction TB
|
||||
|
||||
state "<img src='https://api.iconify.design/lucide/footprints.svg?color=%23FFD700' width='16' style='vertical-align: middle;'> KINEMATIC GROUND" as Ground {
|
||||
state "👣 KINEMATIC GROUND" as Ground {
|
||||
[*] --> Idle
|
||||
|
||||
|
||||
state Idle {
|
||||
I_P: <img src='https://api.iconify.design/lucide/anchor.svg?color=%23E0E0E0' width='16' style='vertical-align: middle;'> Vel < 0.1m/s
|
||||
I_C: <img src='https://api.iconify.design/lucide/activity.svg?color=%23E0E0E0' width='16' style='vertical-align: middle;'> Breathing Cam (0.5Hz)
|
||||
I_P: ⚓ Vel < 0.1m/s
|
||||
I_C: 📈 Breathing Cam (0.5Hz)
|
||||
}
|
||||
|
||||
Idle --> Moving : Input.mag > 0.1
|
||||
state Moving {
|
||||
M_P: <img src='https://api.iconify.design/lucide/move.svg?color=%23E0E0E0' width='16' style='vertical-align: middle;'> Speed 2-4m/s
|
||||
M_C: <img src='https://api.iconify.design/lucide/video.svg?color=%23E0E0E0' width='16' style='vertical-align: middle;'> Head Bob (1.2Hz)
|
||||
M_P: 🚶 Speed 2-4m/s
|
||||
M_C: 🎥 Head Bob (1.2Hz)
|
||||
}
|
||||
|
||||
Moving --> Sneaking : Hold [Sneak]
|
||||
state Sneaking {
|
||||
Sn_P: <img src='https://api.iconify.design/lucide/volume-x.svg?color=%2300FF55' width='16' style='vertical-align: middle;'> Acoustic Profile -50%
|
||||
Sn_C: <img src='https://api.iconify.design/lucide/arrow-down-to-line.svg?color=%23E0E0E0' width='16' style='vertical-align: middle;'> Collider Height ↓
|
||||
Sn_P: 🔇 Acoustic Profile -50%
|
||||
Sn_C: ⬇️ Collider Height Down
|
||||
}
|
||||
|
||||
Moving --> Sprinting : Hold [Sprint]
|
||||
Sneaking --> Moving : Release [Sneak]
|
||||
|
||||
|
||||
state Sprinting {
|
||||
Sp_P: <img src='https://api.iconify.design/lucide/zap.svg?color=%23FFD700' width='16' style='vertical-align: middle;'> Speed > 6.5m/s
|
||||
Sp_C: <img src='https://api.iconify.design/lucide/aperture.svg?color=%2333CCFF' width='16' style='vertical-align: middle;'> Dynamic FOV Warp
|
||||
Sp_P: ⚡ Speed > 6.5m/s
|
||||
Sp_C: 🔵 Dynamic FOV Warp
|
||||
}
|
||||
|
||||
Sprinting --> Moving : Stamina Depleted
|
||||
}
|
||||
|
||||
state "<img src='https://api.iconify.design/lucide/feather.svg?color=%2333CCFF' width='16' style='vertical-align: middle;'> AIRBORNE DYNAMICS" as Air {
|
||||
state "🪶 AIRBORNE DYNAMICS" as Air {
|
||||
state Jump {
|
||||
J_P: <img src='https://api.iconify.design/lucide/arrow-up-circle.svg?color=%23E0E0E0' width='16' style='vertical-align: middle;'> AddForce Up
|
||||
J_P: ⬆️ AddForce Up
|
||||
}
|
||||
state Falling {
|
||||
F_P: <img src='https://api.iconify.design/lucide/trending-down.svg?color=%23FF3333' width='16' style='vertical-align: middle;'> Gravity x1.5
|
||||
F_P: 📉 Gravity x1.5
|
||||
}
|
||||
state Landing {
|
||||
L_P: <img src='https://api.iconify.design/lucide/ruler.svg?color=%23E0E0E0' width='16' style='vertical-align: middle;'> Impact Raycast
|
||||
L_P: 📐 Impact Raycast
|
||||
}
|
||||
|
||||
Jump --> Falling : Vel.y < 0
|
||||
Falling --> Landing : KCC.IsGrounded == true
|
||||
}
|
||||
|
||||
state "<img src='https://api.iconify.design/lucide/crosshair.svg?color=%23FF3333' width='16' style='vertical-align: middle;'> UTILITY / ACTION" as Utility {
|
||||
state "🎯 UTILITY / ACTION" as Utility {
|
||||
state Dashing {
|
||||
D_P: <img src='https://api.iconify.design/lucide/wind.svg?color=%23FFD700' width='16' style='vertical-align: middle;'> Vector Burst (15m/s)
|
||||
D_P: 💨 Vector Burst (15m/s)
|
||||
}
|
||||
state Interacting {
|
||||
Int_P: <img src='https://api.iconify.design/lucide/lock.svg?color=%23FF3333' width='16' style='vertical-align: middle;'> Root Motion Lock
|
||||
Int_P: 🔒 Root Motion Lock
|
||||
}
|
||||
}
|
||||
|
||||
state "<img src='https://api.iconify.design/lucide/globe.svg?color=%2333CCFF' width='16' style='vertical-align: middle;'> NET-SYNC LAYER" as Net {
|
||||
state "🌐 NET-SYNC LAYER" as Net {
|
||||
state "Input Authority (Client)" as IA
|
||||
state "State Authority (Server)" as SA
|
||||
IA --> SA : Send Input Tick
|
||||
SA --> IA : Force Reconcile
|
||||
}
|
||||
|
||||
%% Main Transitions
|
||||
Ground --> Air : KCC.IsGrounded == false
|
||||
Air --> Ground : OnLandEvent.Fire()
|
||||
Ground --> Utility : InvokeAbility()
|
||||
Utility --> Ground : Action Complete
|
||||
|
||||
%% Sticky Notes for Technical Context
|
||||
note left of Ground
|
||||
<img src='https://api.iconify.design/lucide/database.svg?color=%23FFD700' width='14' style='vertical-align: middle;'> Sync: KCC Velocity
|
||||
<img src='https://api.iconify.design/lucide/layers.svg?color=%23E0E0E0' width='14' style='vertical-align: middle;'> State: Networked Enum
|
||||
💾 Sync: KCC Velocity
|
||||
🗂️ State: Networked Enum
|
||||
end note
|
||||
|
||||
note right of Net
|
||||
<img src='https://api.iconify.design/lucide/server-cog.svg?color=%2333CCFF' width='14' style='vertical-align: middle;'> Photon Fusion
|
||||
<img src='https://api.iconify.design/lucide/shield-check.svg?color=%2300FF55' width='14' style='vertical-align: middle;'> Anti-Cheat Validated
|
||||
⚙️ Photon Fusion
|
||||
🛡️ Anti-Cheat Validated
|
||||
end note
|
||||
```
|
||||
<br>
|
||||
@@ -110,4 +110,3 @@ Sử dụng kết hợp <code>Physics.OverlapSphereNonAlloc</code> để tối
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
```
|
||||
@@ -41,50 +41,46 @@
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
autonumber
|
||||
|
||||
%% Khai báo các thực thể
|
||||
participant IR as <img src='https://api.iconify.design/lucide/mouse-pointer-2.svg?color=%23FFD700' width='20' style='vertical-align: middle;'> Input
|
||||
participant CP as <img src='https://api.iconify.design/lucide/monitor.svg?color=%2333CCFF' width='20' style='vertical-align: middle;'> Local Client
|
||||
participant NT as <img src='https://api.iconify.design/lucide/router.svg?color=%23E0E0E0' width='20' style='vertical-align: middle;'> Fusion Net
|
||||
participant S as <img src='https://api.iconify.design/lucide/server.svg?color=%23FF3333' width='20' style='vertical-align: middle;'> Server Auth
|
||||
participant RP as <img src='https://api.iconify.design/lucide/ghost.svg?color=%23888888' width='20' style='vertical-align: middle;'> Proxies
|
||||
|
||||
%% --- GIAI ĐOẠN 1 ---
|
||||
Note over IR, CP: [PHASE 1] Data Sampling (Thu thập)
|
||||
IR->>CP: Hành động (Move / Ability / Interact)
|
||||
CP->>CP: Đóng gói NetworkInputStruct
|
||||
box rgba(51, 204, 255, 0.05) "⚡ LOCAL ENVIRONMENT (Client Auth)"
|
||||
participant IR as "🖱️ Input"
|
||||
participant CP as "💻 Local Player"
|
||||
end
|
||||
|
||||
%% --- GIAI ĐOẠN 2 ---
|
||||
Note over CP: [PHASE 2] Client Prediction (Dự đoán)
|
||||
CP->>CP: Thực thi Physics & Kinematics tức thì (Tick N)
|
||||
CP->>NT: Transmit Input Payload (Gửi lên mạng)
|
||||
box rgba(255, 51, 51, 0.05) "👑 SERVER ENVIRONMENT (State Auth)"
|
||||
participant NT as "📡 Network Layer"
|
||||
participant S as "🖥️ Server Tick"
|
||||
end
|
||||
|
||||
%% --- GIAI ĐOẠN 3 ---
|
||||
Note over NT, S: [PHASE 3] Server Validation (Xác thực)
|
||||
NT->>S: UDP Reliable Packet Delivery
|
||||
Note right of S: SERVER TICK SIMULATION
|
||||
S->>S: Validate Ruleset & Apply Physics State
|
||||
S-->>NT: Broadcast Global State Snapshot (Tick N)
|
||||
box rgba(255, 215, 0, 0.05) "👁️ REMOTE OBSERVERS"
|
||||
participant RP as "👥 Proxies"
|
||||
end
|
||||
|
||||
%% --- GIAI ĐOẠN 4 ---
|
||||
Note over NT, CP: [PHASE 4] Reconciliation (Điều chỉnh bù trừ)
|
||||
NT-->>CP: Nhận State Snapshot Feed
|
||||
Note over CP: ERROR CORRECTION PROTOCOL
|
||||
CP->>CP: Detect Desync -> Snap Transform -> Resimulate Ticks
|
||||
Note over IR,CP: [PHASE 1] DATA ACQUISITION
|
||||
IR->>CP: OnMove / OnAbility (Raw Input)
|
||||
CP->>CP: 📦 Pack NetworkInputStruct
|
||||
|
||||
%% --- GIAI ĐOẠN 5 ---
|
||||
Note over NT, RP: [PHASE 5] Proxy Update (Cập nhật thực thể bên thứ 3)
|
||||
NT-->>RP: Nhận State Snapshot Feed
|
||||
Note over RP: NETWORK INTERPOLATION
|
||||
RP->>RP: Lerp Position/Rotation (Bù nội suy mượt mà)
|
||||
Note over CP: [PHASE 2] FORWARD PREDICTION
|
||||
CP->>CP: ⚡ Run Local Kinematics (Tick N)
|
||||
CP->>NT: 📤 Transmit Input Payload
|
||||
|
||||
%% --- GIAI ĐOẠN 6 ---
|
||||
Note over CP, RP: [PHASE 6] Visual Render (Hiển thị)
|
||||
CP->>CP: Trigger Camera Shake / Local VFX
|
||||
RP->>RP: Cập nhật Animation Parameters & Mesh
|
||||
rect rgba(255, 51, 51, 0.1)
|
||||
Note over NT,S: [PHASE 3] SERVER VALIDATION (Simulation)
|
||||
NT->>S: Deliver UDP Packet
|
||||
S->>S: 🛡️ Validate Rules & Apply Physics
|
||||
S-->>NT: 📢 Broadcast State Snapshot (Tick N)
|
||||
end
|
||||
|
||||
<div align="right">
|
||||
<img src="https://api.iconify.design/lucide/activity-square.svg?color=%23555555" width="14" style="vertical-align: middle;">
|
||||
<small><i>Hệ thống được thiết lập chạy ở <b>60 Ticks/Second</b>, băng thông ước tính <b><10kb/s</b> mỗi Client.</i></small>
|
||||
</div>
|
||||
Note over NT,CP: [PHASE 4] RECONCILIATION PROTOCOL
|
||||
NT-->>CP: State Snapshot (Global Truth)
|
||||
CP->>CP: ⚖️ Check Desync (Threshold)
|
||||
CP->>CP: 🔄 Snap Pos & Resimulate if Error
|
||||
|
||||
Note over NT,RP: [PHASE 5] PROXY INTERPOLATION
|
||||
NT-->>RP: State Snapshot
|
||||
RP->>RP: 〰️ Lerp Position / Rotation Smoothly
|
||||
|
||||
Note over CP,RP: [PHASE 6] VISUAL RENDERING
|
||||
CP->>CP: 🎥 Update Local VFX / Camera Shake
|
||||
RP->>RP: 👻 Update Animator & Mesh Transforms
|
||||
```
|
||||
@@ -1,3 +1,5 @@
|
||||
<div id="networking"></div>
|
||||
|
||||
## <img src="https://api.iconify.design/lucide/globe-2.svg?color=%2333CCFF" width="28" height="28" style="vertical-align: middle;"> Kiến trúc Netcode (Deterministic Networking)
|
||||
|
||||
<div align="center">
|
||||
@@ -32,56 +34,49 @@
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
autonumber
|
||||
|
||||
%% Phân vùng không gian hệ thống (Sử dụng Box Grouping)
|
||||
|
||||
box rgba(51, 204, 255, 0.05) "⚡ LOCAL ENVIRONMENT (Client Auth)"
|
||||
participant IR as <img src='https://api.iconify.design/lucide/mouse-pointer-click.svg?color=%2333CCFF' width='20' style='vertical-align: middle;'> Input
|
||||
participant CP as <img src='https://api.iconify.design/lucide/cpu.svg?color=%2333CCFF' width='20' style='vertical-align: middle;'> Local Player
|
||||
participant IR as "🖱️ Input"
|
||||
participant CP as "💻 Local Player"
|
||||
end
|
||||
|
||||
|
||||
box rgba(255, 51, 51, 0.05) "👑 SERVER ENVIRONMENT (State Auth)"
|
||||
participant NT as <img src='https://api.iconify.design/lucide/router.svg?color=%23FF3333' width='20' style='vertical-align: middle;'> Network Layer
|
||||
participant S as <img src='https://api.iconify.design/lucide/server.svg?color=%23FF3333' width='20' style='vertical-align: middle;'> Server Tick
|
||||
participant NT as "📡 Network Layer"
|
||||
participant S as "🖥️ Server Tick"
|
||||
end
|
||||
|
||||
|
||||
box rgba(255, 215, 0, 0.05) "👁️ REMOTE OBSERVERS"
|
||||
participant RP as <img src='https://api.iconify.design/lucide/users.svg?color=%23FFD700' width='20' style='vertical-align: middle;'> Proxies
|
||||
participant RP as "👥 Proxies"
|
||||
end
|
||||
|
||||
%% --- GIAI ĐOẠN 1 ---
|
||||
Note over IR, CP: [PHASE 1] DATA ACQUISITION
|
||||
Note over IR,CP: [PHASE 1] DATA ACQUISITION
|
||||
IR->>CP: OnMove / OnAbility (Raw Input)
|
||||
CP->>CP: <img src='https://api.iconify.design/lucide/package-plus.svg?color=%2333CCFF' width='16' style='vertical-align: middle;'> Pack NetworkInputStruct
|
||||
CP->>CP: 📦 Pack NetworkInputStruct
|
||||
|
||||
%% --- GIAI ĐOẠN 2 ---
|
||||
Note over CP: [PHASE 2] FORWARD PREDICTION
|
||||
CP->>CP: <img src='https://api.iconify.design/lucide/zap.svg?color=%2333CCFF' width='16' style='vertical-align: middle;'> Run Local Kinematics (Tick N)
|
||||
CP->>NT: <img src='https://api.iconify.design/lucide/send.svg?color=%2333CCFF' width='16' style='vertical-align: middle;'> Transmit Input Payload
|
||||
|
||||
%% --- GIAI ĐOẠN 3 ---
|
||||
CP->>CP: ⚡ Run Local Kinematics (Tick N)
|
||||
CP->>NT: 📤 Transmit Input Payload
|
||||
|
||||
rect rgba(255, 51, 51, 0.1)
|
||||
Note over NT, S: [PHASE 3] SERVER VALIDATION (Simulation)
|
||||
Note over NT,S: [PHASE 3] SERVER VALIDATION (Simulation)
|
||||
NT->>S: Deliver UDP Packet
|
||||
S->>S: <img src='https://api.iconify.design/lucide/shield-alert.svg?color=%23FF3333' width='16' style='vertical-align: middle;'> Validate Rules & Apply Physics
|
||||
S-->>NT: <img src='https://api.iconify.design/lucide/broadcast.svg?color=%23FF3333' width='16' style='vertical-align: middle;'> Broadcast State Snapshot (Tick N)
|
||||
S->>S: 🛡️ Validate Rules & Apply Physics
|
||||
S-->>NT: 📢 Broadcast State Snapshot (Tick N)
|
||||
end
|
||||
|
||||
%% --- GIAI ĐOẠN 4 ---
|
||||
Note over NT, CP: [PHASE 4] RECONCILIATION PROTOCOL
|
||||
Note over NT,CP: [PHASE 4] RECONCILIATION PROTOCOL
|
||||
NT-->>CP: State Snapshot (Global Truth)
|
||||
CP->>CP: <img src='https://api.iconify.design/lucide/scale.svg?color=%23E0E0E0' width='16' style='vertical-align: middle;'> Check Desync (Threshold)
|
||||
CP->>CP: <img src='https://api.iconify.design/lucide/rotate-ccw.svg?color=%23FF3333' width='16' style='vertical-align: middle;'> Snap Pos & Resimulate if Error
|
||||
CP->>CP: ⚖️ Check Desync (Threshold)
|
||||
CP->>CP: 🔄 Snap Pos & Resimulate if Error
|
||||
|
||||
%% --- GIAI ĐOẠN 5 ---
|
||||
Note over NT, RP: [PHASE 5] PROXY INTERPOLATION
|
||||
Note over NT,RP: [PHASE 5] PROXY INTERPOLATION
|
||||
NT-->>RP: State Snapshot
|
||||
RP->>RP: <img src='https://api.iconify.design/lucide/spline.svg?color=%23FFD700' width='16' style='vertical-align: middle;'> Lerp Position / Rotation Smoothly
|
||||
|
||||
%% --- GIAI ĐOẠN 6 ---
|
||||
Note over CP, RP: [PHASE 6] VISUAL RENDERING
|
||||
CP->>CP: <img src='https://api.iconify.design/lucide/video.svg?color=%2333CCFF' width='16' style='vertical-align: middle;'> Update Local VFX / Camera Shake
|
||||
RP->>RP: <img src='https://api.iconify.design/lucide/ghost.svg?color=%23FFD700' width='16' style='vertical-align: middle;'> Update Animator & Mesh Transforms
|
||||
RP->>RP: 〰️ Lerp Position / Rotation Smoothly
|
||||
|
||||
Note over CP,RP: [PHASE 6] VISUAL RENDERING
|
||||
CP->>CP: 🎥 Update Local VFX / Camera Shake
|
||||
RP->>RP: 👻 Update Animator & Mesh Transforms
|
||||
```
|
||||
<br>
|
||||
<div align="center">
|
||||
<img src="https://api.iconify.design/lucide/shield-alert.svg?color=%23555555" width="16" style="vertical-align: middle;">
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
<div id="comeback"></div>
|
||||
|
||||
## <img src="https://api.iconify.design/lucide/scale.svg?color=%23FF3333" width="28" height="28" style="vertical-align: middle;"> Hệ thống Cân bằng Thích ứng (Tiered "Despair" Mechanics)
|
||||
|
||||
<div align="center">
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
<div id="roadmap"></div>
|
||||
|
||||
## <img src="https://api.iconify.design/lucide/milestone.svg?color=%2333CCFF" width="28" height="28" style="vertical-align: middle;"> Lộ trình Triển khai (Development Roadmap)
|
||||
|
||||
> Tiến trình xây dựng kiến trúc **BABA_YAGA**. Dự án được phát triển theo mô hình Agile, ưu tiên hoàn thiện độ ổn định của lõi Netcode (Networking) trước khi mở rộng các module Meta-game và Visuals.
|
||||
|
||||
@@ -84,61 +84,41 @@
|
||||
|
||||
<br>
|
||||
|
||||
<!-- BẢNG GRID 2x2 CHO TIÊU CHUẨN KỸ THUẬT -->
|
||||
<table width="100%" border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; border: none;">
|
||||
|
||||
<!-- HÀNG 1 -->
|
||||
<tr>
|
||||
<!-- CỘT 1: NETWORKING -->
|
||||
<td width="50%" style="padding: 15px; background: rgba(51,204,255,0.02); border-right: 2px solid #222; border-bottom: 2px solid #222;">
|
||||
<h3 style="margin: 0 0 10px 0; color: #33CCFF;">
|
||||
<img src="https://api.iconify.design/lucide/network.svg?color=%2333CCFF" width="20" style="vertical-align: middle;"> Net-Sync <i>(Assigned to: Duy)</i>
|
||||
</h3>
|
||||
<div style="font-size: 13px; color: #AAA; line-height: 1.6;">
|
||||
<strong style="color: #E0E0E0;">» RTT Optimization:</strong> Duy trì Round Trip Time < 150ms. Tối ưu kích thước Payload mạng qua <code>[Networked]</code> và <code>Reliable RPCs</code>.<br>
|
||||
<strong style="color: #E0E0E0;">» Absolute Server Auth:</strong> Mọi logic Thắng/Thua, Gây sát thương, Kích hoạt bẫy <b>bắt buộc</b> phải được xác thực trên Server để chống Hack/Desync.<br>
|
||||
<strong style="color: #E0E0E0;">» Proxy Smoothing:</strong> Nội suy (Interpolate) chuyển động của Remote Players để bù đắp hiện tượng Jitter do Packet Loss.
|
||||
</div>
|
||||
</td>
|
||||
|
||||
<!-- CỘT 2: WORLD GEN -->
|
||||
<td width="50%" style="padding: 15px; background: rgba(176,38,255,0.02); border-bottom: 2px solid #222;">
|
||||
<h3 style="margin: 0 0 10px 0; color: #B026FF;">
|
||||
<img src="https://api.iconify.design/lucide/layers.svg?color=%23B026FF" width="20" style="vertical-align: middle;"> World & Perf <i>(Assigned to: Scove)</i>
|
||||
</h3>
|
||||
<div style="font-size: 13px; color: #AAA; line-height: 1.6;">
|
||||
<strong style="color: #E0E0E0;">» Algorithmic Constraints:</strong> Thuật toán tạo hình mê cung phải bị giới hạn ở độ phức tạp <code>O(N)</code> hoặc <code>O(N log N)</code> tránh chặn luồng Main Thread.<br>
|
||||
<strong style="color: #E0E0E0;">» Draw Call Budget:</strong> Mesh mê cung sau khi sinh ra phải gộp (Static Batching / GPU Instancing) để giữ số lượng Draw Calls ở mức vi mô.<br>
|
||||
<strong style="color: #E0E0E0;">» Dynamic NavMesh:</strong> Bake tự động NavMesh <i>tại Runtime</i> sau khi chốt Seed mê cung, phục vụ AI Trapper hoặc kỹ năng đặc biệt.
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- HÀNG 2 -->
|
||||
<tr>
|
||||
<!-- CỘT 3: GAMEPLAY -->
|
||||
<td width="50%" style="padding: 15px; background: rgba(255,51,51,0.02); border-right: 2px solid #222;">
|
||||
<h3 style="margin: 0 0 10px 0; color: #FF3333;">
|
||||
<img src="https://api.iconify.design/lucide/swords.svg?color=%23FF3333" width="20" style="vertical-align: middle;"> Mechanics <i>(Assigned to: Tuấn)</i>
|
||||
</h3>
|
||||
<div style="font-size: 13px; color: #AAA; line-height: 1.6;">
|
||||
<strong style="color: #E0E0E0;">» Deterministic Input:</strong> Polling Input phải được dời vào hàm <code>FixedUpdateNetwork</code> để đồng bộ hoàn hảo với Tickrate của Server.<br>
|
||||
<strong style="color: #E0E0E0;">» Physics Matrix:</strong> Quy hoạch chặt chẽ Layer Collision Matrix. Khuyến khích dùng Box/Capsule Colliders cho môi trường lắt léo để giảm tải CPU.<br>
|
||||
<strong style="color: #E0E0E0;">» FSM Integrity:</strong> Mỗi State trong Kinematic FSM là một Sandbox độc lập, nghiêm cấm tiêm/thay đổi biến (Mutate) chéo giữa các trạng thái.
|
||||
</div>
|
||||
</td>
|
||||
|
||||
<!-- CỘT 4: VISUALS -->
|
||||
<td width="50%" style="padding: 15px; background: rgba(255,215,0,0.02);">
|
||||
<h3 style="margin: 0 0 10px 0; color: #FFD700;">
|
||||
<img src="https://api.iconify.design/lucide/palette.svg?color=%23FFD700" width="20" style="vertical-align: middle;"> Render & UX <i>(Assigned to: Tuấn)</i>
|
||||
</h3>
|
||||
<div style="font-size: 13px; color: #AAA; line-height: 1.6;">
|
||||
<strong style="color: #E0E0E0;">» URP 6.0 Pipeline:</strong> Khai thác tối đa Render Graph của Unity 6 để tạo ra Light-baking & Shadow-mapping chân thực cao với chi phí thấp.<br>
|
||||
<strong style="color: #E0E0E0;">» Asset Compression:</strong> Chuẩn hóa mọi Texture về định dạng ASTC/DXT5. Polycount phải được kiểm duyệt khắt khe cho PC tầm trung.<br>
|
||||
<strong style="color: #E0E0E0;">» UX Consistency:</strong> Các phản hồi thị giác/thính giác (Máu me, Cảnh báo bẫy, Tiếng tim đập) phải đồng nhất về cường độ, tạo phản xạ có điều kiện cho User.
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<table width="100%" border="0" cellpadding="0" cellspacing="0" style="border-collapse:collapse;border:none;">
|
||||
<tr>
|
||||
<td width="50%" style="padding:15px;background:rgba(51,204,255,0.02);border-right:2px solid #222;border-bottom:2px solid #222;">
|
||||
<h3 style="margin:0 0 10px 0;color:#33CCFF;"><img src="https://api.iconify.design/lucide/network.svg?color=%2333CCFF" width="20" style="vertical-align:middle;"> Net-Sync <i>(Assigned to: Duy)</i></h3>
|
||||
<div style="font-size:13px;color:#AAA;line-height:1.6;">
|
||||
<strong style="color:#E0E0E0;">» RTT Optimization:</strong> Duy trì Round Trip Time < 150ms. Tối ưu kích thước Payload mạng qua <code>[Networked]</code> và <code>Reliable RPCs</code>.<br>
|
||||
<strong style="color:#E0E0E0;">» Absolute Server Auth:</strong> Mọi logic Thắng/Thua, Gây sát thương, Kích hoạt bẫy <b>bắt buộc</b> phải được xác thực trên Server để chống Hack/Desync.<br>
|
||||
<strong style="color:#E0E0E0;">» Proxy Smoothing:</strong> Nội suy (Interpolate) chuyển động của Remote Players để bù đắp hiện tượng Jitter do Packet Loss.
|
||||
</div>
|
||||
</td>
|
||||
<td width="50%" style="padding:15px;background:rgba(176,38,255,0.02);border-bottom:2px solid #222;">
|
||||
<h3 style="margin:0 0 10px 0;color:#B026FF;"><img src="https://api.iconify.design/lucide/layers.svg?color=%23B026FF" width="20" style="vertical-align:middle;"> World & Perf <i>(Assigned to: Scove)</i></h3>
|
||||
<div style="font-size:13px;color:#AAA;line-height:1.6;">
|
||||
<strong style="color:#E0E0E0;">» Algorithmic Constraints:</strong> Thuật toán tạo hình mê cung phải bị giới hạn ở độ phức tạp <code>O(N)</code> hoặc <code>O(N log N)</code> tránh chặn luồng Main Thread.<br>
|
||||
<strong style="color:#E0E0E0;">» Draw Call Budget:</strong> Mesh mê cung sau khi sinh ra phải gộp (Static Batching / GPU Instancing) để giữ số lượng Draw Calls ở mức vi mô.<br>
|
||||
<strong style="color:#E0E0E0;">» Dynamic NavMesh:</strong> Bake tự động NavMesh <i>tại Runtime</i> sau khi chốt Seed mê cung, phục vụ AI Trapper hoặc kỹ năng đặc biệt.
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="50%" style="padding:15px;background:rgba(255,51,51,0.02);border-right:2px solid #222;">
|
||||
<h3 style="margin:0 0 10px 0;color:#FF3333;"><img src="https://api.iconify.design/lucide/swords.svg?color=%23FF3333" width="20" style="vertical-align:middle;"> Mechanics <i>(Assigned to: Tuấn)</i></h3>
|
||||
<div style="font-size:13px;color:#AAA;line-height:1.6;">
|
||||
<strong style="color:#E0E0E0;">» Deterministic Input:</strong> Polling Input phải được dời vào hàm <code>FixedUpdateNetwork</code> để đồng bộ hoàn hảo với Tickrate của Server.<br>
|
||||
<strong style="color:#E0E0E0;">» Physics Matrix:</strong> Quy hoạch chặt chẽ Layer Collision Matrix. Khuyến khích dùng Box/Capsule Colliders cho môi trường lắt léo để giảm tải CPU.<br>
|
||||
<strong style="color:#E0E0E0;">» FSM Integrity:</strong> Mỗi State trong Kinematic FSM là một Sandbox độc lập, nghiêm cấm tiêm/thay đổi biến (Mutate) chéo giữa các trạng thái.
|
||||
</div>
|
||||
</td>
|
||||
<td width="50%" style="padding:15px;background:rgba(255,215,0,0.02);">
|
||||
<h3 style="margin:0 0 10px 0;color:#FFD700;"><img src="https://api.iconify.design/lucide/palette.svg?color=%23FFD700" width="20" style="vertical-align:middle;"> Render & UX <i>(Assigned to: Tuấn)</i></h3>
|
||||
<div style="font-size:13px;color:#AAA;line-height:1.6;">
|
||||
<strong style="color:#E0E0E0;">» URP 6.0 Pipeline:</strong> Khai thác tối đa Render Graph của Unity 6 để tạo ra Light-baking & Shadow-mapping chân thực cao với chi phí thấp.<br>
|
||||
<strong style="color:#E0E0E0;">» Asset Compression:</strong> Chuẩn hóa mọi Texture về định dạng ASTC/DXT5. Polycount phải được kiểm duyệt khắt khe cho PC tầm trung.<br>
|
||||
<strong style="color:#E0E0E0;">» UX Consistency:</strong> Các phản hồi thị giác/thính giác (Máu me, Cảnh báo bẫy, Tiếng tim đập) phải đồng nhất về cường độ, tạo phản xạ có điều kiện cho User.
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -1,3 +1,5 @@
|
||||
<div id="folders"></div>
|
||||
|
||||
## <img src="https://api.iconify.design/lucide/folder-tree.svg?color=%2333CCFF" width="28" height="28" style="vertical-align: middle;"> Cấu trúc Thư mục (Workspace Architecture)
|
||||
|
||||
> Cấu trúc không gian làm việc của **BABA_YAGA** tuân thủ nghiêm ngặt mô hình **Quy chuẩn Công nghiệp (Standard Industry Practices)**. Sự phân tách rạch ròi giữa Dữ liệu tĩnh (Assets), Lõi Logic (Core Scripts) và Cấu hình hệ thống (Configs) đảm bảo khả năng mở rộng (Scalability) và triệt tiêu Conflict khi làm việc nhóm.
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
<div id="install"></div>
|
||||
|
||||
## <img src="https://api.iconify.design/lucide/terminal-square.svg?color=%2333CCFF" width="28" height="28" style="vertical-align: middle;"> Giao thức Triển khai (Deployment Protocol)
|
||||
|
||||
> Hướng dẫn thiết lập môi trường phát triển và kết nối mạng lưới cho **BABA_YAGA**. Khuyến nghị sử dụng công cụ **ParrelSync** để tối ưu hóa quy trình kiểm thử Multiplayer (Mô phỏng Host/Client) ngay trên một Editor duy nhất.
|
||||
@@ -63,7 +65,7 @@ git clone https://github.com/OnlyScove/BABA_YAGA.git
|
||||
|
||||
Nhấp vào Smart Bootstrapper (Nằm trên thanh Menu Top-bar của Unity) để tự động hóa quy trình tiêm (Inject) cấu hình Network Runner.
|
||||
|
||||
Nhấn nút Play <img src="https://api.iconify.design/lucide/play.svg?color=%2300FF55" width="14" style="vertical-align: middle;"> trong Editor.
|
||||
Nhấn nút Play <img src="https://api.iconify.design/lucide/play.svg?color=%2300FF55" width="14" style="vertical-align: middle;"> trong Editor.
|
||||
|
||||
Để test thực tế: Khuyến nghị Build ra file .exe độc lập, hoặc sử dụng hệ thống ParrelSync Clone Editor để chạy 2 Instances song song.
|
||||
|
||||
@@ -92,7 +94,7 @@ git clone https://github.com/OnlyScove/BABA_YAGA.git
|
||||
</a>
|
||||
</p>
|
||||
<br>
|
||||
<img src="https://scove-vault.duckdns.org/files/share/hARx-n28" alt="Network Visitors" style="border-radius: 4px; opacity: 0.8;">
|
||||
<img src="https://scove-vault.duckdns.org/files/api/public/dl/hARx-n28" alt="Network Visitors" style="border-radius: 4px; opacity: 0.8;">
|
||||
<br><br>
|
||||
<!-- SEPARATOR LINE -->
|
||||
<img src="https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/rainbow.png" width="80%" height="2px" style="filter: grayscale(100%) contrast(200%) sepia(100%) hue-rotate(300deg) saturate(500%);">
|
||||
|
||||
400
README.md
400
README.md
@@ -2,7 +2,7 @@
|
||||
|
||||
<!-- ANIMATED BANNER (Sử dụng SVG Pulse hoặc GIF) -->
|
||||
<p align="center">
|
||||
<img src="https://capsule-render.vercel.app/render?type=koding&color=000000&customColorList=10&text=BABA_YAGA&fontSize=80&animation=fadeIn&fontAlignY=40&fontColor=FF0000" alt="Animated Header" />
|
||||
<img src="https://scove-vault.duckdns.org/files/api/public/dl/S8eQwp-Y" alt="Animated Header" />
|
||||
</p>
|
||||
|
||||
### ⚡ THE ASYMMETRIC PSYCHOLOGICAL SURVIVAL ENGINE
|
||||
@@ -41,7 +41,7 @@
|
||||
## <img src="https://api.iconify.design/lucide/eye.svg?color=%23FF3333&flip=horizontal" width="28" height="28" style="vertical-align: middle;"> Tầm nhìn Dự án (Project Vision)
|
||||
|
||||
<div align="center">
|
||||
<img src="https://scove-vault.duckdns.org/files/share/vakALUeH" width="100%" style="border-radius: 10px; border: 1px solid #333;">
|
||||
<img src="https://scove-vault.duckdns.org/files/api/public/dl/vakALUeH" width="100%" style="border-radius: 10px; border: 1px solid #333;">
|
||||
</div>
|
||||
|
||||
> **BABA_YAGA** không chỉ là một trò chơi; nó là một thí nghiệm về sự cô lập. Dự án được xây dựng trên triết lý **"High-Stakes Hide & Seek"**, nơi mỗi giây im lặng đều mang trọng lượng ngàn cân.
|
||||
@@ -108,10 +108,12 @@
|
||||
|
||||
---
|
||||
|
||||
<div id="vision"></div>
|
||||
|
||||
## <img src="https://api.iconify.design/lucide/eye.svg?color=%23FF3333" width="28" height="28" style="vertical-align: middle;"> Tầm nhìn Dự án (Project Vision)
|
||||
|
||||
<div align="center">
|
||||
<img src="https://scove-vault.duckdns.org/files/share/vakALUeH" width="100%" style="border-radius: 12px; border: 1px solid #222; box-shadow: 0 4px 20px rgba(0,0,0,0.5);">
|
||||
<img src="https://scove-vault.duckdns.org/files/api/public/dl/SCjSqhKH" width="100%" style="border-radius: 12px; border: 1px solid #222; box-shadow: 0 4px 20px rgba(0,0,0,0.5); alt="Animated Header";>
|
||||
<br>
|
||||
<img src="https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/rainbow.png" width="100%" height="2px">
|
||||
</div>
|
||||
@@ -155,6 +157,8 @@
|
||||
|
||||
---
|
||||
|
||||
<div id="mechanics"></div>
|
||||
|
||||
## <img src="https://api.iconify.design/lucide/gamepad-2.svg?color=%2333CCFF" width="28" height="28" style="vertical-align: middle;"> 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.
|
||||
@@ -243,86 +247,79 @@
|
||||
|
||||
```mermaid
|
||||
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 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"]
|
||||
subgraph Initialization ["1. KHỞI TẠO HỆ THỐNG (NET-SYNC)"]
|
||||
A["🚀 Bắt đầu Trận đấu"] --> B{"🤝 Matchmaking\nPhoton Fusion"}
|
||||
B --> C["🎭 Phân vai: Seeker vs Trapper"]
|
||||
C --> D["🧩 Maze Generator\nPrims/Wilsons"]
|
||||
D --> E["🏛️ Baking NavMesh & Colliders"]
|
||||
E --> F["👤 Character Auto-Setup"]
|
||||
F --> G["📍 Spawn Players"]
|
||||
end
|
||||
class Initialization,A,B,C,D,E,F,G initStyle;
|
||||
class 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ế"]
|
||||
subgraph Active_Round ["2. VÒNG LẶP CHIẾN ĐẤU (CORE LOOP)"]
|
||||
G --> Loop(["⚙️ TICK: FixedUpdateNetwork"])
|
||||
|
||||
subgraph Seeker_Logic ["⚡ SEEKER - POV 1st Person"]
|
||||
S1["⌨️ Input: WASD/Space"] --> S2["🏃 State: Move/Dash"]
|
||||
S2 --> S3{"❓ Hành động?"}
|
||||
S3 -- "Sprinting" --> S4["🔊 Noise Up"]
|
||||
S3 -- "Sneaking" --> S5["🔇 Noise Down"]
|
||||
S3 -- "Flashlight" --> S6["🔦 Lộ vị trí"]
|
||||
S4 & S5 & S6 --> S_Check{"🔍 Check Env"}
|
||||
S_Check -- "Dẫm bẫy" --> S_Trap["⚠️ 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"}
|
||||
subgraph Trapper_Logic ["🔧 TRAPPER - Strategy View"]
|
||||
T1["🖱️ Mouse Input"] --> T2["🗺️ View: Heatmap/Cams"]
|
||||
T2 --> T3{"🔨 Kỹ năng?"}
|
||||
T3 -- "Đặt bẫy" --> T4["💾 Sync Trap"]
|
||||
T3 -- "Scan" --> T5["📡 Ping Seeker"]
|
||||
T3 -- "Lock" --> T6["🚪 Khóa cửa"]
|
||||
T4 & T5 & T6 --> T_Check{"👁️ 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>"]
|
||||
subgraph Network_Sync ["🌐 NETWORK SYNC LAYER"]
|
||||
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"]
|
||||
NS1 --> NS2["🔄 Server Reconciliation"]
|
||||
NS2 --> NS3["📦 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 S1,S2,S3,S4,S5,S6,S_Check seekerStyle;
|
||||
class T1,T2,T3,T4,T5,T6,T_Check trapperStyle;
|
||||
class 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"]
|
||||
subgraph Result_Logic ["3. KẾT THÚC & THƯỞNG"]
|
||||
S_Check -- "Chạm Exit" --> Win_S["🏆 SEEKER THẮNG"]
|
||||
T_Check -- "Bắt được Seeker" --> Win_T["🏆 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"]
|
||||
|
||||
Win_S & Win_T --> Post_Match["📊 Thống kê Match"]
|
||||
Post_Match --> Buff{"⚖️ Hệ thống Adaptive"}
|
||||
Buff -- "Thua liên tiếp" --> Buff_Apply["💎 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;
|
||||
class 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
|
||||
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
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
<div id="arch"></div>
|
||||
|
||||
## <img src="https://api.iconify.design/lucide/cpu.svg?color=%2333CCFF" width="28" height="28" style="vertical-align: middle;"> Kiến trúc Kỹ thuật (Technical Architecture)
|
||||
|
||||
> Hệ thống của **BABA_YAGA** được thiết kế theo chuẩn **Modular Architecture** (Kiến trúc Module), tách biệt hoàn toàn giữa logic xử lý vật lý (Kinematics), trạng thái mạng (Net-State) và phản hồi thị giác (Visual Feedbacks). Điều này đảm bảo hiệu năng cao (High Tickrate) ngay cả trong các môi trường mê cung phức tạp.
|
||||
@@ -339,83 +336,81 @@ Hệ thống điều khiển nhân vật cốt lõi được xây dựng trên m
|
||||
stateDiagram-v2
|
||||
direction TB
|
||||
|
||||
state "<img src='https://api.iconify.design/lucide/footprints.svg?color=%23FFD700' width='16' style='vertical-align: middle;'> KINEMATIC GROUND" as Ground {
|
||||
state "👣 KINEMATIC GROUND" as Ground {
|
||||
[*] --> Idle
|
||||
|
||||
|
||||
state Idle {
|
||||
I_P: <img src='https://api.iconify.design/lucide/anchor.svg?color=%23E0E0E0' width='16' style='vertical-align: middle;'> Vel < 0.1m/s
|
||||
I_C: <img src='https://api.iconify.design/lucide/activity.svg?color=%23E0E0E0' width='16' style='vertical-align: middle;'> Breathing Cam (0.5Hz)
|
||||
I_P: ⚓ Vel < 0.1m/s
|
||||
I_C: 📈 Breathing Cam (0.5Hz)
|
||||
}
|
||||
|
||||
Idle --> Moving : Input.mag > 0.1
|
||||
state Moving {
|
||||
M_P: <img src='https://api.iconify.design/lucide/move.svg?color=%23E0E0E0' width='16' style='vertical-align: middle;'> Speed 2-4m/s
|
||||
M_C: <img src='https://api.iconify.design/lucide/video.svg?color=%23E0E0E0' width='16' style='vertical-align: middle;'> Head Bob (1.2Hz)
|
||||
M_P: 🚶 Speed 2-4m/s
|
||||
M_C: 🎥 Head Bob (1.2Hz)
|
||||
}
|
||||
|
||||
Moving --> Sneaking : Hold [Sneak]
|
||||
state Sneaking {
|
||||
Sn_P: <img src='https://api.iconify.design/lucide/volume-x.svg?color=%2300FF55' width='16' style='vertical-align: middle;'> Acoustic Profile -50%
|
||||
Sn_C: <img src='https://api.iconify.design/lucide/arrow-down-to-line.svg?color=%23E0E0E0' width='16' style='vertical-align: middle;'> Collider Height ↓
|
||||
Sn_P: 🔇 Acoustic Profile -50%
|
||||
Sn_C: ⬇️ Collider Height Down
|
||||
}
|
||||
|
||||
Moving --> Sprinting : Hold [Sprint]
|
||||
Sneaking --> Moving : Release [Sneak]
|
||||
|
||||
|
||||
state Sprinting {
|
||||
Sp_P: <img src='https://api.iconify.design/lucide/zap.svg?color=%23FFD700' width='16' style='vertical-align: middle;'> Speed > 6.5m/s
|
||||
Sp_C: <img src='https://api.iconify.design/lucide/aperture.svg?color=%2333CCFF' width='16' style='vertical-align: middle;'> Dynamic FOV Warp
|
||||
Sp_P: ⚡ Speed > 6.5m/s
|
||||
Sp_C: 🔵 Dynamic FOV Warp
|
||||
}
|
||||
|
||||
Sprinting --> Moving : Stamina Depleted
|
||||
}
|
||||
|
||||
state "<img src='https://api.iconify.design/lucide/feather.svg?color=%2333CCFF' width='16' style='vertical-align: middle;'> AIRBORNE DYNAMICS" as Air {
|
||||
state "🪶 AIRBORNE DYNAMICS" as Air {
|
||||
state Jump {
|
||||
J_P: <img src='https://api.iconify.design/lucide/arrow-up-circle.svg?color=%23E0E0E0' width='16' style='vertical-align: middle;'> AddForce Up
|
||||
J_P: ⬆️ AddForce Up
|
||||
}
|
||||
state Falling {
|
||||
F_P: <img src='https://api.iconify.design/lucide/trending-down.svg?color=%23FF3333' width='16' style='vertical-align: middle;'> Gravity x1.5
|
||||
F_P: 📉 Gravity x1.5
|
||||
}
|
||||
state Landing {
|
||||
L_P: <img src='https://api.iconify.design/lucide/ruler.svg?color=%23E0E0E0' width='16' style='vertical-align: middle;'> Impact Raycast
|
||||
L_P: 📐 Impact Raycast
|
||||
}
|
||||
|
||||
Jump --> Falling : Vel.y < 0
|
||||
Falling --> Landing : KCC.IsGrounded == true
|
||||
}
|
||||
|
||||
state "<img src='https://api.iconify.design/lucide/crosshair.svg?color=%23FF3333' width='16' style='vertical-align: middle;'> UTILITY / ACTION" as Utility {
|
||||
state "🎯 UTILITY / ACTION" as Utility {
|
||||
state Dashing {
|
||||
D_P: <img src='https://api.iconify.design/lucide/wind.svg?color=%23FFD700' width='16' style='vertical-align: middle;'> Vector Burst (15m/s)
|
||||
D_P: 💨 Vector Burst (15m/s)
|
||||
}
|
||||
state Interacting {
|
||||
Int_P: <img src='https://api.iconify.design/lucide/lock.svg?color=%23FF3333' width='16' style='vertical-align: middle;'> Root Motion Lock
|
||||
Int_P: 🔒 Root Motion Lock
|
||||
}
|
||||
}
|
||||
|
||||
state "<img src='https://api.iconify.design/lucide/globe.svg?color=%2333CCFF' width='16' style='vertical-align: middle;'> NET-SYNC LAYER" as Net {
|
||||
state "🌐 NET-SYNC LAYER" as Net {
|
||||
state "Input Authority (Client)" as IA
|
||||
state "State Authority (Server)" as SA
|
||||
IA --> SA : Send Input Tick
|
||||
SA --> IA : Force Reconcile
|
||||
}
|
||||
|
||||
%% Main Transitions
|
||||
Ground --> Air : KCC.IsGrounded == false
|
||||
Air --> Ground : OnLandEvent.Fire()
|
||||
Ground --> Utility : InvokeAbility()
|
||||
Utility --> Ground : Action Complete
|
||||
|
||||
%% Sticky Notes for Technical Context
|
||||
note left of Ground
|
||||
<img src='https://api.iconify.design/lucide/database.svg?color=%23FFD700' width='14' style='vertical-align: middle;'> Sync: KCC Velocity
|
||||
<img src='https://api.iconify.design/lucide/layers.svg?color=%23E0E0E0' width='14' style='vertical-align: middle;'> State: Networked Enum
|
||||
💾 Sync: KCC Velocity
|
||||
🗂️ State: Networked Enum
|
||||
end note
|
||||
|
||||
note right of Net
|
||||
<img src='https://api.iconify.design/lucide/server-cog.svg?color=%2333CCFF' width='14' style='vertical-align: middle;'> Photon Fusion
|
||||
<img src='https://api.iconify.design/lucide/shield-check.svg?color=%2300FF55' width='14' style='vertical-align: middle;'> Anti-Cheat Validated
|
||||
⚙️ Photon Fusion
|
||||
🛡️ Anti-Cheat Validated
|
||||
end note
|
||||
```
|
||||
<br>
|
||||
@@ -435,7 +430,7 @@ Sử dụng kết hợp <code>Physics.OverlapSphereNonAlloc</code> để tối
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
```
|
||||
|
||||
|
||||
---
|
||||
|
||||
@@ -482,56 +477,54 @@ Sử dụng kết hợp <code>Physics.OverlapSphereNonAlloc</code> để tối
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
autonumber
|
||||
|
||||
%% Khai báo các thực thể
|
||||
participant IR as <img src='https://api.iconify.design/lucide/mouse-pointer-2.svg?color=%23FFD700' width='20' style='vertical-align: middle;'> Input
|
||||
participant CP as <img src='https://api.iconify.design/lucide/monitor.svg?color=%2333CCFF' width='20' style='vertical-align: middle;'> Local Client
|
||||
participant NT as <img src='https://api.iconify.design/lucide/router.svg?color=%23E0E0E0' width='20' style='vertical-align: middle;'> Fusion Net
|
||||
participant S as <img src='https://api.iconify.design/lucide/server.svg?color=%23FF3333' width='20' style='vertical-align: middle;'> Server Auth
|
||||
participant RP as <img src='https://api.iconify.design/lucide/ghost.svg?color=%23888888' width='20' style='vertical-align: middle;'> Proxies
|
||||
|
||||
%% --- GIAI ĐOẠN 1 ---
|
||||
Note over IR, CP: [PHASE 1] Data Sampling (Thu thập)
|
||||
IR->>CP: Hành động (Move / Ability / Interact)
|
||||
CP->>CP: Đóng gói NetworkInputStruct
|
||||
box rgba(51, 204, 255, 0.05) "⚡ LOCAL ENVIRONMENT (Client Auth)"
|
||||
participant IR as "🖱️ Input"
|
||||
participant CP as "💻 Local Player"
|
||||
end
|
||||
|
||||
%% --- GIAI ĐOẠN 2 ---
|
||||
Note over CP: [PHASE 2] Client Prediction (Dự đoán)
|
||||
CP->>CP: Thực thi Physics & Kinematics tức thì (Tick N)
|
||||
CP->>NT: Transmit Input Payload (Gửi lên mạng)
|
||||
box rgba(255, 51, 51, 0.05) "👑 SERVER ENVIRONMENT (State Auth)"
|
||||
participant NT as "📡 Network Layer"
|
||||
participant S as "🖥️ Server Tick"
|
||||
end
|
||||
|
||||
%% --- GIAI ĐOẠN 3 ---
|
||||
Note over NT, S: [PHASE 3] Server Validation (Xác thực)
|
||||
NT->>S: UDP Reliable Packet Delivery
|
||||
Note right of S: SERVER TICK SIMULATION
|
||||
S->>S: Validate Ruleset & Apply Physics State
|
||||
S-->>NT: Broadcast Global State Snapshot (Tick N)
|
||||
box rgba(255, 215, 0, 0.05) "👁️ REMOTE OBSERVERS"
|
||||
participant RP as "👥 Proxies"
|
||||
end
|
||||
|
||||
%% --- GIAI ĐOẠN 4 ---
|
||||
Note over NT, CP: [PHASE 4] Reconciliation (Điều chỉnh bù trừ)
|
||||
NT-->>CP: Nhận State Snapshot Feed
|
||||
Note over CP: ERROR CORRECTION PROTOCOL
|
||||
CP->>CP: Detect Desync -> Snap Transform -> Resimulate Ticks
|
||||
Note over IR,CP: [PHASE 1] DATA ACQUISITION
|
||||
IR->>CP: OnMove / OnAbility (Raw Input)
|
||||
CP->>CP: 📦 Pack NetworkInputStruct
|
||||
|
||||
%% --- GIAI ĐOẠN 5 ---
|
||||
Note over NT, RP: [PHASE 5] Proxy Update (Cập nhật thực thể bên thứ 3)
|
||||
NT-->>RP: Nhận State Snapshot Feed
|
||||
Note over RP: NETWORK INTERPOLATION
|
||||
RP->>RP: Lerp Position/Rotation (Bù nội suy mượt mà)
|
||||
Note over CP: [PHASE 2] FORWARD PREDICTION
|
||||
CP->>CP: ⚡ Run Local Kinematics (Tick N)
|
||||
CP->>NT: 📤 Transmit Input Payload
|
||||
|
||||
%% --- GIAI ĐOẠN 6 ---
|
||||
Note over CP, RP: [PHASE 6] Visual Render (Hiển thị)
|
||||
CP->>CP: Trigger Camera Shake / Local VFX
|
||||
RP->>RP: Cập nhật Animation Parameters & Mesh
|
||||
rect rgba(255, 51, 51, 0.1)
|
||||
Note over NT,S: [PHASE 3] SERVER VALIDATION (Simulation)
|
||||
NT->>S: Deliver UDP Packet
|
||||
S->>S: 🛡️ Validate Rules & Apply Physics
|
||||
S-->>NT: 📢 Broadcast State Snapshot (Tick N)
|
||||
end
|
||||
|
||||
<div align="right">
|
||||
<img src="https://api.iconify.design/lucide/activity-square.svg?color=%23555555" width="14" style="vertical-align: middle;">
|
||||
<small><i>Hệ thống được thiết lập chạy ở <b>60 Ticks/Second</b>, băng thông ước tính <b><10kb/s</b> mỗi Client.</i></small>
|
||||
</div>
|
||||
Note over NT,CP: [PHASE 4] RECONCILIATION PROTOCOL
|
||||
NT-->>CP: State Snapshot (Global Truth)
|
||||
CP->>CP: ⚖️ Check Desync (Threshold)
|
||||
CP->>CP: 🔄 Snap Pos & Resimulate if Error
|
||||
|
||||
Note over NT,RP: [PHASE 5] PROXY INTERPOLATION
|
||||
NT-->>RP: State Snapshot
|
||||
RP->>RP: 〰️ Lerp Position / Rotation Smoothly
|
||||
|
||||
Note over CP,RP: [PHASE 6] VISUAL RENDERING
|
||||
CP->>CP: 🎥 Update Local VFX / Camera Shake
|
||||
RP->>RP: 👻 Update Animator & Mesh Transforms
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
<div id="networking"></div>
|
||||
|
||||
## <img src="https://api.iconify.design/lucide/globe-2.svg?color=%2333CCFF" width="28" height="28" style="vertical-align: middle;"> Kiến trúc Netcode (Deterministic Networking)
|
||||
|
||||
<div align="center">
|
||||
@@ -566,56 +559,49 @@ sequenceDiagram
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
autonumber
|
||||
|
||||
%% Phân vùng không gian hệ thống (Sử dụng Box Grouping)
|
||||
|
||||
box rgba(51, 204, 255, 0.05) "⚡ LOCAL ENVIRONMENT (Client Auth)"
|
||||
participant IR as <img src='https://api.iconify.design/lucide/mouse-pointer-click.svg?color=%2333CCFF' width='20' style='vertical-align: middle;'> Input
|
||||
participant CP as <img src='https://api.iconify.design/lucide/cpu.svg?color=%2333CCFF' width='20' style='vertical-align: middle;'> Local Player
|
||||
participant IR as "🖱️ Input"
|
||||
participant CP as "💻 Local Player"
|
||||
end
|
||||
|
||||
|
||||
box rgba(255, 51, 51, 0.05) "👑 SERVER ENVIRONMENT (State Auth)"
|
||||
participant NT as <img src='https://api.iconify.design/lucide/router.svg?color=%23FF3333' width='20' style='vertical-align: middle;'> Network Layer
|
||||
participant S as <img src='https://api.iconify.design/lucide/server.svg?color=%23FF3333' width='20' style='vertical-align: middle;'> Server Tick
|
||||
participant NT as "📡 Network Layer"
|
||||
participant S as "🖥️ Server Tick"
|
||||
end
|
||||
|
||||
|
||||
box rgba(255, 215, 0, 0.05) "👁️ REMOTE OBSERVERS"
|
||||
participant RP as <img src='https://api.iconify.design/lucide/users.svg?color=%23FFD700' width='20' style='vertical-align: middle;'> Proxies
|
||||
participant RP as "👥 Proxies"
|
||||
end
|
||||
|
||||
%% --- GIAI ĐOẠN 1 ---
|
||||
Note over IR, CP: [PHASE 1] DATA ACQUISITION
|
||||
Note over IR,CP: [PHASE 1] DATA ACQUISITION
|
||||
IR->>CP: OnMove / OnAbility (Raw Input)
|
||||
CP->>CP: <img src='https://api.iconify.design/lucide/package-plus.svg?color=%2333CCFF' width='16' style='vertical-align: middle;'> Pack NetworkInputStruct
|
||||
CP->>CP: 📦 Pack NetworkInputStruct
|
||||
|
||||
%% --- GIAI ĐOẠN 2 ---
|
||||
Note over CP: [PHASE 2] FORWARD PREDICTION
|
||||
CP->>CP: <img src='https://api.iconify.design/lucide/zap.svg?color=%2333CCFF' width='16' style='vertical-align: middle;'> Run Local Kinematics (Tick N)
|
||||
CP->>NT: <img src='https://api.iconify.design/lucide/send.svg?color=%2333CCFF' width='16' style='vertical-align: middle;'> Transmit Input Payload
|
||||
|
||||
%% --- GIAI ĐOẠN 3 ---
|
||||
CP->>CP: ⚡ Run Local Kinematics (Tick N)
|
||||
CP->>NT: 📤 Transmit Input Payload
|
||||
|
||||
rect rgba(255, 51, 51, 0.1)
|
||||
Note over NT, S: [PHASE 3] SERVER VALIDATION (Simulation)
|
||||
Note over NT,S: [PHASE 3] SERVER VALIDATION (Simulation)
|
||||
NT->>S: Deliver UDP Packet
|
||||
S->>S: <img src='https://api.iconify.design/lucide/shield-alert.svg?color=%23FF3333' width='16' style='vertical-align: middle;'> Validate Rules & Apply Physics
|
||||
S-->>NT: <img src='https://api.iconify.design/lucide/broadcast.svg?color=%23FF3333' width='16' style='vertical-align: middle;'> Broadcast State Snapshot (Tick N)
|
||||
S->>S: 🛡️ Validate Rules & Apply Physics
|
||||
S-->>NT: 📢 Broadcast State Snapshot (Tick N)
|
||||
end
|
||||
|
||||
%% --- GIAI ĐOẠN 4 ---
|
||||
Note over NT, CP: [PHASE 4] RECONCILIATION PROTOCOL
|
||||
Note over NT,CP: [PHASE 4] RECONCILIATION PROTOCOL
|
||||
NT-->>CP: State Snapshot (Global Truth)
|
||||
CP->>CP: <img src='https://api.iconify.design/lucide/scale.svg?color=%23E0E0E0' width='16' style='vertical-align: middle;'> Check Desync (Threshold)
|
||||
CP->>CP: <img src='https://api.iconify.design/lucide/rotate-ccw.svg?color=%23FF3333' width='16' style='vertical-align: middle;'> Snap Pos & Resimulate if Error
|
||||
CP->>CP: ⚖️ Check Desync (Threshold)
|
||||
CP->>CP: 🔄 Snap Pos & Resimulate if Error
|
||||
|
||||
%% --- GIAI ĐOẠN 5 ---
|
||||
Note over NT, RP: [PHASE 5] PROXY INTERPOLATION
|
||||
Note over NT,RP: [PHASE 5] PROXY INTERPOLATION
|
||||
NT-->>RP: State Snapshot
|
||||
RP->>RP: <img src='https://api.iconify.design/lucide/spline.svg?color=%23FFD700' width='16' style='vertical-align: middle;'> Lerp Position / Rotation Smoothly
|
||||
|
||||
%% --- GIAI ĐOẠN 6 ---
|
||||
Note over CP, RP: [PHASE 6] VISUAL RENDERING
|
||||
CP->>CP: <img src='https://api.iconify.design/lucide/video.svg?color=%2333CCFF' width='16' style='vertical-align: middle;'> Update Local VFX / Camera Shake
|
||||
RP->>RP: <img src='https://api.iconify.design/lucide/ghost.svg?color=%23FFD700' width='16' style='vertical-align: middle;'> Update Animator & Mesh Transforms
|
||||
RP->>RP: 〰️ Lerp Position / Rotation Smoothly
|
||||
|
||||
Note over CP,RP: [PHASE 6] VISUAL RENDERING
|
||||
CP->>CP: 🎥 Update Local VFX / Camera Shake
|
||||
RP->>RP: 👻 Update Animator & Mesh Transforms
|
||||
```
|
||||
<br>
|
||||
<div align="center">
|
||||
<img src="https://api.iconify.design/lucide/shield-alert.svg?color=%23555555" width="16" style="vertical-align: middle;">
|
||||
@@ -625,6 +611,8 @@ sequenceDiagram
|
||||
|
||||
---
|
||||
|
||||
<div id="comeback"></div>
|
||||
|
||||
## <img src="https://api.iconify.design/lucide/scale.svg?color=%23FF3333" width="28" height="28" style="vertical-align: middle;"> Hệ thống Cân bằng Thích ứng (Tiered "Despair" Mechanics)
|
||||
|
||||
<div align="center">
|
||||
@@ -756,6 +744,8 @@ Khi Trapper để mất quyền kiểm soát, Mê cung sẽ tự động phân r
|
||||
|
||||
---
|
||||
|
||||
<div id="roadmap"></div>
|
||||
|
||||
## <img src="https://api.iconify.design/lucide/milestone.svg?color=%2333CCFF" width="28" height="28" style="vertical-align: middle;"> Lộ trình Triển khai (Development Roadmap)
|
||||
|
||||
> Tiến trình xây dựng kiến trúc **BABA_YAGA**. Dự án được phát triển theo mô hình Agile, ưu tiên hoàn thiện độ ổn định của lõi Netcode (Networking) trước khi mở rộng các module Meta-game và Visuals.
|
||||
@@ -954,67 +944,49 @@ Khi Trapper để mất quyền kiểm soát, Mê cung sẽ tự động phân r
|
||||
|
||||
<br>
|
||||
|
||||
<!-- BẢNG GRID 2x2 CHO TIÊU CHUẨN KỸ THUẬT -->
|
||||
<table width="100%" border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; border: none;">
|
||||
|
||||
<!-- HÀNG 1 -->
|
||||
<tr>
|
||||
<!-- CỘT 1: NETWORKING -->
|
||||
<td width="50%" style="padding: 15px; background: rgba(51,204,255,0.02); border-right: 2px solid #222; border-bottom: 2px solid #222;">
|
||||
<h3 style="margin: 0 0 10px 0; color: #33CCFF;">
|
||||
<img src="https://api.iconify.design/lucide/network.svg?color=%2333CCFF" width="20" style="vertical-align: middle;"> Net-Sync <i>(Assigned to: Duy)</i>
|
||||
</h3>
|
||||
<div style="font-size: 13px; color: #AAA; line-height: 1.6;">
|
||||
<strong style="color: #E0E0E0;">» RTT Optimization:</strong> Duy trì Round Trip Time < 150ms. Tối ưu kích thước Payload mạng qua <code>[Networked]</code> và <code>Reliable RPCs</code>.<br>
|
||||
<strong style="color: #E0E0E0;">» Absolute Server Auth:</strong> Mọi logic Thắng/Thua, Gây sát thương, Kích hoạt bẫy <b>bắt buộc</b> phải được xác thực trên Server để chống Hack/Desync.<br>
|
||||
<strong style="color: #E0E0E0;">» Proxy Smoothing:</strong> Nội suy (Interpolate) chuyển động của Remote Players để bù đắp hiện tượng Jitter do Packet Loss.
|
||||
</div>
|
||||
</td>
|
||||
|
||||
<!-- CỘT 2: WORLD GEN -->
|
||||
<td width="50%" style="padding: 15px; background: rgba(176,38,255,0.02); border-bottom: 2px solid #222;">
|
||||
<h3 style="margin: 0 0 10px 0; color: #B026FF;">
|
||||
<img src="https://api.iconify.design/lucide/layers.svg?color=%23B026FF" width="20" style="vertical-align: middle;"> World & Perf <i>(Assigned to: Scove)</i>
|
||||
</h3>
|
||||
<div style="font-size: 13px; color: #AAA; line-height: 1.6;">
|
||||
<strong style="color: #E0E0E0;">» Algorithmic Constraints:</strong> Thuật toán tạo hình mê cung phải bị giới hạn ở độ phức tạp <code>O(N)</code> hoặc <code>O(N log N)</code> tránh chặn luồng Main Thread.<br>
|
||||
<strong style="color: #E0E0E0;">» Draw Call Budget:</strong> Mesh mê cung sau khi sinh ra phải gộp (Static Batching / GPU Instancing) để giữ số lượng Draw Calls ở mức vi mô.<br>
|
||||
<strong style="color: #E0E0E0;">» Dynamic NavMesh:</strong> Bake tự động NavMesh <i>tại Runtime</i> sau khi chốt Seed mê cung, phục vụ AI Trapper hoặc kỹ năng đặc biệt.
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<!-- HÀNG 2 -->
|
||||
<tr>
|
||||
<!-- CỘT 3: GAMEPLAY -->
|
||||
<td width="50%" style="padding: 15px; background: rgba(255,51,51,0.02); border-right: 2px solid #222;">
|
||||
<h3 style="margin: 0 0 10px 0; color: #FF3333;">
|
||||
<img src="https://api.iconify.design/lucide/swords.svg?color=%23FF3333" width="20" style="vertical-align: middle;"> Mechanics <i>(Assigned to: Tuấn)</i>
|
||||
</h3>
|
||||
<div style="font-size: 13px; color: #AAA; line-height: 1.6;">
|
||||
<strong style="color: #E0E0E0;">» Deterministic Input:</strong> Polling Input phải được dời vào hàm <code>FixedUpdateNetwork</code> để đồng bộ hoàn hảo với Tickrate của Server.<br>
|
||||
<strong style="color: #E0E0E0;">» Physics Matrix:</strong> Quy hoạch chặt chẽ Layer Collision Matrix. Khuyến khích dùng Box/Capsule Colliders cho môi trường lắt léo để giảm tải CPU.<br>
|
||||
<strong style="color: #E0E0E0;">» FSM Integrity:</strong> Mỗi State trong Kinematic FSM là một Sandbox độc lập, nghiêm cấm tiêm/thay đổi biến (Mutate) chéo giữa các trạng thái.
|
||||
</div>
|
||||
</td>
|
||||
|
||||
<!-- CỘT 4: VISUALS -->
|
||||
<td width="50%" style="padding: 15px; background: rgba(255,215,0,0.02);">
|
||||
<h3 style="margin: 0 0 10px 0; color: #FFD700;">
|
||||
<img src="https://api.iconify.design/lucide/palette.svg?color=%23FFD700" width="20" style="vertical-align: middle;"> Render & UX <i>(Assigned to: Tuấn)</i>
|
||||
</h3>
|
||||
<div style="font-size: 13px; color: #AAA; line-height: 1.6;">
|
||||
<strong style="color: #E0E0E0;">» URP 6.0 Pipeline:</strong> Khai thác tối đa Render Graph của Unity 6 để tạo ra Light-baking & Shadow-mapping chân thực cao với chi phí thấp.<br>
|
||||
<strong style="color: #E0E0E0;">» Asset Compression:</strong> Chuẩn hóa mọi Texture về định dạng ASTC/DXT5. Polycount phải được kiểm duyệt khắt khe cho PC tầm trung.<br>
|
||||
<strong style="color: #E0E0E0;">» UX Consistency:</strong> Các phản hồi thị giác/thính giác (Máu me, Cảnh báo bẫy, Tiếng tim đập) phải đồng nhất về cường độ, tạo phản xạ có điều kiện cho User.
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<table width="100%" border="0" cellpadding="0" cellspacing="0" style="border-collapse:collapse;border:none;">
|
||||
<tr>
|
||||
<td width="50%" style="padding:15px;background:rgba(51,204,255,0.02);border-right:2px solid #222;border-bottom:2px solid #222;">
|
||||
<h3 style="margin:0 0 10px 0;color:#33CCFF;"><img src="https://api.iconify.design/lucide/network.svg?color=%2333CCFF" width="20" style="vertical-align:middle;"> Net-Sync <i>(Assigned to: Duy)</i></h3>
|
||||
<div style="font-size:13px;color:#AAA;line-height:1.6;">
|
||||
<strong style="color:#E0E0E0;">» RTT Optimization:</strong> Duy trì Round Trip Time < 150ms. Tối ưu kích thước Payload mạng qua <code>[Networked]</code> và <code>Reliable RPCs</code>.<br>
|
||||
<strong style="color:#E0E0E0;">» Absolute Server Auth:</strong> Mọi logic Thắng/Thua, Gây sát thương, Kích hoạt bẫy <b>bắt buộc</b> phải được xác thực trên Server để chống Hack/Desync.<br>
|
||||
<strong style="color:#E0E0E0;">» Proxy Smoothing:</strong> Nội suy (Interpolate) chuyển động của Remote Players để bù đắp hiện tượng Jitter do Packet Loss.
|
||||
</div>
|
||||
</td>
|
||||
<td width="50%" style="padding:15px;background:rgba(176,38,255,0.02);border-bottom:2px solid #222;">
|
||||
<h3 style="margin:0 0 10px 0;color:#B026FF;"><img src="https://api.iconify.design/lucide/layers.svg?color=%23B026FF" width="20" style="vertical-align:middle;"> World & Perf <i>(Assigned to: Scove)</i></h3>
|
||||
<div style="font-size:13px;color:#AAA;line-height:1.6;">
|
||||
<strong style="color:#E0E0E0;">» Algorithmic Constraints:</strong> Thuật toán tạo hình mê cung phải bị giới hạn ở độ phức tạp <code>O(N)</code> hoặc <code>O(N log N)</code> tránh chặn luồng Main Thread.<br>
|
||||
<strong style="color:#E0E0E0;">» Draw Call Budget:</strong> Mesh mê cung sau khi sinh ra phải gộp (Static Batching / GPU Instancing) để giữ số lượng Draw Calls ở mức vi mô.<br>
|
||||
<strong style="color:#E0E0E0;">» Dynamic NavMesh:</strong> Bake tự động NavMesh <i>tại Runtime</i> sau khi chốt Seed mê cung, phục vụ AI Trapper hoặc kỹ năng đặc biệt.
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width="50%" style="padding:15px;background:rgba(255,51,51,0.02);border-right:2px solid #222;">
|
||||
<h3 style="margin:0 0 10px 0;color:#FF3333;"><img src="https://api.iconify.design/lucide/swords.svg?color=%23FF3333" width="20" style="vertical-align:middle;"> Mechanics <i>(Assigned to: Tuấn)</i></h3>
|
||||
<div style="font-size:13px;color:#AAA;line-height:1.6;">
|
||||
<strong style="color:#E0E0E0;">» Deterministic Input:</strong> Polling Input phải được dời vào hàm <code>FixedUpdateNetwork</code> để đồng bộ hoàn hảo với Tickrate của Server.<br>
|
||||
<strong style="color:#E0E0E0;">» Physics Matrix:</strong> Quy hoạch chặt chẽ Layer Collision Matrix. Khuyến khích dùng Box/Capsule Colliders cho môi trường lắt léo để giảm tải CPU.<br>
|
||||
<strong style="color:#E0E0E0;">» FSM Integrity:</strong> Mỗi State trong Kinematic FSM là một Sandbox độc lập, nghiêm cấm tiêm/thay đổi biến (Mutate) chéo giữa các trạng thái.
|
||||
</div>
|
||||
</td>
|
||||
<td width="50%" style="padding:15px;background:rgba(255,215,0,0.02);">
|
||||
<h3 style="margin:0 0 10px 0;color:#FFD700;"><img src="https://api.iconify.design/lucide/palette.svg?color=%23FFD700" width="20" style="vertical-align:middle;"> Render & UX <i>(Assigned to: Tuấn)</i></h3>
|
||||
<div style="font-size:13px;color:#AAA;line-height:1.6;">
|
||||
<strong style="color:#E0E0E0;">» URP 6.0 Pipeline:</strong> Khai thác tối đa Render Graph của Unity 6 để tạo ra Light-baking & Shadow-mapping chân thực cao với chi phí thấp.<br>
|
||||
<strong style="color:#E0E0E0;">» Asset Compression:</strong> Chuẩn hóa mọi Texture về định dạng ASTC/DXT5. Polycount phải được kiểm duyệt khắt khe cho PC tầm trung.<br>
|
||||
<strong style="color:#E0E0E0;">» UX Consistency:</strong> Các phản hồi thị giác/thính giác (Máu me, Cảnh báo bẫy, Tiếng tim đập) phải đồng nhất về cường độ, tạo phản xạ có điều kiện cho User.
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
---
|
||||
|
||||
<div id="folders"></div>
|
||||
|
||||
## <img src="https://api.iconify.design/lucide/folder-tree.svg?color=%2333CCFF" width="28" height="28" style="vertical-align: middle;"> Cấu trúc Thư mục (Workspace Architecture)
|
||||
|
||||
> Cấu trúc không gian làm việc của **BABA_YAGA** tuân thủ nghiêm ngặt mô hình **Quy chuẩn Công nghiệp (Standard Industry Practices)**. Sự phân tách rạch ròi giữa Dữ liệu tĩnh (Assets), Lõi Logic (Core Scripts) và Cấu hình hệ thống (Configs) đảm bảo khả năng mở rộng (Scalability) và triệt tiêu Conflict khi làm việc nhóm.
|
||||
@@ -1111,6 +1083,8 @@ Khi Trapper để mất quyền kiểm soát, Mê cung sẽ tự động phân r
|
||||
|
||||
---
|
||||
|
||||
<div id="install"></div>
|
||||
|
||||
## <img src="https://api.iconify.design/lucide/terminal-square.svg?color=%2333CCFF" width="28" height="28" style="vertical-align: middle;"> Giao thức Triển khai (Deployment Protocol)
|
||||
|
||||
> Hướng dẫn thiết lập môi trường phát triển và kết nối mạng lưới cho **BABA_YAGA**. Khuyến nghị sử dụng công cụ **ParrelSync** để tối ưu hóa quy trình kiểm thử Multiplayer (Mô phỏng Host/Client) ngay trên một Editor duy nhất.
|
||||
@@ -1176,7 +1150,7 @@ git clone https://github.com/OnlyScove/BABA_YAGA.git
|
||||
|
||||
Nhấp vào Smart Bootstrapper (Nằm trên thanh Menu Top-bar của Unity) để tự động hóa quy trình tiêm (Inject) cấu hình Network Runner.
|
||||
|
||||
Nhấn nút Play <img src="https://api.iconify.design/lucide/play.svg?color=%2300FF55" width="14" style="vertical-align: middle;"> trong Editor.
|
||||
Nhấn nút Play <img src="https://api.iconify.design/lucide/play.svg?color=%2300FF55" width="14" style="vertical-align: middle;"> trong Editor.
|
||||
|
||||
Để test thực tế: Khuyến nghị Build ra file .exe độc lập, hoặc sử dụng hệ thống ParrelSync Clone Editor để chạy 2 Instances song song.
|
||||
|
||||
@@ -1205,7 +1179,7 @@ git clone https://github.com/OnlyScove/BABA_YAGA.git
|
||||
</a>
|
||||
</p>
|
||||
<br>
|
||||
<img src="https://scove-vault.duckdns.org/files/share/hARx-n28" alt="Network Visitors" style="border-radius: 4px; opacity: 0.8;">
|
||||
<img src="https://scove-vault.duckdns.org/files/api/public/dl/hARx-n28" alt="Network Visitors" style="border-radius: 4px; opacity: 0.8;">
|
||||
<br><br>
|
||||
<!-- SEPARATOR LINE -->
|
||||
<img src="https://raw.githubusercontent.com/andreasbm/readme/master/assets/lines/rainbow.png" width="80%" height="2px" style="filter: grayscale(100%) contrast(200%) sepia(100%) hue-rotate(300deg) saturate(500%);">
|
||||
|
||||
Reference in New Issue
Block a user