1995 में सेगा शनि के लिए खेल लिखे गए थे

यह एक दस्तावेज है जो मैंने 1995 में लिखा था जब मैं नेवरसॉफ्ट स्टूडियो के पहले गेम पर काम कर रहा था: कंकाल वारियर्स। यह पहला गेम था जिसमें मैंने 68K असेंबली लैंग्वेज का इस्तेमाल नहीं किया था।

समय के आसपास फोटो लिया गया। देव किट ("स्माल बॉक्स" और ICE) मेरे दायीं ओर है।


खेल राज्य


नीचे दिए गए दस्तावेज़ में सेगा सैटर्न के लिए कंकाल वारियर्स कोड की स्थिति का संक्षेप में वर्णन किया गया है, और इसमें कई पहलुओं का भी उल्लेख किया गया है जो अभी भी किए जाने की आवश्यकता है।

डैन, केन और जेम्स परिचित को तैयार करने के लिए दस्तावेज़ को तैयार करने की आवश्यकता थी, ताकि प्रत्येक मॉड्यूल के उद्देश्य और उनके बीच बातचीत के बारे में बताया जा सके। उन्होंने मुझे इस कोड की उदास स्थिति की सराहना करने की भी अनुमति दी, और, उम्मीद है, मुझे मन बना लिया।

मैं प्रोग्राम में डेटा (.GOV और .GOB फ़ाइलों) को एम्बेड करने के बारे में भी थोड़ी बात करता हूं और भविष्य में हम क्या करेंगे।

विकास उपकरण


हमारा लक्ष्य मंच सेगा शनि है, जिसमें दो SH2 Risc माइक्रोप्रोसेसर और एक 68000 हैं। जब तक हम केवल मास्टर SH2 मुख्य प्रोसेसर का उपयोग करते हैं, सहायक SH2 दास का उपयोग तब किया जाएगा जब हम यह पता लगाएंगे कि यह कैसे करना है। 68000 का उपयोग साउंड चिप को नियंत्रित करने के लिए किया जाता है, हमें इसके लिए कोड लिखने की आवश्यकता नहीं थी, क्योंकि यह सेगा द्वारा प्रदान किए गए साउंड लाइब्रेरी का उपयोग करेगा।

कार्यक्रम लगभग पूरी तरह से शुद्ध सी में लिखा गया है। हम SH2 आउटपुट असेंबलर प्राप्त करने के लिए GNU SH2 कंपाइलर का उपयोग करते हैं। कोड में कई SH2 मॉड्यूल हैं, जिनमें मुख्य रूप से विशेष रूप से डेटा शामिल हैं। अभी तक मैंने SH2 पर कुछ भी सार्थक नहीं लिखा है।

एक विकास प्रणाली के रूप में, हम PsyQ का उपयोग करते हैं। यह एक मानक सेगा विकास प्रणाली नहीं है, लेकिन हर कोई जो इसके साथ काम करता है वह इसे सबसे अच्छा मानता है। इसका एक विकल्प SNASM है, जिसे सेगा के स्वामित्व वाले क्रॉस प्रोडक्ट्स द्वारा बनाया गया है। सेगा द्वारा आपूर्ति किए गए अधिकांश कोड नमूने को एसएनएएसएम विकास प्रणाली में काम करना चाहिए, लेकिन इसे आसानी से PsyQ में परिवर्तित किया जा सकता है।

PsyQ प्रणाली में एक SCSI इंटरफ़ेस कार्ड होता है, जो PC में स्थापित होता है, एक कारतूस जो शनि में प्लग करता है और केबल को जोड़ता है। सूत्रों को एक पीसी पर संकलित किया जाता है और शनि पर डाउनलोड किया जाता है, जहां कार्यक्रम शुरू होता है। पीसी से कोड डीबग किया जा सकता है।


PsyQ विकास प्रणाली

