كما تم كتابة ألعاب Sega Saturn في عام 1995

هذه وثيقة كتبت في عام 1995 عندما كنت أعمل في أول لعبة لاستوديو Neversoft: Skeleton Warriors. كانت هذه هي اللعبة الأولى التي لم أستخدم فيها لغة التجميع 68K.

الصورة التي التقطت في كل وقت. مجموعة أدوات التطوير ("صندوق صغير" و ICE) على يميني.


حالة اللعبة


يصف المستند أدناه باختصار حالة رمز Skeleton Warriors لـ Sega Saturn ، ويذكر أيضًا بعض الجوانب الكثيرة التي لا يزال يتعين القيام بها.

كانت الوثيقة مطلوبة من أجل تسريع عملية إطلاع دان وكين وجيمس على الشفرة الجاهزة ، لتوضيح لهم الغرض من كل وحدة نمطية والتفاعل بينهما. لقد سمح لي أيضًا بتقدير الحالة المحزنة لهذا الرمز ، وآمل أن يكون ذلك قد دفعني إلى التفكير.

أتحدث أيضًا قليلاً عن تضمين البيانات (ملفات .GV و .GOB) في البرنامج وحول ما سنفعله في المستقبل.

معدات التطوير


نظامنا المستهدف هو Sega Saturn ، الذي يحتوي على معالجين صغيرين SH2 Risc وواحد 68000. وطالما أننا نستخدم المعالج الرئيسي SH2 الرئيسي فقط ، فسيتم استخدام العبد SH2 الإضافي عندما نتعرف على كيفية القيام بذلك. يستخدم 68000 للتحكم في رقاقة الصوت ، لم يكن لدينا لكتابة رمز لذلك ، لأنه سوف يستخدم مكتبة الصوت التي تقدمها Sega.

البرنامج مكتوب بالكامل تقريبًا بالكامل. نستخدم برنامج التحويل البرمجي GNU SH2 للحصول على مجمّع إخراج SH2. هناك العديد من الوحدات النمطية SH2 في التعليمات البرمجية ، والتي تحتوي أساسا على البيانات حصرا. حتى الآن لم أكتب أي شيء مفيد على SH2.

كنظام تطوير ، نستخدم PsyQ. هذا ليس نظام تطوير Sega قياسي ، لكن كل من عمل معه يعتبره الأفضل. بديل له هو SNASM ، التي أنشأتها Cross Products المملوكة من قبل Sega. يجب أن تعمل معظم نماذج الأكواد التي قدمتها Sega في نظام تطوير SNASM ، لكن يمكن تحويلها بسهولة إلى PsyQ.

يتكون نظام PsyQ من بطاقة واجهة SCSI ، المثبتة في الكمبيوتر الشخصي ، وهي عبارة عن خرطوشة تصل إلى Saturn وتوصل الكابل. يتم تجميع المصادر على جهاز كمبيوتر وتنزيلها إلى زحل ، حيث يبدأ البرنامج. رمز يمكن تصحيحه من جهاز الكمبيوتر.


نظام تطوير PsyQ

يتم التحكم في الاتصال بواسطة برنامج مقيم (PSYBIOS) ، والذي يعالج الاتصالات بين الأجهزة. يتيح ذلك لوحدة التحكم في Saturn تنزيل الملفات من جهاز الكمبيوتر بنفس الطريقة التي يتم بها تنزيلها من قرص مضغوط. نستخدم هذه الوظيفة لتنزيل الملفات من كل مستوى.

لديّ أدراج كبيرة وصاخبة في غرفتي ، وجهازي كمبيوتر آخر. أصغر الصندوقين هو E7000PC ، وهو محاكي مضمن SH2. يساعد في معرفة مكان تعطل البرنامج إذا لم يتوقف مصحح أخطاء PsyQ عن ذلك. إنه مفيد أيضًا لتتبع عمليات الكتابة على الذاكرة ، لكنني حتى الآن بالكاد استخدمت هذه الميزة.

والثاني من الأدراج الصاخبة هو ما يسمى "الصندوق الصغير" (أول "الصندوق الكبير" كان بحجم ثلاجة صغيرة). في جوهرها ، إنها زحل مع واجهات إضافية لجهاز E7000 ومحاكي الأقراص المضغوطة. على اللوحة الأمامية ، يحتوي على مفاتيح معرف الدولة ومفتاح بين PAL و NTSC.

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

صورة

طقم ديف سيجا نفسه

