الباب الثاني: كيف يخزن النص – 2


رأينا في الباب السابق مع لعبة Harvest Moon FoMT أن نصوص الرسائل التي تظهر في صناديق الحوار

على شاشتها كانت، من بين كل الطرق الممكنة لاعطاء قيمة بايت ست عشرية لتقابل حرفا ما،

كانت تستعمل بالتحديد ترميز ASCII، أي A=41 و a=61 (41 بالست عشري طبعا، و هي تقابل 65 بالعشري).

أي أن المبرمج أراد تخزين النص الانكليزي مثلما تفعل برامج النصوص على الكمبيوتر.


لكن ماذا لو لم يحترم المبرمج هذه القواعد بتاتا، و أسند قيم هيكس لتقابل الحروف كما يشاء؟

فالمبرمجون عندما يصممون ألعابا تستعمل الحروف اليابانية، أو الحروف اللاتينية الأوروبية التي فوقها اشارات،

فترميز ASCII الذي يشمل فقط الحروف الانكليزية، لا يناسبهم بتاتا استعماله دون تغيير،

لأنه لا يحتوي هذه الرموز أصلا، و عددها كبير.

أحيانا أخرى، السبب يكون متعلقا بعوائق الجهاز نفسه.


لذلك، فمع هذه الألعاب، القيمة 41 الست عشرية ليست بالضرورة يقابلها الحرف A.

و لو نفتح برنامج الهيكس، بفتح الروم فقط دون فتح تيبل، أي بقيم ASCII،

و نحاول البحث عن النص، ستكون هذه الرسالة كل ما نجده


"لا وجود للكلمة التي بحثت عنها"


ماذا نفعل في هذه الحالات؟

سنحتاج أن نصنع جدول قيم الحروف، أو ما يعبر عليه بملف التيبل Table File.

هذا الملف في الواقع يمكننا أن نصنعه بأداة Notepad، و فقط نخزنه بصيغة .tbl بدل .txt في مجلد ما،

ثم نفتح ملف التيبل ذاك في الـ Windhex من Open Table File، بعد أن نكون قد فتحنا الروم سابقا.



شكل هذا الملف سيكون شيئا مشابها لهذه الصورة:



سيكون سلسلة أسطر لكل رموز اللعبة الممكنة، و بعض الأمور الأخرى (سنأتي على ذكرها)

كل سطر هو القيمة العددية للهيكس، متبوعا بـ "=" و الحرف أو الرمز الذي تمثله هذه القيمة.


ملف التيبل هذا هو ضرورة أكيدة لأي مشروع تعريب.

فهو الدليل الذي يمكن برنامج الهيكس من معرفة ماذا تعني البايتات الست عشرية

المستخدمة لتخزين النص.

و بدون هذا الدليل، فلا يمكننا قراءة النص، و بالتالي تعديله.


إذن يجب أن نصنع ملف التيبل هذا.

كيف نصنعه؟


أفتح النوتباد، أكتب أسطرا بكل قيمة و كل حرف يقابلها، اسجل الملف بصيغة GameName.tbl

الأمر يبدو بسيطا، و لكن!

السؤال تحديدا هو، كيف لي أن أعرف أي قيمة فكر بها المبرمج للحروف؟

كيف أعمر هذا التيبل، جدول قيم الحروف هذا؟


كل شخص لديه أسلوب تفكير خاص به.

لو خرج هذا الشخص عن ترميز ASCII الشائع الاستعمال،

أنا لنا أن نعرف أي قيمة فكر بها لكل حرف؟


في الواقع، في الباب الأول من الدرس، قمنا بالبحث عن كود غش يغير الحرف الأول من الإسم

الذي تختاره اللعبة في شاشة كتابة اسم اللاعب.

لو قمنا حينها بتجربة اسناد قيم مختلفة لذلك الحرف،

فإننا كنا نستطيع ايجاد كل الرموز الممكنة في اللعبة و قيمها!

و يكفي حينها أن نصنع ملف التيبل في برنامج النوتباد و نسجله بصيغة .tbl ببساطة.

تلك إحدى الطرق.

لكن...


ماذا لو كانت اللعبة لا يوجد فيها شاشة اختيار اسم؟

أو لو كانت قيم الحروف التي تستخدمها لشاشة الاسم مختلفة عن قيم الحروف وسط النص؟


هناك طريقة ثانية أسرع و أفضل. (لا يمنع أن لديها مساوئها مثل الأولى!)

أولا، سنفترض من باب حسن النية أن الحروف اللاتينية في اللعبة مرتبة في الترتيب الأبجدي الصحيح.