संचार को एक निवासी कार्यक्रम (PSYBIOS) द्वारा नियंत्रित किया जाता है, जो मशीनों के बीच संचार की प्रक्रिया करता है। यह शनि कंसोल को एक पीसी से फाइलों को उसी तरह से डाउनलोड करने की अनुमति देता है, जिस तरह से यह उन्हें सीडी से डाउनलोड करता है। हम प्रत्येक स्तर की फ़ाइलों को डाउनलोड करने के लिए इस फ़ंक्शन का उपयोग करते हैं।

मेरे कमरे में बड़े और जोर से दराज के एक जोड़े हैं, और दो और पीसी। दो बॉक्स में से छोटा E7000PC है, जो एक अंतर्निहित SH2 एमुलेटर है। यह पता लगाने में मदद करता है कि जहां PsyQ डिबगर इसे बंद नहीं करता है तो प्रोग्राम क्रैश हो जाता है। यह मेमोरी को लिखने के लिए ट्रैकिंग के लिए भी उपयोगी है, लेकिन अभी तक मैंने शायद ही इस सुविधा का उपयोग किया हो।

ज़ोर से खींचने वालों में से कुछ को "छोटा बॉक्स" कहा जाता है (पहला "बड़ा बॉक्स" एक छोटे रेफ्रिजरेटर के आकार के बारे में था)। संक्षेप में, यह E7000 और सीडी एमुलेटर के लिए अतिरिक्त इंटरफेस के साथ शनि है। फ्रंट पैनल पर, यह देश आईडी स्विच और PAL और NTSC के बीच एक स्विच है।

दूसरे कंप्यूटर के अंदर एक सीडी एमुलेटर है - एक बड़ा बोर्ड, जिसके लिए कंप्यूटर की हार्ड ड्राइव सीडी ड्राइव होने का दिखावा करती है। आप इसमें एक सीडी इमेज एकत्र कर सकते हैं और वास्तविक समय में इसका अनुकरण कर सकते हैं कि यह देखने के लिए कि वास्तविक सीडी में गेम कैसे दिखाई देगा। एमुलेटर अधिक या कम काम करता है, हालांकि इसमें कुछ समस्याएं हैं जो हम सेगा के साथ मिलकर काम कर रहे हैं।

छवि

सेगा की देव किट ही

संकलन और लिंकिंग


समाप्त कार्यक्रम की सामान्य असेंबली को एक मेकफाइल द्वारा नियंत्रित किया जाता है: MAKEFILE.MAK। इसमें संपूर्ण प्रोजेक्ट के लिए निर्भरता और लक्ष्य शामिल हैं, जिसमें संकलन .GOB और .GOV फाइलें शामिल हैं।

CCSH द्वारा SH2 ऑब्जेक्ट मॉड्यूल (.OBJ) में व्यक्तिगत C स्रोत कोड मॉड्यूल (.C फाइलें) संकलित किए जाते हैं। यह पहले GNPS C प्रीप्रोसेसर को CPPSH (C: \ GNUSH2 \ BIN में स्थित) कहता है, फिर इसके उत्पादन के लिए CC1SH को SH2 कोडांतरक कोड बनाता है, और अंत में इसे बनाने के लिए ASSH (C: PSYQ में) कॉल करता है। समाप्त वस्तु प्रारूप में।

हम C ++ का उपयोग नहीं करते हैं क्योंकि मुझे बताया गया था कि यह विशाल ऑब्जेक्ट फ़ाइलों को बनाता है। हालांकि, मैंने उसके साथ काम नहीं किया, आप प्रयोग कर सकते हैं।

SH2 कोडांतरक भाषा में कई फाइलें (एक्सटेंशन के साथ .S) को सीधे ASOBH .OBJ फाइलों का उपयोग करके एकत्र किया जाता है (यह ASSH के समान नहीं है, लेकिन एक अधिक जटिल मैक्रो कोडांतरक है)। वर्तमान में, उनका उपयोग केवल डेटा एम्बेड करने के लिए किया जाता है, और मशीन पर निर्भर कोड नहीं होता है।