تجميع وربط


يتم التحكم في التجميع العام للبرنامج النهائي بواسطة ملف تعريف واحد: MAKEFILE.MAK. يحتوي على تبعيات وأهداف للمشروع بالكامل ، بما في ذلك تجميع ملفات .GOB و .GOV.

يتم تجميع الوحدات النمطية للتعليمات البرمجية المصدر الفردية (ملفات .C) بواسطة CCSH إلى وحدات كائن SH2 (.OBJ). تقوم أولاً باستدعاء المعالج المسبق GNU C المسمى CPPSH (الموجود في C: \ GNUSH2 \ BIN) ، ثم يستدعي CC1SH لإخراجه لإنشاء رمز المجمع SH2 ، وأخيراً يستدعي ASSH (في C: \ PSYQ) لبنائه في تنسيق الكائن النهائي.

لا نستخدم C ++ لأنه تم إخباري أنه ينشئ ملفات كائن ضخمة. ومع ذلك ، لم أعمل معه ، يمكنك تجربة.

يتم تجميع العديد من الملفات بلغة المجمّع SH2 (مع الامتداد .S) ببساطة باستخدام ASMSH مباشرةً في ملفات .OBJ (هذا ليس هو نفسه ASSH ، ولكن مجمّع الماكرو أكثر تعقيدًا). حاليًا ، يتم استخدامها فقط لتضمين البيانات ، ولا تحتوي على كود يعتمد على الآلة.

يتم تقسيم RAM زحل ، والتي يمكن تحميل الكود ، إلى كتلتين بسعة 1 ميغابايت. واحد يبدأ في 06000000 $ ، والآخر في 002،000،000 دولار. يتم استخدام الكتلة بمبلغ 200000 دولار حصريًا لتخزين الرسومات للشخصية الرئيسية. تتم كتابة رمز البرنامج على 06010000 دولار (يتم استخدام البايتات 10،000 دولار الأولى لمساحة النظام والمكدس وما شابه ذلك.)

يعتمد الرمز على الموضع ويتم تجميعه ليتم تشغيله على هذا العنوان المحدد (06010000 دولار) ولا شيء آخر.

يتم ربط ملفات .OBJ معًا باستخدام برنامج PSYLINK لإنشاء ملف MAIN.CPE ، وهو برنامج قابل للتنفيذ برأس صغير يمكن تنزيله إلى Saturn باستخدام الأمر RUN. يستخدم PSYLINK ملف TEST.LNK للإشارة إلى ملفات .OBJ المراد تضمينها ومكان وضعها.

معطيات


تنقسم اللعبة إلى عدة مستويات ، والعديد من المستويات تستخدم نفس البيانات ، لكنها تختلف في الأساس لكل مستوى. يتم جمع جميع البيانات لكل مستوى في ملفين ضخمين .GV و .GOB. (في حالة المنجم ، إنه MINE.GOV و MINE.GOB). يحتوي ملف GOV على رأس قصير ، ثم يأتي جميع البيانات التي يجب أن تكون في ذاكرة الفيديو. يحتوي ملف .GOB على جميع البيانات التي يجب أن تكون في ذاكرة الوصول العشوائي.

يتكون المستوى من جزء من ملفات البيانات الموضحة أدناه.

.SSQ - ملف المنظم العفريت
.SBM - ملف الصورة النقطية المستخدمة للخلفيات بت
.MAP - كلا الخرائط للخلفيات المليئة بالرموز.
.TIL - ألواح وألواح للخلفيات المليئة بالرموز.
.PTH - بيانات نقاط الطريق والمشغلات.
.TEX - القوام للطريق.

تم إنشاء ملفات .SSQ و .SBM بواسطة منظم تسلسل SEQ غير مريح بشكل متزايد. تم إنشاء ملفات .MAP و. TIL و .PTH و .TEX بواسطة Dan ، وهو محرر خرائط TULE رائع بشكل متزايد.

يتم تجميع هذه الملفات باستخدام أداة تجميع ASMSH في ملفات .GOV و .GOB المقابلة. لمعرفة كيف يتم ذلك ، راجع ملفات LEVEL.S و LEVEL1.S. يتضمن ملف .GOV أيضًا بعض البيانات في مستوى معين.

وحدات


الاختبارات - لا شيء خاص ، يحدد عددًا قليلاً من التسميات.