عندما نتعلم كيف نرى خطوط اللعبة، لن نفترض فحسب.

سنلقي نظرة عليها و نتأكد ان كانت مرتبة. كيف نراها؟ هذا الحديث سيأتي وقته.

من المهم جدا أن تكون الحروف من a الى z، و من A الى Z،

مرتبة بشكل صحيح (ABCDE…XYZ)،

و متتابعة بشكل مباشر (الحرف E قيمته تفوق بواحد قيمة D، و تفوق باثنين قيمة C مثلا)

كي تعمل هذه الطريقة أصلا.


هذه الطريقة الثانية تدعى البحث النسبي أو Relative Search.

و هي من أسرع الطرق لصنع ملف تيبل.


هناك عدة أدوات بحث نسبي، لصنع ملف تيبل.

يقال أن برنامج الهيكس WindHex يتيح هذا (تحت Search/Relative Search)

لكن برمجة البحث سيئة و ضعيفة المردود بالمقارنة مع أدوات أخرى. عندما تجربون، ستدركون ما أعنيه.

سنختار إذن أداة monkeymoore.

و التي يمكن تحميلها من هذا الرابط.

نقوم بفتح هذه الأداة اذن، و داخلها، نقوم بضغط الزر الأول تحت File و نختار روم اللعبة.



أه، على فكرة، نحن لم نختر لعبة جديدة كمثال لنا؟

أقترح إذن لعبة Drill Dozer للجيم بوي أدفانس.

إنها لعبة مستويات لطيفة جدا.

بالطبع، أي برنامج سنفتح به الروم من هنا فصاعدا

يتطلب أن تكون الروم ليست داخل ملف مضغوط مثل zip أو rar أو 7z أو ما شابه.


لنفتح الروم في محاكي مثل VBA-M و نفتح اللعبة قليلا،

كي نجد نصا ما نبجث عنه...



الكلمات DRILL DOZER، PRESS START، و Nintendo / GAME FREAK.inc

ليست نصوصا في الروم.

بل هي مخزنة على شكل صور جاهزة.

يمكن أن نجزم أن أغلب الكلام المكتوب بحروف و خطوط غريبة هو رسم جاهز.

سنتعلم كيف نغيره في الأبواب القادمة... ربما.



لكن هذا على الأرجح مخزن على شكل نص و ليس على شكل صورة.

من بين العلامات...

الحروف عندما تستعمل أكثر من مرة فانها ترسم بنفس الشكل.

الحروف أحيانا تظهر بالواحد بالواحد.

كل حوارات اللعبة شكل خطوطها هكذا.


هل توجد هناك حالات يكون فيها الكلام مخزنا على شكل صورة و يبدو هكذا؟

طبعا، ذلك ممكن جدا.
لعبة Wario Land 4 و Densetsu no Stafy 4 تخزن بعض الحوارات في شكل صور

جاهزة مسبقا. هي في اللعبة تظهر بالحرف بالحرف مثل الألعاب التي تستخدم النصوص،

لكن المظاهر خداعة.

و هناك ألعاب تخزن جميع الحوارات فيها على شكل صور.

لكن هذه طريقة غير رائجة كثيرا، لأن الصورة تستهلك مساحة أكثر من النص.

لا يمنع هذا أن هناك الكثير من المجانين الذين يفعلون العكس.

هذا مثال ثان على غرابة أساليب برمجة بعص الألعاب.


اذن وجدنا جملة نبحث عنها، و هي في حالتنا

Looks like we’re here!


نعود لشاشة برنامج البحث النسبي، monkeymoore، لنبدأ بحثنا.

كيف يعمل البحث النسبي؟


نفترض مثلا أن اللعبة فيها كلمة EGG و نحن نبحث عن هذه الكلمة هنا.

يقوم برنامج البحث النسبي بالبحث عن أي سلسلة 3 بايتات في الروم تكون قيمها كالتالي:


البايت الأول (الذي يقابل E) له قيمة ما (س) بالهيكس

البايت الثاني (الذي يقابل G) له قيمة (س+2) بالهيكس، نظرا أن G يأتي بعد E بمرتبتين.

البايت الثالث (الذي يقابل G) له نفس قيمة البايت الثاني.


و لو وجد برنامج البحث النسبي هذه البايتات بهذا الترتيب، سيستنتج قيم الحروف من A الى Z.

مثلا، قيمة A ستكون قيمة (س-4)، نظرا أن A مرتبتها في الأبجدية قبل E بأربعة مراتب.


طبعا، هذا يعني أمرين:

