تخطيط الدفعة الثالثة: نظام التمييز + نظام المخططات
وظيفتان عاليتا القيمة من cmclient تمت دراستهما بعمق، هذه الصفحة تسجل خطة النقل وتقييم حجم العمل.
أولاً: نظام التمييز على مستوى الكائن (cm_highlight، 2888 سطراً)
الوظيفة: عند تفعيل أداة البناء، يتم تمييز الكائنات التي سيتم بناؤها في الوقت الفعلي——معاينة دقيقة لـ 15 نوعاً من الكائنات: مسارات السكك الحديدية بأكملها، مناطق المحطات بالكامل، الطرق/مواقف السيارات، الإشارات، الجسور، الأنفاق، الأرصفة، المطارات، الصناعات، إلخ.
تبعيات النقل (vanilla API ← jrpm API):
| تبعية cmclient | المقابل في jrpm |
|---|---|
DrawSelectionSprite / SetSelectionTilesDirty / DrawTileSelectionRect / DrawAutorailSelection (داخل viewport.cpp) | موجودة لكن التوقيع مختلف (jgrpp أعاد هيكلتها)، تحتاج إلى محاذاة واحدة تلو الأخرى |
TileZoning (تلوين تقسيم المدن) | jrpm لا يوجد ← يجب إنشاؤه جديداً |
حالات عامة مثل _fn_mod | خاصة بـ cmclient ← يجب إعادة التصميم |
منشئو الكائنات ObjectTileHighlight::make_rail/road_stop/... | تعتمد على واجهة برمجة تطبيقات محطة NewGRF/الطريق، jrpm يختلف عن vanilla |
حجم العمل: حوالي 2–3 جولات (كل جولة 4–6 ساعات)، الصعوبة الأساسية في محاذاة خط رسم viewport.
ثانياً: نظام المخططات (cm_blueprint، 660 سطراً)
الوظيفة: تحديد منطقة ← تسجيل سلسلة أوامر البناء (سكك/محطات/أنفاق/جسور/إشارات) ← تخزين في 16 فتحة ← إعادة بناء بنقرة واحدة + تدوير.
تبعيات النقل:
| تبعية cmclient | المقابل في jrpm |
|---|---|
طبقة كائن الأوامر cm_commands.hpp (as_company / with_callback / set_auto / no_estimate + أكثر من 100 فئة أمر مولدة، 2251 سطراً) | jrpm لا يحتوي على هذا التجريد ← يجب نقله/إعادة كتابته أولاً |
حالة _station_gui في cm_station_gui.hpp | هيكل حالة واجهة المستخدم الرسومية للمحطة في jrpm مختلف |
المؤشر الذكي sp<Blueprint> | jrpm يمكنه استخدام std::shared_ptr |
اجتياز البلاطات BlueprintCopyArea | يعتمد على واجهات برمجة تطبيقات عامة مثل TileIndexDiffC (jrpm يمتلكها) |
حجم العمل: حوالي 2–3 جولات (بما في ذلك طبقة كائن الأوامر).
ثالثاً: ترتيب التنفيذ الموصى به
الخطوة 1: طبقة كائن الأوامر (تصميم cm_command_type، إعادة تنفيذ باستخدام jrpm's Command<T>::Do/Post)
—— الأساس المشترك للمخططات وإعادة تشغيل الأوامر (load_commands)
الخطوة 2: التمييز على مستوى الكائن (محاذاة خط viewport، نقل كائن تلو الآخر)
الخطوة 3: المخططات (نسخ/تدوير/فتحات/إعادة تشغيل)
الخطوة 4 (اختياري): إعادة تشغيل الأوامر (إعادة تشغيل اللعبة بالكامل lzma) + تقسيم المدن (growth_tiles، يتطلب تمديد الحفظ)ملاحظة مسبقة
هذه الوظائف الثلاث يبلغ مجموعها حوالي 5000+ سطراً، تمتد عبر ثلاث طبقات أساسية: نظام الأوامر/الحفظ/رسم viewport، وتعتمد على مجموعة من الطبقات الوسيطة التي لا يمتلكها jrpm (كائن الأوامر، ناقل الأحداث، تسلسل البتات). من الأفضل التقدم كمشاريع مستقلة خاصة——يوصى بالتنفيذ على دفعات، مع التجميع والتحقق عبر الشبكة بعد كل دفعة قبل الالتزام، لتجنب التغييرات الكبيرة لمرة واحدة التي قد تجعل تتبع الانحدار صعباً.