सैटर्न रैम, जिसमें कोड लोड किया जा सकता है, को दो 1 एमबी ब्लॉकों में विभाजित किया गया है। एक $ 06,000,000 से शुरू होता है, और दूसरा $ 002,000,000 से। $ 00,200,000 का ब्लॉक मुख्य चरित्र के ग्राफिक्स के भंडारण के लिए विशेष रूप से उपयोग किया जाता है। कार्यक्रम कोड $ 06010000 पर लिखा गया है (सिस्टम स्पेस, स्टैक और जैसे के लिए पहले $ 10,000 बाइट्स का उपयोग किया जाता है।)

कोड स्थिति-निर्भर है और इस विशिष्ट पते ($ 06010000) पर चलाने के लिए संकलित है और कुछ नहीं।

.OBJ फाइलें MAIN.CPE फ़ाइल के लिए PSYLINK प्रोग्राम का उपयोग करके एक साथ लिंक किए गए हैं, जो एक छोटे से हेडर के साथ एक निष्पादन योग्य प्रोग्राम है जिसे RUN कमांड के साथ शनि में डाउनलोड किया जा सकता है। PSYLINK TEST.LNK फ़ाइल का उपयोग यह इंगित करने के लिए करती है कि .OBJ फ़ाइलों को शामिल करने के लिए और उन्हें कहाँ रखा जाए।

डेटा


खेल को कई स्तरों में विभाजित किया गया है, कई स्तर समान डेटा का उपयोग करते हैं, लेकिन मूल रूप से वे प्रत्येक स्तर के लिए भिन्न होते हैं। प्रत्येक स्तर के लिए सभी डेटा को दो विशाल .GOV और .GOB फ़ाइलों में एकत्र किया जाता है। (एक खदान के मामले में, यह MINE.GOV और MINE.GOB है)। GOV फ़ाइल में एक छोटा हेडर होता है, और फिर वह सभी डेटा आता है जो वीडियो मेमोरी में होना चाहिए। .GOB फ़ाइल में वह सभी डेटा होता है जो RAM में होना चाहिए।

स्तर में नीचे दिखाए गए डेटा फ़ाइलों के एक हिस्से शामिल हैं।

.SSQ - स्प्राइट सीक्वेंसर फाइल
.SBM - बिटमैप फ़ाइल का उपयोग बिट बैकग्राउंड के लिए किया जाता है
.MAP - प्रतीक-भर पृष्ठभूमि के लिए दोनों नक्शे।
.TIL - प्रतीक से भरे बैकग्राउंड के लिए टाइल्स और पैलेट।
.PTH - रोड पॉइंट और ट्रिगर्स का डेटा।
.TEX - सड़क के लिए बनावट।

.SSQ और .SBM फाइलें मेरी तेजी से असहज SEQ सीक्वेंसर द्वारा बनाई गई थीं। .MAP, .TIL, .PTH और .TEX फाइलें डैन द्वारा बनाई गई थीं, जो एक तेजी से भयानक TULE मैप एडिटर हैं।

इन फ़ाइलों को इसी .GOV और .GOB फ़ाइलों में ASMSH कोडांतरक का उपयोग करके इकट्ठा किया जाता है। यह कैसे किया जाता है, यह देखने के लिए LEVEL.S और LEVEL1.S फाइलें देखें। A .GOV फ़ाइल में एक विशेष स्तर पर कुछ डेटा भी शामिल हैं।

मॉड्यूल


परीक्षण - कुछ खास नहीं, कुछ लेबल सेट करता है।

MAIN.C कार्यक्रम का शीर्ष स्तर है। इसमें उपकरण, स्तर सेटिंग्स, पासिंग स्तर के लिए एक कोड और विभिन्न अन्य छोटे तत्व शामिल हैं जिन्हें वास्तव में अधिक उपयुक्त मॉड्यूल में रखा जाना चाहिए। इसमें बहुत सारा कचरा है, क्योंकि त्वरित परीक्षण के लिए इस मॉड्यूल में कुछ नया जोड़ना सबसे आसान है। एक पीसी पर एक सीडी या फ़ाइल सर्वर से बूट कोड होता है। समय रंग पट्टियों को सक्षम या अक्षम करने के लिए एक ध्वज शामिल है।