أن اللعبة يجب أن تكون حروفها مرتبة أبجديا، و قيمها مرتبة وفقا لذلك.

أن الكلام الذي سنبحث عنه لا يمكن أن يكون الا باستخدام الرموز a-z أو A-Z.

لكن ماذا لو لم يكن الأمر كذلك – طبعا هناك حلول أخرى. لكنها غير ممكنة الآن.


إذن، ففي الجملة التي لدينا

Looks like we’re here!

لا نستطيع أن ندرج في البحث عنها سوى الحروف الانكليزية فقط.

أي رموز أخرى، بما فيها علامات التنقيط، و حتى الفراغات بين الكلمات، ممنوعة.


كي نحسن نتائج البحث، يجب أن تكون الكلمة التي قمنا باختيارها

تخلط بين الحروف الكبيرة و الحروف الصغيرة.

أيضا، يمكننا كتابة الرموز الممنوعة، لكن فقط عندما نعوضها برمز متفق عليه، و هو النجمة هنا.


اذن، بعد أن فتحنا روم Drill Dozer،

نقوم باختيار Relative Search (البحث النسبي).

نكتب ما نريد البحث عنه في شاشة البحث:

Looks*like

نشغل Enable Wildcards و نتأكد أن الرمز أمامها هو (*).

هذا الرمز يعوض بايتا واحدا. و بهذه الطريقة نستطيع كتابة الرموز الممنوعة.


سنفترض أن حروف هذه اللعبة تتبع الترتيب الأبجدي العادي، أي

ABCDEFGHIJKLMNOPQRSTUVWXYZ

دون ثغرات أو نقصان أو زيادة أو اختلاف في الترتيب.

و نفس الشيء للحروف الصغيرة من a-z أيضا.

(كان علينا أن نتثبت و نقطع الشك باليقين، بتفحص صورة الخط، لكن لم نتعلم هذا بعد.)

لن نحتاج الى استخدام Define Character Set (تحديد ترتيب رموز جديد)

إذن، لذلك سنتركها لا تعمل. بل، من الضروري أن نتركها لا تعمل في حالتنا.



نضغط على الزر الذي عليه المجهر، أمام الكلمة التي نريد البحث عنها.

يبدأ البرنامج حينئذ عملية البحث...

و يقوم بإظهار النتائج.



لدينا عدة نتائج هنا، و كل واحدة تقترح قيم حروف مختلفة.

كيف نعرف ان كانت هذه القيم صحيحة أم لا؟

ببساطة، ننظر الى النص تحت Preview.

أي رمز ليس حرفا من A-Z a-z عوض بهذا #،

لكن ذلك لا يمنع أننا نستطيع التعرف على نصوص اللعبة و لو جزئيا

(أي اختيار لا يظهر لنا أجزاء من النص، نقوم مباشرة باستبعاده)


لكن هناك اختيارات لا تروقنا كثيرا.

في السطر الثاني مثلا، مع أنه استنتج قيم الحروف الصغيرة بشكل صحيح،

لكن هناك كلمة rill ozer، التي هي من المفروض أن تكون Drill Dozer

إذن قيم الحروف الكبيرة خاطئة.


في المقابل، فالسطر الأول يظهر كلمة The بشكل صحيح،

مع أننا كتبنا له فقط Looks*like في خانة البحث

و لا وجود لـ The فيما بحثنا عنه ما يعني أنه استنتج القيم الصحيحة للحروف الكبيرة

اضافة للحروف الصغيرة.


إذن، نضغط على السطر الأول من نتائج البحث بحيث يصبح لونه أزرق.

و هو السطر الذي يقترح القيم A=BB a=D5.

يمكننا أيضا أن ندون من الآن في ملاحظاتنا، العنوان تحت Offset،

أي 342520 (لا حاجة لنكتب 0x التي قبلها، و التي تعني ببساطة "عدد ست عشري")

لكي نذهب هناك مباشرة في برنامج الهيكس دون اضاعة الوقت في البحث عن النص.


بعد أن نضغط فوق السطر الصحيح في خانة النتائج (الأول في حالتنا)،

نقوم بصناعة ملف التيبل (جدول قيم الحروف) بالضغط فوق الزر Create Table.



نختار اسما لملف التيبل الجديد.

بما أن كل لعبة لديها تيبل خاص، لنختر اسما للملف فيه اسم اللعبة.

نضع في الترميز Unicode (UTF-8) و نسجل الملف.


و الآن، نفتح برنامج الهيكس Windhex.

نفتح ملف الروم بصيغة gba عبر File/Open File For Editing

