Skip to content

استنتاجات البحث: كلا الحدين هيكليان ​

الحد الأقصى للاعبين عبر الإنترنت = 255 (قيود صارمة في عرض بت البروتوكول) ​

الموقعالمحتوى
src/network/network_type.h:21static const uint MAX_CLIENTS = 255;
src/network/network_type.h:54ClientPoolIDTag : 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:241network.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:25CompanyIDTag : PoolIDTraits<uint8_t, 0xF, 0xFF> → MAX_COMPANIES = CompanyID::End().base() = 15
src/tile_map.h:195SetTileOwner: SB(_m[tile].m1, 0, 5, owner.base()) —— مالك البلاطة يخزن فقط 5 بتات (الـ 5 بتات المنخفضة من _m[].m1)
src/company_type.h:30-33OWNER_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 هو الحد الأقصى. إذا كان قبول تكلفة التوافق ممكناً، فإن الخيارين ب/ج هما كما هو موضح أعلاه.