استنتاجات البحث: كلا الحدين هيكليان
الحد الأقصى للاعبين عبر الإنترنت = 255 (قيود صارمة في عرض بت البروتوكول)
| الموقع | المحتوى |
|---|---|
src/network/network_type.h:21 | static const uint MAX_CLIENTS = 255; |
src/network/network_type.h:54 | ClientPoolIDTag : PoolIDTraits<uint16_t, MAX_CLIENTS + 1, 0xFFFF> |
src/network/core/network_game_info.cpp | يتم إرسال clients_max / companies_max عبر Send_uint8 / Recv_uint8 في SerializeNetworkGameInfo (السطور 251-296) وإلغاء التسلسل (السطور 422-432) |
src/table/settings/network_settings.ini:241 | network.max_clients (SLE_UINT8، max = MAX_CLIENTS، الافتراضي 25) |
src/network/network_server.cpp:360 | التحقق من القبول _network_clients_connected < MAX_CLIENTS |
الاستنتاج: 255 هو بالفعل الحد الأقصى لحقل uint8 في البروتوكول. لتجاوزه، يجب تغيير الحقول ذات الصلة مثل clients_max إلى uint16——وهذا من شأنه تغيير بروتوكول client↔server عبر الإنترنت، وبث UDP، وبروتوكول منسق اللعبة (Game Coordinator)، وهو تغيير في البروتوكول الخارجي (يمكن تشغيله داخل fork مع رفع كلا الطرفين، لكن التوافق مع قائمة الخوادم العامة سيتأثر).
الحد الأقصى لعدد الشركات = 15 (قيود صارمة في تنسيق تخزين مالك البلاطة)
| الموقع | المحتوى |
|---|---|
src/company_type.h:25 | CompanyIDTag : PoolIDTraits<uint8_t, 0xF, 0xFF> → MAX_COMPANIES = CompanyID::End().base() = 15 |
src/tile_map.h:195 | SetTileOwner: SB(_m[tile].m1, 0, 5, owner.base()) —— مالك البلاطة يخزن فقط 5 بتات (الـ 5 بتات المنخفضة من _m[].m1) |
src/company_type.h:30-33 | OWNER_TOWN{0x0F}، OWNER_NONE{0x10}، OWNER_WATER{0x11}، OWNER_DEITY{0x12}، OWNER_END{0x13} تشارك نفس مساحة البايت مع معرف الشركة |
الاستنتاج: Owner و CompanyID هما نفس النوع، حقل ملكية البلاطة هو فقط 5 بتات (قيمة 0-31)، حيث 15-18 مشغولة بمالكين خاصين. لذلك الحد الفعلي للشركات هو 15 وهو محدد بتنسيق مصفوفة الخريطة——لتجاوزه، يجب توسيع تخزين مالك البلاطة (استخدام كامل 8 بتات m1 أو تغيير بنية _m) وترحيل ثوابت OWNER_*، مما يتطلب تحويل حفظ كامل وزيادة في ذاكرة الخريطة، وهو إعادة هيكلة كبيرة للتنسيق (وهذا هو السبب في أن OpenTTD العلوي لم يفعل ذلك لسنوات).
الخيارات الممكنة
| الخيار | التغيير | التوافق | الاقتراح |
|---|---|---|---|
| أ. الحفاظ على الوضع الحالي | لا شيء | حفظ/بروتوكول/منسق متوافق بالكامل | ✅ موصى به: 255 عميلاً / 15 شركة تتجاوز بكثير الإصدار الأصلي للتعدد |
| ب. العميل ← بروتوكول uint16 | تغيير تسلسل/إلغاء تسلسل network_game_info.cpp إلى Send_uint16/Recv_uint16؛ رفع MAX_CLIENTS إلى 4095؛ تغيير max_clients في network_settings.ini إلى SLE_UINT16؛ تغيير حقل settings_type.h إلى uint16؛ عرض console_cmds.cpp:1056 | قابل للتشغيل داخل fork؛ غير متوافق مع المنسق العام/العملاء القدامى | اختياري، إذا كان هناك حاجة فعلاً لأكثر من 255 عميلاً |
| ج. الشركة ← إعادة هيكلة تنسيق البلاطة | توسيع حقل مالك البلاطة + ترحيل ثوابت OWNER_* + تحويل حفظ كامل | تغيير تنسيق الحفظ (تحويل لمرة واحدة) | لا يُنصح بالتنفيذ على المدى القصير |
المحتوى الذي تم تسليمه
- وثيقة التصميم هذه (بما في ذلك مسارات/أرقام أسطر دقيقة)؛
- التصحيح الاختياري
option-clients-uint16.diff(التغيير الكامل للخيار ب، لم يُطبق، للمراجعة عبرgit apply).
الاستنتاج المسبق: "توسيع" كلا الحدين هو في الأساس ترقية تنسيق/بروتوكول وليس تعديل إعدادات؛ في ظل الحفاظ على توافق الحفظ والشبكة العامة، الحد الحالي 255/15 هو الحد الأقصى. إذا كان قبول تكلفة التوافق ممكناً، فإن الخيارين ب/ج هما كما هو موضح أعلاه.