نفتح ملف التيبل بصيغة tbl عبر File/Open Table File/Table 1


عنوان النص الذي كتبناه قبل قليل، كان 342520

نذهب الى Search/Goto Offset

نكتب ذلك العنوان في File Position.



الشاشة قد تبدو مخيفة قليلا، لكن يكفي أن نتأكد أننا نكتب عنوانا

على شكل عدد ست عشري (Hexadecimal)

و أن هذا العنوان محتسب بطريقة عادية (من الصفر فصاعدا) إذن PC/Linear.

نضغط Done.



لكن هناك مشكل...

التيبل الذي لدينا منقوص.

برنامج البحث النسبي وجد لنا فقط قيم A-Z a-z دون غيرها من الرموز.

و الباقي، في الواقع، يجب أن نعول على أنفسنا لإيجاده.


لنرى ماذا يظهر في اللعبة، و نحاول مقارنته بما عندنا.



كل النقاط في برنامج الهيكس هي للرموز المجهولة التي ليست في ملف التيبل.

سننقر فوقها واحدة واحدة و نرى ما هو البايت الذي يقابلها بأنفسنا.


سنبدأ برمز الفراغ بين الكلمات.

الفراغ بين كلمتي Looks و like، سنضع المؤشر فوق النقطة التي تعوضه.

المؤشر في خانة الهيكس المقابلة صار يشير الى القيمة 00



إذن، سنضيف الى ملف التيبل هذا السطر:

00=_


(الرمز "_" يعوض الفراغ، أنتم عوض كتابته ستكتبون فقط فراغا واحدا)

و لو لاحظنا فالبايت 00 هو أيضا يعوض المسافة بعد كلمة like.


هناك رمز الأبوستروف في كلمة were أيضا.

كي نعرف ما قيمته، ننقر فوق النقطة التي تعوضه.



إذن نضيف إلى ملف التيبل هذا السطر:

B4=’


نبحث الآن عن قيمة نقطة التعجب...



سنضيف إذن هذا السطر:

AB=!


هذه كل المعلومات التي استخرجناها من هذا السطر عن قيم الرموز الأخرى.

لو كانت لدينا صورة خط، لعرفنا الترتيب و ما هي الرموز في الخط.

لكن نحن لا نجيد ذلك بعد.


الآن هناك أسلوب ربما نستطيع القيام به، تجربة جميع القيم الممكنة.

و هو صنع نسخة احتياطية ثالثة من الروم نقوم بالذهاب الى عنوان النص هنا

فيها و نجري عليها أشنع الجرائم.


نقوم بتغيير جملة قصيرة من اللعبة، و نكتب في جزء الهيكس جميع القيم الممكنة، كي نجرب

الرموز بقيم 30، 31، 32، ... 39، 3A، 3B، 3C، 3D، 3E، 3F، 40، 41، 42... الى أن تنتهي الجملة.

ثم نرى كيف تظهر هذه الجملة في اللعبة، و الهدف هو اكتشاف الرموز التي تقابل قيم الهيكس تلك.

نعود و نجرب قيما أخرى... و هكذا..

إلى أن نعمر جدول التيبل بجميع القيم حتى الرموز نادرة الاستعمال!


(بالمناسبة لقد وضعت البايت المستعمل للعودة للسطر هنا في هذه الصور، و هو رمز تحكم،

و ذلك لترصيف الرموز في شكل سهل الفهم. ما معنى هذا؟ الجواب يأتي لاحقا)


على أية حال، نحن سنكون سلميين مع الروم الآن.

طبعا لاختصار مشقة التعرف على الرموز، تستطيعون عمل نسخة أخرى من الروم و استخدامها لتجربة كل الرموز

(تكتبون رموزا بقيم هيكس مجهولة مكان النص الذي يظهر في اللعبة)، على سبيل الترفيه.


أنا سأكون قنوعا الآن و سأكتفي بالرموز الثلاثة التي تعرفت عليها:

00=

B4=’

AB= !


(الأسود يعوض الفراغ)

و سأحاول اضافتها الى ملف التيبل الذي أعمل عليه.

عوض عمل Open With/Notepad لفتح ملف tbl فيه و اضافة هذه السطور، هناك حل آخر أسرع لنا الآن.

في WindHex هناك وظيفة لتغيير ملف التيبل مباشرة.



نذهب الى Tools ثم Table Editor (محرر ملف التيبل).


على فكرة لو لاحظتم فهناك أيضا Table Maker (صنع ملف التيبل)

و هي تسمح لنا بعمل ملف تيبل من الصفر لو أردنا.

