Ini adalah dokumen yang saya tulis pada 1995 ketika saya mengerjakan game pertama studio Neversoft: Skeleton Warriors. Ini adalah game pertama di mana saya tidak menggunakan bahasa assembly 68K.
Foto diambil sekitar waktu. Kit dev ("Kotak Kecil" dan ICE) ada di sebelah kanan saya.
Status permainan
Dokumen di bawah ini secara singkat menjelaskan status kode Prajurit Kerangka untuk Sega Saturn, dan juga menyebutkan beberapa dari banyak aspek yang masih perlu dilakukan.
Dokumen itu diperlukan untuk mempercepat keakraban Dan, Ken dan James dengan kode yang sudah jadi, untuk menjelaskan kepada mereka tujuan masing-masing modul dan interaksi di antara mereka. Dia juga mengizinkan saya untuk menghargai keadaan menyedihkan dari kode ini, dan, semoga, membuat saya mengambil keputusan.
Saya juga berbicara sedikit tentang menanamkan data (file .GOV dan .GOB) dalam program ini, dan tentang apa yang akan kami lakukan di masa depan.
Peralatan Pengembangan
Platform target kami adalah Sega Saturn, yang memiliki dua mikroprosesor SH2 Risc dan satu 68000. Selama kami hanya menggunakan prosesor utama Master SH2, budak SH2 tambahan akan digunakan ketika kami mencari cara untuk melakukan ini. 68000 digunakan untuk mengontrol chip suara, kami tidak perlu menulis kode untuk itu, karena akan menggunakan perpustakaan suara yang disediakan oleh Sega.
Program ini hampir seluruhnya ditulis dalam C. murni. Kami menggunakan kompiler GNU SH2 untuk mendapatkan assembler output SH2. Ada beberapa modul SH2 dalam kode, yang sebagian besar berisi data secara eksklusif. Sejauh ini saya belum menulis sesuatu yang bermakna pada SH2.
Sebagai sistem pengembangan, kami menggunakan PsyQ. Ini bukan sistem pengembangan Sega standar, tetapi semua orang yang bekerja dengannya menganggapnya yang terbaik. Alternatif untuk itu adalah SNASM, dibuat oleh Cross Products milik Sega. Sebagian besar contoh kode yang dipasok oleh Sega harus bekerja di sistem pengembangan SNASM, tetapi dapat dengan mudah dikonversi ke PsyQ.
Sistem PsyQ terdiri dari kartu antarmuka SCSI, yang dipasang di PC, kartrid yang dihubungkan ke Saturnus dan menghubungkan kabel. Sumber dikompilasi pada PC dan diunduh ke Saturn, tempat program dimulai. Kode dapat di-debug dari PC.
Sistem Pengembangan PsyQKomunikasi dikendalikan oleh program penduduk (PSYBIOS), yang memproses komunikasi antar mesin. Ini memungkinkan konsol Saturnus mengunduh file dari PC dengan cara yang hampir sama dengan yang diunduh dari CD. Kami menggunakan fungsi ini untuk mengunduh file dari setiap level.
Saya memiliki beberapa laci besar dan keras di kamar saya, dan dua PC lagi. Yang lebih kecil dari dua kotak adalah E7000PC, yang merupakan emulator SH2 bawaan. Ini membantu untuk mengetahui di mana program crash jika debugger PsyQ tidak menghentikannya. Ini juga berguna untuk melacak menulis ke memori, tetapi sejauh ini saya belum menggunakan fitur ini.
Laci keras kedua adalah sesuatu yang disebut "Kotak Kecil" ("Kotak Besar" pertama adalah tentang ukuran kulkas kecil). Intinya, itu adalah Saturnus dengan antarmuka tambahan untuk E7000 dan emulator CD. Di panel depan, ia memiliki saklar ID negara dan sakelar antara PAL dan NTSC.
Di dalam komputer kedua adalah emulator CD - papan besar, berkat hard drive komputer yang berpura-pura menjadi drive CD. Anda dapat mengumpulkan gambar CD di dalamnya dan meniru secara real time untuk melihat bagaimana permainan akan terlihat ketika sampai ke CD nyata. Emulator kurang lebih berfungsi, meskipun memiliki beberapa masalah yang sedang kami kerjakan bersama dengan Sega.
Kit Dev Sega sendiriMengompilasi dan Menghubungkan
Majelis umum dari program yang selesai dikontrol oleh satu makefile: MAKEFILE.MAK. Ini berisi dependensi dan target untuk seluruh proyek, termasuk kompilasi file .GOB dan .GOV.
Modul kode sumber C individu (file .C) dikompilasi oleh CCSH ke modul objek SH2 (.OBJ). Pertama-tama memanggil preprosesor GNU C disebut CPPSH (terletak di C: \ GNUSH2 \ BIN), kemudian memanggil CC1SH untuk hasilnya untuk membuat kode assembler SH2, dan akhirnya memanggil ASSH (dalam C: \ PSYQ) untuk membangunnya ke dalam format objek jadi.
Kami tidak menggunakan C ++ karena saya diberitahu bahwa itu menciptakan file objek besar. Namun, saya tidak bekerja dengannya, Anda bisa bereksperimen.
Beberapa file dalam bahasa assembler SH2 (dengan ekstensi .S) hanya dikumpulkan menggunakan ASMSH langsung ke file .OBJ (ini tidak sama dengan ASSH, tetapi assembler makro yang lebih kompleks). Saat ini, mereka hanya digunakan untuk menyematkan data, dan tidak mengandung kode yang bergantung pada mesin.
Saturn RAM, di mana kode dapat dimuat, dibagi menjadi dua blok 1MB. Satu dimulai dari $ 06.000.000, dan yang lainnya pada $ 002.000.000. Blok pada $ 00.200.000 digunakan secara eksklusif untuk menyimpan grafik dari karakter utama. Kode program ditulis pada $ 06010000 ($ 10.000 byte pertama digunakan untuk ruang sistem, stack, dan sejenisnya.)
Kode ini tergantung pada posisi dan dikompilasi untuk dijalankan di alamat spesifik ini ($ 06010000) dan tidak ada yang lain.
File .OBJ dihubungkan bersama-sama menggunakan program PSYLINK untuk membuat file MAIN.CPE, program yang dapat dieksekusi dengan header kecil yang dapat diunduh ke Saturnus dengan perintah RUN. PSYLINK menggunakan file TEST.LNK untuk menunjukkan file .OBJ mana yang akan dimasukkan dan di mana harus meletakkannya.
Data
Permainan ini dibagi menjadi beberapa level, banyak level menggunakan data yang sama, tetapi pada dasarnya mereka berbeda untuk setiap level. Semua data untuk setiap level dikumpulkan dalam dua file .GOV dan .GOB yang sangat besar. (dalam kasus tambang, itu adalah MINE.GOV dan MINE.GOB). File GOV berisi header pendek, dan kemudian datang semua data yang harus ada dalam memori video. File .GOB berisi semua data yang harus dalam RAM.
Level terdiri dari sebagian file data yang ditunjukkan di bawah ini.
.SSQ - file sequencer sprite
.SBM - file bitmap digunakan untuk latar belakang bit
.MAP - kedua peta untuk latar belakang yang dipenuhi simbol.
.TIL - tileset dan palet untuk latar belakang yang dipenuhi simbol.
.PTH - data titik jalan dan pemicu.
.TEX - tekstur untuk jalan.
File .SSQ dan .SBM dibuat oleh sequencer SEQ saya yang semakin tidak nyaman. File .MAP, .TIL, .PTH, dan .TEX dibuat oleh Dan, editor peta TULE yang semakin luar biasa.
File-file ini dirakit menggunakan assembler ASMSH ke file .GOV dan .GOB yang sesuai. Untuk melihat bagaimana ini dilakukan, lihat file LEVEL.S dan LEVEL1.S. File .GOV juga mencakup beberapa data pada tingkat tertentu.
Modul
UJI - tidak ada yang istimewa,
atur beberapa label.
MAIN.C adalah level teratas program. Ini berisi inisialisasi peralatan, pengaturan level, kode untuk level kelulusan dan berbagai elemen kecil lainnya yang sebenarnya harus ditempatkan dalam modul yang lebih cocok. Ada banyak sampah di dalamnya, karena termudah untuk menambahkan sesuatu yang baru ke modul ini untuk pengujian cepat. Berisi kode booting dari CD atau server file pada PC. Berisi bendera untuk mengaktifkan atau menonaktifkan bilah warna TIMING.
GFXLIB.C - berbagai prosedur untuk mengakses peralatan dan melakukan berbagai fungsi grafis. Hampir semuanya ditulis dari awal oleh Dan dan seringkali sangat tidak efisien. Jika Anda sering menggunakan prosedur dari sini, alangkah baiknya untuk melihat apa yang dilakukannya dan menulis versi yang lebih cepat dalam kode Anda.
Namun, semua fungsi bekerja dan menyediakan kerangka kerja yang sangat baik untuk implementasi dan pengujian kasar. Terima kasih Dan, itu tidak akan mungkin terjadi tanpa dia.
SMP_PAD.C - berbagai prosedur untuk membaca dari joystick Saturnus, sangat bergantung pada peralatan.
GLOBALS.C - semua variabel global dan beberapa fungsi umum. Menggunakan variabel global adalah praktik pemrograman yang dapat diterima. Namun, karena berbagai alasan, implementasi variabel global dalam SH2 agak lambat, jadi seiring waktu saya mungkin akan mengubah bagian itu menjadi struktur global jika perlu. Berisi variabel yang menggambarkan keadaan
MAN dan
PATH .
MAN.C - menangani pergerakan dan tampilan seseorang (Prince Lightstar, Talyn, Guardian atau Grimskull - karakter yang dikendalikan oleh pemain). Sejauh ini, ini terutama logika gerakan dan tabrakan dengan jalan. Selain itu, ia menyediakan animasi yang sesuai untuk setiap tindakan. Masih banyak pekerjaan yang harus dilakukan.
OB.C - menangani pergerakan dan tampilan objek dalam permainan, terutama objek musuh, misalnya, prajurit kerangka dan alien kecil. Bagian utama gameplay diprogram di sini: AI musuh, gerakan dasar dan pemicu pemicu. Struktur data belum siap, khususnya, masalah dengan tabrakan dan animasi tidak sepenuhnya berhasil. Masih banyak pekerjaan yang harus dilakukan.
DATA.S - berbagai tabel, saat ini terutama animasi dari karakter utama pemain.
LAYER.C - menggulir latar belakang dengan paralaks. Memperbarui latar belakang simbol dan menggulirkan bitmap. Juga menggulirkan garis (efek gelombang) di lapisan kabut. Sejauh ini, tabel untuk layer peta simbol disimpan tanpa kompresi. Mereka perlu dikompres ke format RLE yang saya gunakan untuk versi Genesis. Tugas ini dapat pergi ke Ken jika kita mendapatkan sistem pengembangan untuk Saturn lebih awal daripada untuk Sony.
PAL.C - palet. Anda dapat memilih dari 2048 warna. Setiap piksel pada layar dapat menjadi salah satu dari warna-warna ini. Secara logis saya membagi palet menjadi delapan palet dengan 256 warna. PAL.C berisi kode untuk inisialisasi, persiapan, dan kode untuk perubahan siklusnya. Mereka juga akan memerlukan peredupan dan pergeseran siklik yang lebih kompleks, serta kilatan kecerahan, dll.
BUL.C adalah sistem primitif untuk memproses kerang (melempar pedang, meninju tangan, menembakkan roket dari tangan, dll.) Sebagai objek terpisah. Cukup banyak pekerjaan yang masih diperlukan untuk penggunaan kerang yang lebih kompleks. Anda juga memerlukan kode tumbukan dan animasi yang benar.
PAD.C adalah modul sederhana untuk menyimpan status joystick dalam format yang lebih nyaman. Hafalkan apakah tombol baru saja ditekan dan apakah sekarang ditekan.
MULAI.C - satu baris yang memberitahukan level mana yang akan menjadi yang pertama, untuk kemudahan mengubahnya dalam file batch.
PANEL.C - prosedur sederhana untuk menarik garis kekuatan.
PATH.C - prosedur mengerikan untuk menggambar jalan, serta menangani tabrakan dengan jalan.
MATH.C - sinus, kosinus dan rotasi titik sederhana dengan sudut.
[Perbarui] Berikut ini contoh kode dari MAN.C. Semuanya ditulis dengan kaku dalam kode dan mengacu pada struktur data global Man. Banyak angka yang tertulis dalam kode.
Man_JumpTrigger() { if ( Man.JumpFudge ) { Man.JumpFudge--; } if ( Man.Mode != M_Crouch || Man_StandingRoom() )
OB.C telah berkembang menjadi file dahsyat dengan 9000 baris, yang mencakup semua pola perilaku objek individu dalam permainan. Juga ada sejumlah besar angka yang ditulis dalam kode, misalnya, seperti:
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); }
Pemandangan yang tidak menyenangkan. Gaya kode ini berasal dari waktu ketika game sangat kecil dan saya mengembangkannya ketika bekerja dengan 68K.