إن ترجمة الهواة للقصص المرئية القصيرة ، عند مقارنتها بترجمات الألعاب الأخرى ، لها عدد من الميزات وتتضمن العمل مع الكثير من النصوص. ربما تم إصدار الغالبية العظمى من الروايات البصرية باللغة اليابانية ، ولم يُترجم سوى عدد قليل منها إلى الإنجليزية (رسميًا أو بواسطة هواة) ، وتمت ترجمة عدد أقل إلى لغات أخرى.
لذلك ، عند العمل مع الترجمة ، يجب عليك التعامل مع المحركات اليابانية ، والعديد منها ليس مناسبًا جدًا للموطنين. وبسبب هذا ، فإنه يأتي بسرعة إلى إدراك أن وجود مهارات الترجمة ، ومعرفة اللغة ، والحماس الكبير ووقت الفراغ لا يعني أن النسخة المترجمة من اللعبة سترى النور قريبًا.
تقريبيًا جدًا ، تعني عملية ترجمة أي لعبة (وليس فقط القصص القصيرة المرئية):
- تفريغ موارد اللعبة (إذا لم تكن في المجال العام)
- ترجمة الأجزاء الضرورية
- نقل التعبئة العكسية
ومع ذلك ، في حالة القصص القصيرة البصرية اليابانية ، يبدو هذا عادةً كما يلي:
- تفريغ موارد اللعبة
- ترجمة جزء النص من اللعبة (نص البرنامج النصي)
- ترجمة الجزء الرسومي من اللعبة
- نقل التعبئة العكسية
- تعديل المحرك ليعمل مع المحتوى المترجم
آمل أن تكون تجربتنا مفيدة لشخص ما.
في عام 2013 (وربما قبل ذلك) قررت أن أترجم من اليابانية الرواية المرئية Bishoujo Mangekyou-Norowareshi Densetsu no Shoujo- (美 少女 万 華 鏡 - 呪 わ れ し 伝 説 の 少女 -). كانت لدي خبرة بالفعل في ترجمة الألعاب ، ولكن قبل أن أضطر إلى ترجمة القصص القصيرة فقط على محركات بسيطة ومعروفة مثل
Kirikiri .
هنا ، كان على فريق المترجمين لدينا فتح محرك هذه القصة القصيرة ، حتى قبل أن نصل إلى النص الفعلي نفسه.
لنبدأ بوصف لملف exe. حيث ورد ذكر الكلمات QLIE و IMOSURUME. يحتوي الملف نفسه على سطر FastMM Borland Edition 2004، 2005 Pierre le Riche ، مما يعني أن المحرك مكتوب على الأرجح في دلفي.
يكشف googling السريع أن Qlie هو اسم محرك الرواية المرئية الذي أصدرته Warmth Entertainment. يبدو أن IMOSURUME هو الاسم الداخلي لمحرك النص البرمجي ، و Qlie هو الاسم التجاري. يوجد موقع
qlie.net ، الذي يسرد الألعاب التي تم إصدارها على هذا المحرك والموقع الرسمي لـ Warmth Entertainment.
ولكن في أي مكان في المجال العام ، لا توجد أدوات رسمية للعمل مع المحرك ، ولا وثائق له ، وهو أمر متوقع.
لذلك ، يجب عليك التعامل مع اللعبة بنفسك ، بالاعتماد على المرافق غير الرسمية. بادئ ذي بدء ، يجب أن تجد جميع أجزاء اللعبة التي تحتاج إلى الترجمة.
توجد أرشيفات الألعاب في ملفات data0.pack و data1.pack و data7.pack في المجلد الفرعي \ GameData. توجد شاشات التوقف في المجلد \ GameData \ Movie ، ولكن لا يزال بإمكانك تركها بمفردها.
يظهر محرر hex أنه لا توجد رؤوس يمكن التعرف عليها لأرشيفات حزم اللعبة. ولكن في نهاية الملف توجد قطعة مشابهة لجدول المحتويات والملصق FilePackVer3.0
لحسن الحظ ، لهذا التنسيق ، هناك بالفعل فاتح حزم ولا حتى واحد. استخدمنا وحدة التحكم exfp3_v3 من asmodean.
التفريغ ليس سهلاً كما قد يبدو. نظرًا لأن المحرك يدعم العديد من تنسيقات الأرشيف (FilePackVer1.0 و FilePackVer1.0 و FilePackVer3.0) ، وفي هذه الحالة يتم استخدام FilePackVer3.0 ، وللفك الصحيح ، ستحتاج أيضًا إلى مفتاح ملف خاص key.fkey يقوم بتشفير الأرشيف. وهو موجود في المجلد الفرعي \ Dll
بالإضافة إلى ذلك ، يجب أن يوضح exfp3_v3 الأرشيف الذي يتم من خلاله تفريغ اللعبة.
لذلك ، تحتاج أيضًا إلى تحديد رقم اللعبة من القائمة التي اقترحها فاتح الحزم (توجد ألعاب سلسلة Bishoujo Mangekyou تحت الرقم 15) ، أو تحديد ملف اللعبة القابل للتنفيذ كمعلمة ثالثة لحزمة الحزم.
بالفعل بعد تفريغ ملفات اللعبة ، ظهرت فكرة منطقية: كيف في المستقبل كيف نعيد اللعبة بترجمة جاهزة؟ بعد كل شيء ، لا يدعم فاتح الحزم العملية العكسية.
بناءً على طلبنا ، أضاف w8m (شكرًا جزيلًا على ذلك) القدرة على حزم أرشيفات الألعاب في برنامج arc_conv.exe. يكفي حزم جميع الملفات التي تم تغييرها في أرشيف جديد (على سبيل المثال ، data8.pack) ، ووضعه في مجلد GameData ، وسيسحبون أنفسهم تلقائيًا إلى اللعبة.
العودة إلى الموارد غير المعبأة. يمكن العثور على ملفات البرنامج النصي للألعاب من أرشيف data0.pack في المجلد الفرعي \ السيناريو \ ks_01 \
يتم ترميز جميع ملفات البرامج النصية ذات الامتداد .s بعيدًا عن ترميز Shift Jis الأكثر ملاءمة ، ولا يدعم المحرك أي ترميزات unicode. تبدو خطوط الترجمة مثل هذه تقريبًا:
【キリエ】 %1_kiri1478% 「へえ……分かっているじゃない」 私が献上したロシアンティーを見て、キリエは嬉しそうに目を細める。 ^cface,,赤目微笑01 【キリエ】 %1_kiri1479% 「日本人は、ジャムを紅茶に入れて飲むのが、ロシアンティーだと勘違いしている人が多いのだけれど……」
قد تلاحظ أن كل عبارة باللغة اليابانية مسبوقة باسم البطل بين قوسين يابانيين. (【】) ، والتي تنطق هذه العبارة (في اللعبة يتم عرضها في أعلى النافذة مع النص). أو إذا كانت هذه هي كلمات المؤلف ، فلن تتم إضافة الاسم.
ولكن لا تزال هناك فرق خدمة.
إن أوامر المحرك في البرنامج النصي تذكرنا إلى حد ما بلغة ترميز TeX ، ولكنها أكثر بديهية وغير ملائمة مقارنة
بأوامر Kirikiri أو
RenPy .
هنا بعض منهم:
@@@
هو كلب ثلاثي. غالبًا ما تبدأ ملفات البرامج النصية بهذا الأمر. يبدو أن تحميل التعريفات من ملفات الطرف الثالث.
على سبيل المثال:
@@@Library\Avg\header.s
هو كلب مزدوج. التسمية في ملف البرنامج النصي. يمكنك التبديل إليه لاحقًا.
%1_kiri1478%
- تشغيل ملف الصوت. يتم إدراج هذه الأوامر بين اسم البطل والنص المعروض على الشاشة. "1_kiri1478" - في هذه الحالة ، اسم الملف من المجلد \ voice \ في ملف data1.pack من المثير للاهتمام أن يستخدم الفريق النسبة اليابانية (%) ، بدلاً من النسبة المعتادة.
^savedate, ^saveroute, ^savescene,
- ثلاثة فرق يتم استخدامها على الأرجح في نظام حفظ اللعبة ويجب إدخال معلومات عن المكان والوقت الذي تم فيه حفظ اللاعب في لعبة الحفظ.
على سبيل المثال:
^savedate,"現在" ^saveroute,"美少女万華鏡-1-" ^savescene,"呪われし伝説の少女 オープニング"
أي ، التاريخ: الحاضر ، الفرع: Bishoujo Mangekyou -1- ، المشهد: Norowareshi Densetsu no Shoujo Opening. كان يجب عرض هذه البيانات في فتحة الحفظ ، ولكن يبدو أن المطورين قرروا التخلي عنها. نتيجة لذلك ،
^saveroute
في جميع أجزاء البرنامج النصي ، و
^savedate
التغييرات من "اللحظة الحالية" إلى "الأحلام" ، وفي
^savescene
أيام اللعبة (أو بالأحرى الليالي).
^facewindow,
- حالة مربع النص مع النص المعروض على الشاشة. (تظهر - 1 أم لا - 0)
^sload,
- تشغيل أصوات داخل اللعبة من المجلد \ sound \ على القناة المقابلة.
sload,Env1,◆セミ01アブラゼミ
لعب السيكادا على Env1
يحتوي الفريق على معلمتين اختياريتين ، الأولى مسؤولة عن تكرار الصوت ، والثانية تظل غامضة ، ولكن نادرًا ما يتم استخدامها في اللعبة.
^sload,SE1,■クチュ音01,1
قراءة صوت الاسترجاع على القناة SE1.
^eeffect
- عرض تأثير خاص على الشاشة لعدد معين من الثواني. على ما يبدو ، فإنه يدعم الإخراج المتسلسل لعدة تأثيرات.
^eeffect,WhiteFlash
تأثير وميض أبيض.
^ffade
- تأثير الانتقال عند تغيير الشاشة.
يحتوي على مجموعة كاملة من المعلمات الإضافية ، ولكن القليل منها فقط مفيد حقًا: اسم تأثير الانتقال ، وصورة إضافية ، إذا لزم الأمر ، ووقت إكمال الانتقال.
^ffade,Overlap,,1000
تذويب صورة في أخرى ، في ثانية واحدة.
^iload
- قم بتحميل صورة الخلفية على الشاشة. يمكن تعيين الصورة معرف للإشارة إليها في المستقبل.
^iload,BG1,0_black.png
ملف الإخراج 0_black.png كخلفية بالمعرف BG1
^we
و
^wd
- قم بتشغيل وإيقاف الصورة في النافذة.
^facewindow,1
and
^facewindow,0
يقوم بتشغيل وإيقاف صورة البطل في مربع الحوار.
^mload
- تشغيل الموسيقى على قناة معينة.
^mload,BGM1,nbgm13
تشغيل المسار nbgm13 على قناة BGM1
من أهم الفرق:
\jmp
- الانتقال إلى التسمية بالاسم المحدد.
^select
- يعرض نافذة التحديد على الشاشة ، حيث يجب على اللاعب اختيار أحد الخيارات.
على سبيل المثال:
^select, , \jmp,"@@route01a"+ResultBtnInt[0] @@route01a0
هنا سيتم تنفيذ الانتقال بعد الإجابة على السؤال ، ويتم إرجاع رقم الرد (0 أو 1) من ResultBtnInt [0]. نتيجة لذلك ،
\jmp
القصة إلى التسميةroute01a + رقم الرد. أيroute01a0 أوroute01a1
ميزة غير سارة هي أن الفاصلة المعتادة في هذه الأوامر تعمل كفاصل ولا يمكن استخدامها في خيارات الإجابة نفسها. ليس لدى اليابانيين مثل هذه المشكلة ، فهم يستخدمون الفاصلة اليابانية (、). في هذه الحالة ، يمكننا استبدال الفاصلة بـ ‚(U + 201A SINGLE LOW-9 QUOTATION MARK).
على سبيل المثال:
^select, ‚ , ‚
الفرق المتبقية ليست مهمة في التقريب الأول.
بالطبع ، قبل ترجمة البرنامج النصي ، يجب عليك تحويله إلى شيء أكثر ملاءمة ، على سبيل المثال ، في UTF-8 ، لدمج الأحرف السيريلية واليابانية.
بعد تغيير المحرك (حول هذا الجزء التالي) ، تدرك اللعبة كلاً من النص الروسي والياباني. ولكن في الوقت الحالي ، من أجل التوافق ، تحتاج إلى ترميز الأحرف اليابانية في Shift Jis ، والحروف السيريلية في ترميز cp1251.
رسمنا بسرعة برنامجًا في Python لتحويل الشفرة مع مراعاة الأبجدية السيريلية:
UTF8 إلى cp1251 و ShiftJIS ومع ذلك ، كانت هناك بعض المشاكل. عند محاولة إعادة ترميز رمز "التلدة" U (U + FF5E FULLWIDTH TILDE) ، نتج عن خطأ "UnicodeEncodeError: لا يمكن لبرنامج ترميز" Shift Jis "ترميز الحرف" \ uff5e "في الموضع 0: تسلسل متعدد البايت غير قانوني"
في البداية ، أخطأت في Python ، ولكن في النهاية اكتشفت فارقًا بسيطًا إلى حد ما. هناك عدم يقين بين طرق ارتباط ترميزات Unicode وترميزات يابانية غير Unicode حسب التطبيق المحدد.
ونتيجة لذلك ، يربط Windows حرف Shift Jis برمز 0x8160 مع unicode ~ (U + FF5E FULLWIDTH TILDE) ، وترتبط أجهزة التحويل الأخرى (على سبيل المثال ، فائدة iconv) نفس الحرف مع 〜 (U + 301C WAVE DASH) ، وفقًا لجدول نسبة Unicode الرسمية ، وفقًا لجدول نسبة Unicode الرسمية -
ftp://ftp.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/SHIFT JIS.TXTلتحديد المراسلات بين الأحرف ، قررت Microsoft على ما يبدو استخدام المخططات من ترميز cp932 ، وهو إصدار موسع من Shift Jis.
يحدث نفس الموقف مع رمز الحرف 0x817C ، الذي تم ترميزه في UTF8 كـ - (U + FF0D FULLWIDTH HYPHEN-MINUS) على Windows ، أو - (U + 2212 MINUS SIGN) في iconv.
نظرًا لأن جميع ملفات البرامج النصية تم تحويلها أولاً من Shift Jis إلى UTF8 باستخدام Notepad ++ (ويستخدم جدول المراسلات المعتمد في Windows) ، عند التحويل مرة أخرى من UTF8 إلى Shift Jis من خلال برنامج Python ، ظهر خطأ التحويل سيئ السمعة.
لذلك ، كان من الضروري مراعاة حدوث separate و - شروط منفصلة.
كانت هناك عيوب طفيفة أخرى - على سبيل المثال ، تم حذف القطع الناقص (U + 2026 القطع الأفقي) بواسطة القطع الناقص السيريلي من cp1251 ، وليس اليابانيين من Shift Jis.
بعد ترجمة النص ، يمكنك المتابعة للعمل مع رسومات اللعبة.
توجد الملفات الرسومية للعبة في أرشيفات الحزمة نفسها ، ولكن بعد تفريغها ، لا يزال عليها العمل بجد. على سبيل المثال ، يتم تفريغ جميع صور png تقريبًا كملفات من نوع العينة + DPNG000 + x32y0.png بعبارة أخرى ، يتم قطع صور png إلى شرائح أفقية بسمك 88 سم ويتم كتابة كل شريط في ملف منفصل. يظهر اسم الملف الرقم التسلسلي للشريط (DPNG000 ... 009) وإحداثيات س ، ص.
ما زلت أتساءل لماذا كان هذا ضروريًا. إذا كان الأمر يتعلق بصعوبة نسخ الموارد من اللعبة ، فمن الواضح أن هذه ليست أفضل طريقة.
ولصق ملفات png المقطوعة ، تم إنشاء ملف نصي صغير merge_dpng على Pearl من asmodeus ، والذي يستخدم ImageMagick ، في وقت واحد. لسوء الحظ ، كانت هناك مشاكل معه. أولاً ، كنت بحاجة إلى بيرل ، الذي لم أستخدمه ، وحتى بعد تثبيته ، اتضح أن النص لم يكن يعمل بشكل صحيح.
لهذا السبب ، كتبنا برنامجًا مشابهًا في python:
يبدو أنه لدينا الآن مجموعة كاملة من الصور التي تظهر في اللعبة؟ لا على الإطلاق - إذا نظرت إلى جميع الصور المتصلة من جميع الأرشيفات ، فستجد أن بعضها مفقود ، على الرغم من وجوده في اللعبة. والحقيقة هي أن هناك نوعًا آخر من الملفات في المحرك - مع الامتداد .b. إنها جزء من الرسوم المتحركة مع الصور والأصوات المسجلة في الداخل.
من السهل جدًا الحصول على الموارد المخزنة في الداخل ، ولكن ، للأسف ، لم يعمل أي من فاتح حزم الملفات .b الجاهزة في حالتنا كما ينبغي. إما أن بعض الملفات بقيت بدون حزم ، أو كانت هناك أخطاء بسبب الأسماء اليابانية ، ولم أرغب في التمهيد من اللغة اليابانية.
هنا كان نص آخر مفيدًا. منذ ذلك الحين لم نكن على دراية بشيء مثل
Kaitai Struct ، كان علينا أن نتصرف من الصفر تقريبًا.
تبين أن تنسيق ملفات .b بسيط ، علاوة على ذلك ، كان مطلوبًا من فاتح الحزم لدينا أن يكون قادرًا على فك حزم الموارد من هذه اللعبة فقط. في ألعاب أخرى على محرك Qlie ، ظهرت أنواع إضافية من الموارد داخل ملفات .b ، لكننا لن نتحدث عنها بالتفصيل.
لذا ، افتح أي ملف .b في محرر سداسي وانظر إلى البداية. قبل التقييم ، لاحظ أن ترتيب البايت لجميع القيم الرقمية سيكون Little-endian.
- رأس ملف Abmp12
- عشرة بايت 0x00
- عنوان القسم الأول abdata12 بالمعلومات العامة.
- ثمانية بايت 0x00
- abdata12 مقطع المقطع ، عدد صحيح أربعة بايت. يمكنك تخطيه بأمان.
- رأس مقطع Abimage10
- سبعة بايت 0x00
- عدد الملفات في قسم ، عدد صحيح أحادي البايت. في هذه الحالة ، يوجد ملف واحد في القسم.
- عنوان المقطع abgimgdat13
- ستة بايت 0x00
- طول اسم الملف داخل القسم ، عدد صحيح ثنائي البايت. في هذه الحالة ، الطول 4 بايت.
- اسم الملف المشفر لـ Shift Jis
- طول سجل المجموع الاختباري للملف ، عدد صحيح مزدوج البايت.
- المجموع الاختباري للملف نفسه.
- يبدو أن البايت غير المعروف هو 0x03 أو 0x02
- اثنا عشر بايت غير معروفة ، ربما تتعلق بالرسوم المتحركة
- حجم ملف png داخل القسم هو عدد صحيح من أربعة بايت.
وأخيرًا ، ملف png نفسه.
قسم الغياب مشابه في التركيب.
يجب أن يقوم البرنامج النصي تلقائيًا بفك ضغط ملفات png و jpg و bmp و ogg و wav. ولكن بالإضافة إلى ذلك ، توجد ملفات imoavi غير معروفة أيضًا في الداخل.
خلاصة القول هي أنه في اللعبة يتم إنشاء جميع الرسوم المتحركة إما كفيديو كامل بتنسيق ogv ، أو كصور متحركة للمحرك يتم تسجيلها في ملفات .b ، أو كتسلسلات متحركة لملفات jpg بتنسيق imoavi.
في هذه الحالة ، كنا مهتمين أيضًا بصور jpg ، لذلك كان علينا التعامل معها أيضًا.
هناك قسمان في imoavi: الصوت والصورة. في المقطع MOVIE ، 47 بايت بعد الرأس ، هناك أربعة بايت من حجم ملف jpg. تتم كتابة الملفات الواحدة تلو الأخرى في شكلها الأصلي ، مفصولة بتسلسل 19 بايت ، حيث يتم تسجيل حجم الملف التالي.
لم يتم العثور على imoavi المعبر عنه في اللعبة ، لذلك قسم SOUND فارغ دائمًا.
حسنًا ، منذ أن بدأنا في سحب جميع موارد اللعبة ، في نفس الوقت تم كتابة نص صغير لسحب jpg من imoavi.
, , 1_タイトル画面ムービー.b imoavi.
.
, , . , , . , . .
- (, , ) : , , Renpy, ?
, , - , , .
?
.
:
bitbucketQlieShift JisShift Jis UTF-8exfp3_v3 asmodean