MAIN.C هو المستوى الأعلى للبرنامج. أنه يحتوي على تهيئة المعدات ، وإعدادات المستوى ، ورمز لتمرير المستويات ومختلف العناصر الصغيرة الأخرى التي ينبغي وضعها في الواقع في وحدات أكثر ملاءمة. هناك الكثير من النفايات ، لأنه من الأسهل إضافة شيء جديد إلى هذه الوحدة للاختبار السريع. يحتوي على رمز التمهيد من قرص مضغوط أو خادم ملفات على جهاز كمبيوتر. يحتوي على إشارة لتمكين أو تعطيل أشرطة الألوان TIMING.

GFXLIB.C - إجراءات مختلفة للوصول إلى المعدات وأداء وظائف الرسم المختلفة. كلها تقريبا مكتوبة من الصفر من قبل دان وغالبا ما تكون غير فعالة للغاية. إذا كنت تستخدم الإجراء غالبًا من هنا ، فسيكون من الجيد إلقاء نظرة على ما تقوم به وكتابة نسخة أسرع في الكود.

ومع ذلك ، تعمل جميع الوظائف وتوفر إطارًا ممتازًا للتنفيذ والاختبار التقريبيين. شكرا دان ، لم يكن ذلك ممكنا بدونه.

SMP_PAD.C - إجراءات مختلفة للقراءة من ذراع التحكم زحل ، تعتمد اعتمادا كبيرا على المعدات.

GLOBALS.C - جميع المتغيرات العالمية والعديد من الوظائف المشتركة. يعد استخدام المتغيرات العامة ممارسة برمجة مقبولة. ومع ذلك ، لأسباب مختلفة ، يكون تنفيذ المتغيرات العالمية في SH2 بطيئًا إلى حد ما ، لذلك مع مرور الوقت ، ربما سأحول الجزء إلى هياكل عالمية إذا لزم الأمر. يحتوي على متغيرات تصف حالة MAN و PATH .

MAN.C - يتعامل مع حركة وعرض شخص (Prince Lightstar أو Talyn أو Guardian أو Grimskull - الشخصية التي يسيطر عليها اللاعب). حتى الآن ، هذا هو أساسا منطق الحركة والاصطدامات مع الطريق. بالإضافة إلى ذلك ، توفر الرسوم المتحركة المناسبة لكل إجراء. لا يزال هناك الكثير من العمل الذي يتعين القيام به.

OB.C - يعالج حركة وعرض الكائنات في اللعبة ، وخاصة كائنات الأعداء ، على سبيل المثال ، محاربو الهياكل العظمية والأجانب الصغار. يتم برمجة الجزء الرئيسي من اللعبة هنا: العدو لمنظمة العفو الدولية ، والحركات الأساسية وإطلاق المشغلات. بنية البيانات ليست جاهزة بعد ، على وجه الخصوص ، مشاكل التصادم والرسوم المتحركة لم يتم حلها بالكامل. لا يزال هناك الكثير من العمل الذي يتعين القيام به.

DATA.S - جداول مختلفة ، حاليًا بشكل أساسي رسوم متحركة للشخصيات الرئيسية للاعب.

LAYER.C - خلفيات التمرير مع المنظر. تحديثات خلفيات الرموز والتمرير الصور النقطية. خطوط التمرير أيضًا (تأثير الموجة) في طبقة الضباب. حتى الآن ، يتم تخزين الجداول لطبقات خريطة الرموز دون ضغط. يجب أن يتم ضغطهم إلى تنسيق RLE الذي استخدمته لإصدار سفر التكوين. يمكن أن تنتقل هذه المهمة إلى Ken إذا حصلنا على نظام تطوير لـ Saturn في وقت مبكر عن Sony.

PAL.C - لوحة. يمكنك الاختيار من بين 2048 لونا. يمكن أن يكون أي بكسل على الشاشة أحد هذه الألوان. لقد قسمت اللوحة منطقيا إلى ثماني لوحات من 256 لونا. يحتوي PAL.C على رمز لتهيئتها وإعدادها ورمز لتغييرها الدوري. سوف يحتاجون أيضًا إلى التعتيم وتحول دوري أكثر تعقيدًا ، بالإضافة إلى ومضات من السطوع ، إلخ.

BUL.C هو نظام بدائي لمعالجة الأصداف (رمي السيف ، واللكم باليد ، والصواريخ التي تطلق من اليدين ، إلخ) كأشياء منفصلة. لا يزال الكثير من العمل مطلوبًا للاستخدام الأكثر تعقيدًا للأصداف. تحتاج أيضًا إلى رمز التصادم والرسوم المتحركة الصحيح.

