Bomb Jack GX

Το κυκλοφόρησα ΑΚΡΙΒΩΣ την ίδια στιγμή που πέσε το CPCWiki, οπότε δεν είχα ποτέ την ευκαιρία να μιλήσω για τις τεχνικές λεπτομέρειες. Ο κώδικας χρησιμοποιεί πολύ ακριβή συγχρονισμό (exact timing), οπότε για άλλη μια φορά έφτιαξα κατά λάθος ένα τεστ για emulators, όπως ανακαλύπτω όταν ο κόσμος ανεβάζει βίντεο όπου το παιχνίδι δεν φαίνεται σωστά…

Αφαίρεσα τα Extra Sugar modes επειδή όλα εκείνα τα scoreboards και τα achievements είχαν σχεδιαστεί για ένα σύστημα βασισμένο σε δισκέτα που θα αποθήκευε την πρόοδό σου. Έτσι σκέφτηκα, θα το ρυθμίσω να παίζει σαν το arcade παιχνίδι και θα έχω μόνο έναν πίνακα σκορ για να παραμείνει απλό για cartridge.

Στη συνέχεια, λίγο πριν ολοκληρωθεί το παιχνίδι, δόθηκε στο PicoGX η δυνατότητα ανάγνωσης/εγγραφής στην κάρτα SD, οπότε πρόσθεσα την αποθήκευση των υψηλών σκορ την τελευταία στιγμή. Νομίζω ότι θα ήταν το πρώτο παιχνίδι που θα χρησιμοποιούσε αυτή τη δυνατότητα, αν δεν με είχε προλάβει το Bloodwych mod. Οπότε, ίσως θα μπορούσα να εξετάσω το ενδεχόμενο να επαναφέρω το περιεχόμενο του Extra Sugar, αλλά θα έπρεπε να σχεδιάσω ξανά όλα τα νέα υπόβαθρα (backgrounds) που έφτιαξα για το Extra Sugar, τα οποία υπάρχουν μόνο σε 4 χρώματα. Και για να είμαι ειλικρινής, όχι και τόσο πολλοί άνθρωποι έχουν κατεβάσει το Bomb Jack GX σε σύγκριση με το Extra Sugar, πράγμα που έχει ενδιαφέρον.

Ο χάρτης μνήμης (memory map) είναι εντελώς διαφορετικός και αρκετός κώδικας έπρεπε να τροποποιηθεί ώστε να αφαιρεθεί το αυτο-τροποποιούμενο υλικό (self-modifying stuff) για να μπορεί να τρέξει από τη ROM. Η οθόνη δεν χρειάζεται πλέον double buffering χάρη στα hardware sprites και ο περισσότερος κώδικας τρέχει από τη ROM, οπότε τα 64k είναι υπεραρκετή RAM. Και η ROM είναι μόλις 128k, οπότε και πάλι, υπάρχει άφθονος χώρος.

Τα εικόνες φόντου προφανώς είναι σε Mode 0 αυτή τη φορά και στην πραγματικότητα χρησιμοποιούν περισσότερα χρώματα από το arcade, επειδή χρησιμοποίησα dithering όπου μπορούσα για να προσπαθήσω να τα κάνω να φαίνονται λίγο λιγότερο «chungus» στο Mode 0. Όλα διορθώθηκαν με το χέρι. Χρησιμοποιούν επίσης διαχωρισμούς χρωμάτων (colour splits) όπου είναι δυνατόν για να πετύχουν περισσότερα από 16 χρώματα. Ή 12 χρώματα, αφού οι πλατφόρμες πιάνουν πάντα 4.