لكن سيكون فارغا... على كل الاختيار موجود لمن يريد استعمال هذا.


إذن بعد ضغط Table Editor، تظهر لنا هذه النافذة:



مغزى وجود جدول الرموز الغريبة على اليمين، هو أن عددا لا بأس به من الألعاب

سيستعمل اللغة اليابانية في نصوصه و بالتالي سيحتاج الى تيبل نكتب فيه رموزا يابانية

و لذلك يعطيكم البرنامج كل تلك الأزرار الجميلة لكتابة اليابانية.


لكننا حاليا لا نترجم لعبة يابانية، و التيبل لدينا جاهز و به الحروف اللاتينية التي نحتاجها.

(بصراحة، Drill Dozer لا تزال تحتفظ بحروف يابانية في خطها، يعني أن التيبل عندنا ليس

كاملا طالما لم نضف تلك الرموز، لكن لم نتعب أنفسنا بها؟

الجواب: لا حاجة لنا لذلك الآن. مع ذلك، بما أن رموز العربية أكثر من 52، قد نحتاج بعضا من

هذه الرموز اليابانية لو أردنا عمل ترجمة عربية.)


نحن الآن بما أننا ننوي فقط عمل تيبل للانكليزية و علامات التنقيط، بدون الرموز اليابانية،

فان لوحة المفاتيح تكفي لنكتب ما نريد.


نحن نريد اضافة التالي:

00=

B4=’

AB= !

(الأسود هو فراغ)


في الخانة أمام Table Data نكتب التالي: 00 ثم = ثم فراغ ثم نضغط زر Enter

ثم مباشرة نحذف المكتوب (01=) و نكتب: B4 ثم = ثم (رمز الأبوستروف) ثم نضغط زر Enter

أخيرا نحذف المكتوب (B5=) و نكتب: AB ثم = ثم ! ثم نضغط زر Enter



قمنا بإضافة 3 أسطر للتيبل.

لو أخطأنا كتابة سطر، نضغط فوقه بزر الفأرة اليسار ثم نضغط الزر DEL أو SUPPR في لوح المفاتيح.


نسجل ملف التيبل من خلال Open/Save Table File، و نضغط "نعم".

و الآن نذهب إلى File/Exit لنغادر هذه النافذة و نعود لبرنامج الهيكس.

و النتيجة، أن النص صار مقروءا أفضل بكثير!


و الأهم، أن كتابة الفراغات صارت ممكنة.

في السابق كانت مستحيلة، لأن كتابة أي رمز في خانة النص ليس في التيبل هو ممنوع في برنامج الهيكس.

مازالت هناك الكثير من علامات التنقيط الممنوعة.

كي تصبح كتابتها ممكنة، يجب أن نكمل التيبل... لن نواصل ذلك بالتفصيل الممل لأن الفكرة مفهومة.


(نسيت إضافة B8، التي هي الفاصلة، على ما يبدو)


مازالت هناك بعض النقاط في النص.

لكن تلك النقاط لا تعوض رموزا مثل علامات التنقيط.

بل هي لا تظهر على الشاشة.

تلك النقاط هي رموز التحكم.

المغزى منها هو إعطاء أوامر للعبة كيف تتصرف.


مثلا، عندما تطلب منك اللعبة اسما للشخصية في أول اللعبة،

ثم تستعمله وسط الحوارات، فكل استعمال هو في الواقع داخل النص في الروم يقابله رمز تحكم خاص.

كذلك أسعار و أسماء الأغراض التي تجدها في الكنوز أو المتاجر، و تذكر في الحوارات.


نفس الشيء للعودة للسطر، سرعة النص، اغلاق النافذة، ألوان النص، صور الشخصيات....


لنبحث عن رموز التحكم، بما أنها ليست مرئية، و لا تعرف الا بتأثيرها،

فإننا سنراقب اللعبة كيف تتصرف كي نحدد هذه الرموز و مفعولها.

لنجرب اللعبة قليلا في البداية:




و بعد هذا ينتهي الحوار و تغلق النافذة.


لنلاحظ أن اللعبة تنتظر من اللاعب أن يضغط زرا كي تمر للنص التالي.

و أن مربع الحوار به حيز لثلاثة أسطر.

و أن هناك بعض أجزاء النص رسمت باللون الأحمر.


و لننظر لنافذة برنامج الهيكس من جديد:



هناك بايت يلفت الانتباه: FE



الصورة الأولى بها سطر واحد، و بعده اللعبة تنتظر اللاعب.