PAD.C هي وحدة بسيطة لتخزين حالة عصا التحكم بتنسيق أكثر ملاءمة. يحفظ ما إذا كان الزر قد تم الضغط عليه مؤخرًا وما إذا كان يتم الضغط عليه الآن.

START.C - سطر واحد يحدد المستوى الذي سيكون الأول ، لسهولة تغييره في ملف الدُفعات.

PANEL.C - إجراءات بسيطة لسحب سلسلة من القوة.

PATH.C - إجراءات وحشية لرسم الطريق ، وكذلك التعامل مع التصادم مع الطريق.

MATH.C - جيب بسيط ، جيب تمام وتناوب نقطة بزاوية.

[تحديث] هنا هو رمز عينة من MAN.C. كل شيء مكتوب بشكل صارم في التعليمات البرمجية ويشير إلى بنية البيانات العالمية مان. مجموعة من الأرقام المكتوبة في الكود.

/**************************************************************/ /* Trigger jumping if needed, also variable height jump logic */ Man_JumpTrigger() { if ( Man.JumpFudge ) { Man.JumpFudge--; } if ( Man.Mode != M_Crouch || Man_StandingRoom() ) // ok if not crouched, or there is headroom { if (Pad_Jump->Pressed) /* jump button pressed */ { if ((Man.Contact || (Man.Mode == M_Hang) || Man.JumpFudge) && Pad_Jump->Triggered && !Man.Blocking) /* and not already jumping */ { if (Man.Mode == M_Hang && Pad1.Down.Pressed) { Man.Contact=0; Man.Mode=M_Jump; Man.AnimBase = LS_Jumping; /* Change base anim to jumping */ Man_TriggerSeq(LS_Jump); /* start the jumping start anim */ Man.YV.f = 0x10000; /* and have no YV */ Man.Yi += 4; /* and have no YV */ } else { Pad_Jump->Triggered = 0; if ( !JetPacCheat ) Man.YV.f = -0x00080000; /* Initial jump speed */ else Man.YV.f = -0x00008000; // Initial speed in Jetpac mode Man.Contact = 0; /* not on the ground any more */ Man.JumpTime = 0; /* just started jumping */ Man.AnimBase = LS_Jumping; /* Change base anim to jumping */ Man_TriggerSeq(LS_Jump); /* start the jumping start anim */ Man.XV.f+=Man.FlyVel; if (Man.HangEnd && Man.Mode == M_Hang) // if hanging { // and on the end of a path Man.HangEnd = 0; Man.Xi += 12*Man.Facing; // the move past end of path Man.JumpTime = -3; // bit more fixed v jump time } Man.Mode = M_Jump; /* change mode to jumping */ } } else /* Already jumping */ { if (Man.JumpTime++ < MaxJumpTime) /* Still in initial jump period */ Man.YV.f -= 0x0005000; /* So can maintain jump YV */ } } else /* jump button not pressed */ { Man.JumpTime = MaxJumpTime+1; /* so can't alter YV again until landed */ } } } 

نمت OB.C إلى ملف وحشي من 9000 خطوط ، والتي تشمل جميع أنماط سلوك الكائنات الفردية في اللعبة. يوجد أيضًا عدد كبير من الأرقام المكتوبة في الكود ، على سبيل المثال ، مثل:

 Drop_Arac(S_Ob *pOb) { int t; if (pOb->Jump==1) { pOb->yv.f+=0x7fff; pOb->y.f+=pOb->yv.f; t=Path_GetYZ(pOb->xi,pOb->yi,pOb)-15; if ((t>pOb->yi)&&(t<pOb->y.i+20)) { pOb->Jump=0; pOb->y.i+=15; Turn_Around(pOb); pOb->SeqFile=Sprites[SpriteMap[34]]; Object_TriggerSeq(Arac_JumpLand,pOb); } } else { if (pOb->Frame==16) pOb->Jump=1; if (pOb->AnimStat==AnimDone) { pOb->t1=0; pOb->Mode=&Pattern_Arac; } } Command_Arac(pOb); } 

مشهد غير سارة. جاء هذا النمط من التعليمات البرمجية من وقت كانت فيه الألعاب صغيرة جدًا وقمت بتطويرها عند العمل باستخدام 68K.

صورة

Source: https://habr.com/ru/post/ar459622/


All Articles