Το σύστημα διακοπών (interrupt system) είναι πολύ πιο περίπλοκο από το Extra Sugar, αλλά η δομή του παιχνιδιού ήταν πολύ πιο εύκολο να γραφτεί χάρη στο PRI, το οποίο μπορεί να είναι το πιο υποτιμημένο χαρακτηριστικό του GX. Οποιοσδήποτε κώδικας ήταν κρίσιμος για τον συγχρονισμό μπήκε στην αλυσίδα διακοπών (interrupt chain), γεγονός που έκανε τα πάντα τόσο πιο απλά και πιο τακτοποιημένα.

Ο κώδικας των sprites ξαναγράφτηκε εντελώς για να χρησιμοποιεί hardware sprites. Το παιχνίδι χρειάζεται το πολύ 12 sprites για τα αντικείμενα του παιχνιδιού (1 παίκτης + 9 εχθροί + μπάλα P + νόμισμα B). Ανησυχούσα για το πόσος χρόνος θα χρειαζόταν για να ενημερωθεί το asic ώστε να τα κάνει animate, καθώς η μνήμη των sprites δεν είναι ευρετηριασμένη (indexed), πράγμα που είναι πολύ εκνευριστικό. Έτσι, για να τα κάνω να τρέχουν πιο γρήγορα, τα δεδομένα των sprites είναι όλα μεταγλωττισμένα (compiled) sprites και όπου είναι δυνατόν αποθηκεύονται ως delta, δηλαδή αλλάζουν μόνο τα pixels που διαφέρουν από το προηγούμενο sprite. Τα animations των εχθρών λειτουργούν όλα με αυτόν τον τρόπο και ενημερώνονται εναλλάξ, 4 κάθε φορά. Έτσι, στην πραγματικότητα η ενημέρωση των sprites γίνεται αρκετά γρήγορα, συνήθως πριν ξεκινήσει η σχεδίαση του ορατού frame. Και η λογική του παιχνιδιού ήταν ήδη γρήγορη, οπότε το παιχνίδι τρέχει άνετα στα 50hz.

Περισσότερος χρόνος καταναλώθηκε στο sprite multiplexing, το οποίο διαχειριζόταν ξανά η διακοπή (interrupt). Μετά τα αντικείμενα του παιχνιδιού, μου είχε απομείνει 4 ακόμα sprites και ήθελα να τα κάνω multiplex σε 24 βόμβες. Αυτό είναι παιχνιδάκι όταν είναι στοιβαγμένα κατακόρυφα, αλλά το πρόβλημα είναι ότι μπορούν να υπάρχουν έως και 7 βόμβες σε μια γραμμή. Έτσι, όποτε υπάρχουν περισσότερες από 4, το παιχνίδι κάνει ένα δύσκολο οριζόντιο multiplexing όπου τα sprites μετακινούνται εμπρός και πίσω σε κάθε scanline ώστε να εμφανίζονται δύο φορές. Αυτό απαιτεί ακριβή συγχρονισμό και είναι ένα σημείο αποτυχίας για τους emulators.

Ο μετρητής ουράνιου τόξου στο πάνω μέρος της οθόνης αποτελείται επίσης από δύο από τα sprites της βόμβας. Αυτά σχεδιάζονται ξανά γρήγορα σε βόμβες στο χρονικό διάστημα μεταξύ του τέλους της πάνω οθόνης και της αρχής της περιοχής παιχνιδιού (playfield). Έτσι το παιχνίδι έχει συχνά περισσότερα από 30 sprites στην οθόνη ταυτόχρονα και μπορεί να έχει περισσότερα από 16 sprites σε μια γραμμή. Δεν μπορείς να το κάνεις αυτό σε ένα Master System ή NES.

Οι επιπλέον ζωές στο κάτω μέρος της οθόνης δεν είναι sprites, αλλά γίνονται με colour splits όπως κάνει το Extra Sugar.