في الروم، بعد هذا السطر، يتكرر البايت FE ثلاثة مرات.

و بعده مباشرة يبدأ حوار الصورة الثانية.


إذن، فالبايتات FE FE FE هي المسؤولة عن كون اللعبة تنتظر اللاعب.



نمر للصورة الثانية:



الصورة الثانية بها 3 أسطر.

بعد نهاية كل سطر، يظهر البايت FE مرة واحدة.





إذن، فالبايت FE بحد ذاته هو بايت يأمر اللعبة عند اظهار النص بأمر العودة للسطر.

و إن كان في نهاية السطر الثالث في صندوق الحوار، فهو يأمر اللعبة بانتظار اللاعب كي يضغط زرا قبل مواصلة النص.


هناك ألعاب تضع رمز العودة للسطر وحده، و رمز انتظار الزر وحده.

و منها من يرمز إلى العودة للسطر الأول، أو الثاني، أو الثالث، برموز تحكم مختلفة.

الأمر عائد للمبرمج.


لنركز على الصورة الثانية:



كيف تفعل اللعبة لتكتب الكلمتين Red Diamond و Skullkers باللون الأحمر؟

لنعرف الإجابة، نبحث عن الكلمتين و كامل الحوار في برنامج الهيكس:



وضعنا في اطار أصفر البايتات FE التي ترمز للعودة للسطر بما أننا عرفنا معناها.

و لنجيب عن سؤالنا، سنضع الكلمات التي بالأحمر، أو بالأحرى نصها، في اطار أبيض.


نلاحظ أن هناك 6 بايتات (مجهولة، اذن تظهر 6 نقاط في خانة النص) قبل النص الأحمر، و 6 بايتات مختلفة بعده.

عندما ننظر للكلمة الحمراء الثانية، نجد أن هذه البايتات هي نفسها.

إذن، اكتشفنا رمز تحكم جديد طوله 6 بايتات (النينتندو لديها ولع سيء ببايتات التحكم الطويلة في ألعابها الحديثة):


FC 01 04 FC 03 05

رمز تحكم يأمر اللعبة بإظهار النص بعده باللون الأحمر.

FC 01 0B FC 03 0A

رمز تحكم يأمر اللعبة بإظهار النص بعده باللون الأسود (العادي).


على سبيل الملاحظة هذان السطران يبدوان نفس السطر بالضبط، فقط مع تغيير بايتين فقط.

ما يعني أنهما لهما علاقة باللون.

FC 01 04 FC 03 05

FC 01 0B FC 03 0A

و كذلك، كأن أحد البايتين الاثنين هو قيمة الآخر الست عشرية مع زيادة واحد، أليس كذلك.

لو غيرناهما، ربما نتحصل على نتائج... مثيرة، و نستكشف ألوانا ربما برمجتها لكن لم تستعملها نينتندو في النص.

لن نغيرهما. لا حاجة لنا (لكن يمكنكم عمل ذلك و تغيير اللعبة كما تريدون!)

نحن نحتاج فقط للأحمر و الأسود و ان وجدنا، لونا آخر مستعمل في اللعبة.


نمر الآن لهاتين الصورتين مثلا:



بعد ضغط الزر في هذه الصورة، ينتهي الحوار و تغلق النافذة.


لنبحث عن نصهما في الروم، سنجده أسفل النص الذي كنا نراه في نافذة الهيكس.



مع الملاحظة أن AD هي نقطة آخر الجملة، و B8 هي الفاصلة.

كما اكتشفنا سابقا، فالبايت FE هو رمز تحكم يمثل أمر العودة للسطر.


الآن نكتشف بايت تحكم آخر مهم و هو البايت FF.

هذا البايت هو أمر إنهاء الحوار.

في ظهوره الأول هنا، أمر اللعبة بإنهاء حوار غراتش ما ان يضغط اللاعب الزر.

و في ظهوره الثاني، أمر اللعبة بأنهاء حوار جيرمو ما ان يضغط اللاعب الزر.

هذا البايت مهم جدا لأنه من دونه لن ينتهي الحوار أبدا، و هذا لديه عواقب وخيمة طبعا على اللعبة.


لدينا عدد لا بأس به إذن من بايتات رموز التحكم لدينا.

لنفكر، عندما نكتب نصا، ما هي الرموز على لوحة المفاتيح التي لا نستعملها عادة؟

أول ما يخطر للذهن هي رموز مثل /#@$%^&|§ على سبيل الذكر لا الحصر.


تغيير بايتات التحكم يتطلب أن ننقر فوق خانة الهيكس كل مرة.

لم لا نبسط العملية؟