GFXLIB.C - उपकरण तक पहुंचने और विभिन्न ग्राफिक कार्यों को करने के लिए विभिन्न प्रक्रियाएं। लगभग सभी दान द्वारा खरोंच से लिखे गए हैं और अक्सर बहुत अक्षम हैं। यदि आप अक्सर यहां से प्रक्रिया का उपयोग करते हैं, तो यह अच्छा होगा कि यह क्या करता है पर एक नज़र डालें और अपने कोड में एक तेज संस्करण लिखें।

हालांकि, सभी फ़ंक्शन काम करते हैं और किसी न किसी कार्यान्वयन और परीक्षण के लिए एक उत्कृष्ट रूपरेखा प्रदान करते हैं। डैन का शुक्रिया, उसके बिना यह संभव नहीं होता।

SMP_PAD.C - शनि जॉयस्टिक से पढ़ने के लिए विभिन्न प्रक्रियाएं, उपकरणों पर बहुत निर्भर करती हैं।

GLOBALS.C - सभी वैश्विक चर और कई सामान्य कार्य। वैश्विक चर का उपयोग करना एक स्वीकार्य प्रोग्रामिंग अभ्यास है। हालांकि, विभिन्न कारणों से, SH2 में वैश्विक चर का कार्यान्वयन धीमी गति से होता है, इसलिए समय के साथ मैं संभवतः आवश्यक रूप से वैश्विक संरचनाओं में भाग को बदल दूंगा। MAN और PATH की स्थिति का वर्णन करने वाले चर शामिल हैं।

MAN.C - किसी व्यक्ति के आंदोलन और प्रदर्शन (प्रिंस लाइटस्टार, तालिन, अभिभावक या ग्रिमेड - खिलाड़ी द्वारा नियंत्रित चरित्र) को संभालता है। अब तक, यह मुख्य रूप से सड़क के साथ आंदोलन और टकराव का तर्क है। इसके अलावा, यह प्रत्येक कार्रवाई के लिए उपयुक्त एनीमेशन प्रदान करता है। अभी बहुत काम करना बाकी है।

OB.C - खेल में वस्तुओं के संचलन और प्रदर्शन को संभालता है, विशेष रूप से दुश्मनों की वस्तुओं को, उदाहरण के लिए, कंकाल योद्धाओं और छोटे एलियंस। गेमप्ले का मुख्य भाग यहां प्रोग्राम किया गया है: दुश्मन एआई, बुनियादी आंदोलनों और ट्रिगर्स का ट्रिगर। डेटा संरचना अभी तक तैयार नहीं है, विशेष रूप से, टकराव और एनिमेशन के साथ समस्याओं पर पूरी तरह से काम नहीं किया गया है। अभी बहुत काम करना बाकी है।

DATA.S - विभिन्न तालिकाओं, वर्तमान में मुख्य रूप से खिलाड़ी के मुख्य पात्रों के एनिमेशन।

LAYER.C - लंबन के साथ स्क्रॉलिंग पृष्ठभूमि। अपडेट प्रतीक पृष्ठभूमि और स्क्रॉल बिटमैप्स। साथ ही कोहरे की परत में स्क्रॉलिंग लाइन्स (वेव इफेक्ट)। अब तक, प्रतीक मानचित्र परतों के लिए तालिकाओं को संपीड़न के बिना संग्रहीत किया जाता है। उन्हें RLE प्रारूप में संपीड़ित करने की आवश्यकता है जो मैंने उत्पत्ति संस्करण के लिए उपयोग किया था। यह कार्य केन पर जा सकता है यदि हमें सोनी की तुलना में पहले शनि के लिए एक विकास प्रणाली मिलती है।

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 9,000 लाइनों की एक राक्षसी फ़ाइल में विकसित हुआ है, जिसमें खेल में व्यक्तिगत वस्तुओं के सभी व्यवहार पैटर्न शामिल हैं। इसके अलावा कोड में बड़ी संख्या में नंबर लिखे गए हैं, उदाहरण के लिए, जैसे:

 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/hi459622/


All Articles