Η οθόνη τίτλου είναι μια εντελώς διαφορετική λύση στο ίδιο πρόβλημα — θέλω το λογότυπο να είναι σε υψηλή ανάλυση, αλλά χρειάζεσαι τουλάχιστον 7 χρώματα για να το σχεδιάσεις, και δεν μπορούν να διαχωριστούν εύκολα. Αυτή τη φορά είχα τα hardware sprites με το μέρος μου, αλλά τα γράμματα είναι πολύ μεγάλα για να καλυφθούν εξ ολοκλήρου με hardware sprites. Έτσι κατέληξα να σχεδιάσω το λογότυπο σε mode 1 χρησιμοποιώντας δύο αποχρώσεις του μπλε, μαύρο και πορτοκαλί, και τα γράμματα καλύπτονται με μια στρατηγική διάταξη hardware sprites σε συνδυασμό με colour splits στο πορτοκαλί κανάλι. Επανεγγράφει δύο από τα hardware sprites ενώ το κάνει αυτό, οπότε χρησιμοποιούνται συνολικά 18 sprites. Και πάλι αυτό απαιτεί ακριβή συγχρονισμό, οπότε και πάλι αυτό είναι κάτι που δεν φαίνεται 100% σωστό σε όλους τους emulators.

Εκτός από αυτό, όλα δέσανε αρκετά γρήγορα. Το GX είναι διασκεδαστικό και έχει ακόμα πολλές ανεκμετάλλευτες δυνατότητες.

23 «Μου αρέσει»

Eucharistó polý gia tósο polýtimes pliroforíes schetiká me tis technikés lýseis.
Ntrépopmai pou to léo, allá den écho xekinísei akóma to paiknídi sou… Chaíromai περισσότερο na προγραμματίζω se palιó ylikó pará na paízo se autó. Allá η douleiá sou eínai ekpliktikí, se eucharistó kai páli gia autín.

Φίλε, φαίνεται τόσο αψεγάδιαστα αρκέιντ που ακόμα έχω μείνει άναυδος μετά από τόσο καιρό…

Ευχαριστούμε για τη λεπτομερή ανάλυση :slight_smile:

Πολύ ωραίο! Κρίμα που δεν μπόρεσε ποτέ να φτάσει στο ίδιο επίπεδο ποιότητας με τα «παιχνίδια που δημιουργήθηκαν τους τελευταίους μήνες με τη χρήση AI», αλλά, ε, όπως και να 'χει, αξιέπαινη προσπάθεια!

..και νομίζω πως μόλις βρήκαμε το νέο μας meme :stuck_out_tongue:

7 «Μου αρέσει»

Μπορείς σε παρακαλώ να το αφήσεις να πέσει; Προς τι όλη αυτή η φασαρία;

Υπάρχει κάποιο σχέδιο να προστεθεί αυτό το «κάτι παραπάνω» και στην έκδοση GX;

ΥΓ. Μερικές φορές απολαμβάνω περισσότερο να διαβάζω για ένα παιχνίδι παρά να το παίζω. Στη συγκεκριμένη περίπτωση, απόλαυσα και τα δύο.

Eυχαριστώ πολύ για το πραγματικά ενδιαφέρον άρθρο, καθώς και για τις δύο εξαιρετικές μεταφορές του Bomb Jack, ειδικά την έκδοση GX.

Λατρεύω το ότι αποθηκεύει τα hiscores, είναι ένα πραγματικά υπέροχο παιχνίδι για να κυνηγάς το σκορ :slight_smile:

Ζηλεύω τόσο πολύ που κατάφερες να κάνεις το sprite multiplexing να δουλέψει στο Plus. Εγώ δεν μπόρεσα ποτέ να το κάνω να λειτουργήσει σωστά χωρίς φρικτά γραφικά glitches και περίεργες παύσεις. Το βασίλειό μου για ένα asic sprite pointer table!

Όπως είπα, είναι πιθανό, οπότε ίσως κάποια μέρα. Το μεγαλύτερο εμπόδιο είναι ότι θα έπρεπε να ξανασχεδιάσω όλα τα έξτρα φόντα. Και η έκδοση GX είχε πολύ λιγότερα downloads σε σύγκριση με την έκδοση CPC.