سنجعل الرمز / يمثل رمز التحكم الخاص بالعودة للسطر.

و رمز النهاية سيكون # مثلا.

هكذا ستكون كتابتهم أسهل بكثير.


نعود لمحرر ملف التيبل تحت Tools و Table Editor.

و كما تقدم ذكره، سنضيف السطرين التاليين لملف التيبل:

FE=/

FF=#

(تجنبوا النسخ من هنا، لأن ذلك سيضيف فراغات ستدمر مشروعكم.

أكتبوا هذه الرموز يدويا. جربوا أزرار لوحة المفاتيح فرادى، مع ، مع Ctrl+Alt...)

و نسجل التيبل.


(قمت باكمال بعض علامات التنقيط أيضا، حاولوا اضافتها أنتم أيضا)


هكذا صار لدينا نص ممتاز في الروم بدون أي نواح مجهولة.

و عندما نصل لهذه المرحلة نستطيع أن نبدأ التعديل على النص، و أهم شيء... التعريب.


جربوا الآن كتابة أي نص (بالانكليزي فقط طبعا) لتعويض النص الأصلي، ثم تسجيل الروم.

ثم نجرب كيف سيظهر أثناء عمل اللعبة.


بالمناسبة، يمكنكم نسخ نص من برنامج نصوص آخر الى داخل الروم هكذا:

نكتب نصا في برنامج نصوص آخر، و ننسخه.

نذهب إلى برنامج الهيكس، و ننقر فوق أول حرف يقابل البايت الذي ابتداء منه سنلزق النص.

ننقر بالزر الأيمن للفأرة، ثم Paste to Current Location (الزق هنا) ثم بما أننا نلزق نصا نضغط As Text.

لكن! هذه طريقة خطرة نوعا ما لأن النص الجديد لو كان أطول من الأصلي و تجاوزه ستتلف الروم،

و WindHex ليس لديه خاصية الغاء. اعملوا نسخا احتياطية للروم بصفة متواصلة!


لنعد لبرنامج البحث النسبي monkeymoore...

أنصحكم بتجربة لعبة Legend of Mystical Ninja و تغيير نصها هي الأخرى للتعود على الطريقة.


لكن هناك حالات أخرى، تخرج عن المألوف.

مثلا، لعبة Ducktales 2 للنيس.

أنصحكم بتحميل النسخة الأمريكية، لأن الفرنسية أو الألمانية فيها أسلوب آخر يصعب علينا المهمة أكثر و أكثر.

لنرى نصها اذن:



و الآن، لنبحث في المونكيمور عن كلمة UNCLE*SCROOGE في الروم.

أكيد أننا سنجد شيئا؟



... تبا.


رسالة "لا توجد نتائج" معناها شيء من ثلاثة:

جميع النصوص في الواقع صور جاهزة:

مستحيل على النيس (بسبب كثرة النصوص و صغر الكارتردج)

النص مشفر و مضغوط لحفظ المساحة:

مستبعد على النيس بسبب ضعف الجهاز (لكنه ممكن، و حصل في حالات)

الحروف غير مرتبة بالترتيب الأبجدي

هممم...


محاكي FCEUX يسمح لنا برؤية الذاكرة البصرية للنيس تحت PPU Viewer.

و من حسن حظنا أنه في حالتنا هذه تحديدا، اللعبة تشحن الخط في الرام.

ما يعني أنه يمكننا التثبت من ترتيب الحروف في الخط هكذا،

(لكن هذا حل خاص بهذه اللعبة فقط، و لا يصلح مع غيرها أو حتى غير النيس)

و النتيجة...



... مأساوية.

هذه عينة ثالثة من الجنون الذي يمكن أن تصادفه في طرق برمجة الألعاب.


كابكوم كانت تحارب القراصنة الصينيين و تحاربنا نحن معهم لمنع ترجمة هذه اللعبة؟

كابكوم كانت تجبر موظفيها بساعات العمل الشاقة على الإفراط في .. "المسكنات"؟

من يدري.


لكننا لن نستسلم بهذه السهولة... بعد.

سنركز على الجهة اليمنى للنافذة، و سنحاول كتابة ترتيب الحروف هنا، ابتداء من R.

و الترتيب هو:

RAWBaCbEcSGTHUIVLdMeOfPghijklDFJKNQXYZ


لماذا أضفت الحروف الصغيرة التي باللون الرمادي؟

لأنني يجب أن أضع مكان كل مربع به رسمة، حرفا/رمزا يعوض مرتبته.

و ذلك لأجل برنامج المونكي مور.


هذه المرة، سنعيد البحث، لكن مع تغيير بسيط.

سنفعل Define Character Set (تحديد ترتيب رموز جديد) و في الخانة أمامه سنكتب

بالضبط هذا الترتيب الذي نقلناه من نافذة رسوم الخط في الذاكرة البصرية للنيس.


و نبحث عن UNCLE*SCROOGE.

لن نجد شيئا.

لكن و نحن نحمل بقايا بصيص أمل أخير، نجرب مع SCROOGE فقط، و النتيجة...



و لو كتبنا UNCLE وحدها:



و هنا يتضح كل شيء.

نحن الآن تجاوزنا عقبة كون المبرمجين يرمون عرض الحائط أدنى مبادئ احترام الأبجدية،

و توصلنا بواسطة Define Character Set إلى تحديد قيم الحروف.

لكن المشكل هنا أن كابكوم تكرهنا.


علاوة على كون الحروف لا تحترم الترتيب الأبجدي، فإن النص مضغوط أيضا.

و ذلك بنية تقليص مساحة النص في الروم.

و لذلك لا نجد نتيجة لكلمة UNCLE*SCROOGE سابقا.


في حالتنا هذه، هذا النوع من الضغط هو بسيط، و هو على طريقة القاموس.

أي أن عددا كبيرا من الكلمات العادية مكتوب بشكل عادي في مكان ما في الروم

(ما يفسر رؤيتنا لكلمتي UNCLE و SCROOGE بوضوح. مرة وحيدة! في كامل الروم!!)

و ذلك الجزء من الروم يسمى القاموس.


لكن الجزء الذي يفترض أنه النص و فيه الجمل، لا يكتب تلك الكلمات كاملة،

بل يكتب فقط بايتا واحدا يعوض كلمة كاملة.

يمكن القول أن هذا البايت هو رمز تحكم، لو أردنا.

لأنه يأمر اللعبة بتعويضه بكلمة معينة من جزء القاموس.

و بهذه الطريقة تقوم اللعبة بتكوين نص كامل.


طريقة ضغط النص بالقاموس مستعملة بكثرة.

من بين أشهر الألعاب التي تستعملها، هناك الزلدا 3، الكرونو تريغر، و التيرانيغما، من بين ألعاب أخرى.

و هذه تستخدمها لتعويض كلمات تتردد بكثرة (مثل "هيرول" في زلدا، أو بعض الأفعال الشائعة).

سنرى عندما نحاول مع أمثلة من هذه الألعاب، كيف نضع كلمات القاموس في ملف التيبل.

لكن في حالة Ducktales 2، فان الشيء فاق حده.


ففي حين أن تلك الألعاب الاخرى كانت تستعمل كلمات القاموس من حين لآخر وسط نص واضح،

فإن هذه الحالة لم يبق منا شيء من هذا النص الواضع الذي به كلمات القاموس، الا علامات التنقيط!

و الأمر أسوء في النسخة الفرنسية من Ducktales 2 اذ أن القاموس يشفر أنصاف كلمات و يركبها ببعض.


هناك طرق ضغط نص أخرى، لكنها تطمس المعالم كليا.

أشهرها أنواع Lempel Zif (LZ) و تشفير هافمان (Huffman)، و RLE (أي Run Length Encoding).

و هناك طرق خاصة بجهاز بعينه أيضا (مثل Nemesis للميغادرايف).

جلها تعتمد على فكرة تعويض أي سلسلة بيتات متشابهة باختصار قصير

(كأنها مصطلح "الخ الخ كذا مرة" مطبقا على البيتات)، و هي أمور ربما نخوض فيها (لكن لا أضمن ذلك)



من لديه الصبر على لعبة مثل Ducktales 2 يستطيع لارضاء كبرياءه أن يعدل بعض كلمات القاموس كيفما استطاع.

أو حتى أن يغير النصوص التي تنادي على كلمات القاموس لو كان عنده صبر على تغيير البيتات.


...



نعود لصورة الخط.

الصورة التي بها رسوم الخط.

هي مهمة جدا لمعرفة ترتيب الرموز.

سواء للبحث النسبي عن قيم الحروف. أو اكمال التيبل.


كما أنها العقبة الأخيرة التي تحول بيننا و بين التعريب،

نظرا أننا نجيد الآن تغيير النصوص، و لم يبق لنا الا تغيير رسم الحروف لوضع رسم الحروف العربية،

وهكذا نستطيع تغيير النص للعربية و ليس انكليزي لانكليزي.


و ذلك سيكون ان شاء الله في الباب القادم.