Η διαδικασία της μετατροπής πάντως είχε πλάκα, καθώς τεράστια κομμάτια του παιχνιδιού έδεναν μεταξύ τους όλα μαζί.

2 «Μου αρέσει»

Θα χαρόμουν πολύ αν ασχολιόσουν με την ενημέρωση ενός άλλου παιχνιδιού Amstrad που σε ενδιέφερε! Ή ίσως κάποιου arcade παιχνιδιού που αγαπάς και δεν κυκλοφόρησε ποτέ στο CPC…

Ή το Platypus CPC+!

1 «Μου αρέσει»

Το ενσωμάτωσα στην αλυσίδα διακοπών (interrupt chain), ώστε μόλις λειτουργήσει να μην χρειάζεται να ανησυχώ ιδιαίτερα γι’ αυτό. Έβαλα αρκετό κώδικα στη διακοπή. Είναι κρίμα που ο κανονικός CPC δεν διαθέτει PRI. Είναι ένα τόσο απλό χαρακτηριστικό, αλλά κάνει τα πράγματα που βασίζονται σε αυστηρό χρονισμό πολύ πιο εύκολα.

Βοηθάει επίσης το γεγονός ότι οι βόμβες δεν μετακινούνται. Το κατακόρυφο πολυπλεξία (vertical multiplexing) είναι εύκολο, αλλά το οριζόντιο απαιτούσε χρονισμό ακριβείας μέχρι το NOP και μόλις που καταφέρνει να λειτουργήσει. Επίσης, δεσμεύει όλη την επεξεργαστική ισχύ (CPU) για αυτές τις γραμμές, αλλά είχα άφθονο διαθέσιμο χρόνο επεξεργαστή.

Επειδή οι διακοπές έχουν μια αβεβαιότητα μερικών NOP στον χρονισμό τους, ανάλογα με το τι διακόπτεις, πέτυχα ακριβείς διακοπές όταν τις χρειαζόμουν καλώντας τες μία γραμμή νωρίτερα και στη συνέχεια ρυθμίζοντας το PRI να προκαλέσει ξανά διακοπή στην επόμενη γραμμή σάρωσης (scanline). Η συνάρτηση διακοπής στη συνέχεια περιμένει (WAIT) να ενεργοποιηθεί η διακοπή μέσα στην ίδια τη διακοπή. Αυτό σπαταλά μια γραμμή σάρωσης από τον χρόνο της CPU, αλλά σου δίνει μια διακοπή με απόλυτα ακριβή χρονισμό.

2 «Μου αρέσει»

Αν είσαι έξυπνος με αυτό, μπορείς να χρησιμοποιήσεις μέρος αυτού του χρόνου για προπαρασκευαστική εργασία. Υπάρχει μόνο μια μικρή διακύμανση στους πιθανούς χρόνους διακοπής, οπότε κάνεις την πρώιμη διακοπή και μετά μπορείς να προετοιμάσεις εργασία που ισοδυναμεί με 50 NOP πριν από ένα HALT που οδηγεί στην επόμενη γραμμή σάρωσης. Είναι ιδιαίτερα βολικό αν χρησιμοποιείς DMA για τον συγχρονισμό των διακοπών γραμμής σάρωσης (αντί για πολλαπλά PRI), επειδή τότε δεν ξοδεύεις ούτε μέρος αυτού του χρόνου για να ρυθμίσεις ξανά το PRI.

1 «Μου αρέσει»

Πρέπει πάντως να παραδεχτούμε ότι έχει περάσει λίγος μόνο καιρός από τότε που έγινε διαθέσιμη η κασέτα του Rodrik.

Γιατί ειλικρινά, υπάρχει ξεκάθαρα η δυνατότητα να ρίξει μια μεγάλη «σφαλιάρα» στην εξαιρετική, κατά τα άλλα, έκδοση του MSX2.