Γεια! Έβγαλα την έκδοση v1.1 του 4X παιχνιδιού μου, η οποία προσθέτει ένα σύντομο μήνυμα βοήθειας. Ήταν όντως λίγο ζόρικο αν δεν είχες παίξει ποτέ ξανά Ascendancy.
Code & Logic Involvement
Υβριδικό (βασικές ρουτίνες δημιουργημένες από AI· συναρμολόγηση/επεξεργασία από άνθρωπο)
Assets & Pipeline Involvement
Ιστορία, διάλογοι ή κείμενο εγχειριδίου
Project Notes & Prompts
Claude Code + Arkos Tracker + RASM + μερικά προσαρμοσμένα εργαλεία γραμμένα σε Go για την επεξεργασία assets, fuzzing και build του παιχνιδιού.
Αυτό το παιχνίδι κάνει εκτεταμένη χρήση split-rasters για την εμφάνιση πολλών χρωμάτων στο mode 1. Απαιτείται πραγματικός CPC ή ένας εξομοιωτής υψηλής ακρίβειας.
Το DSK δημιουργείται απευθείας από μια βιβλιοθήκη Go που έγραψα πριν από μερικά χρόνια. Επιτρέπει την τοποθέτηση δυαδικών δεδομένων (binary data) απευθείας σε οποιονδήποτε τομέα (sectors). Ο φορτωτής |cpm έχει έναν πίνακα που περιέχει τη θέση των δεδομένων και τον προορισμό τους στη μνήμη RAM του CPC (banks, offset). Έτσι αποφεύγεται η χρήση του καταλόγου που αναγκάζει την κεφαλή να επιστρέφει στην αρχή του δίσκου.
Τα split rasters υποστηρίζονται από μια βιβλιοθήκη εξομοίωσης CPC γραμμένη από τον Claude, χρησιμοποιώντας το GitHub - koron-go/z80: Z80 emulator written in Go · GitHub . Μόλις βαθμονομηθεί με NOP σε έναν πραγματικό CPC, επιτρέπει αυτόματες δοκιμές μονάδας (unit testing) των split rasters.
Η μουσική και το πληκτρολόγιο επεξεργάζονται πριν από την περιοχή σχεδίασης, όπου εμφανίζονται τα rasters. Εκτελούνται σε σταθερό χρόνο, χρησιμοποιώντας τον FAP player για τη μουσική.
Όταν η οθόνη μαυρίζει (blanked) για τον υπολογισμό της σειράς του εχθρού, η μουσική επανασυνδέεται στις κανονικές διακοπές (interrupts) του CPC για να αποφευχθούν τα κολλήματα.
Μπορεί να εμφανίσει και τα 27 χρώματα ταυτόχρονα στην οθόνη. Κάθε γραμμή έχει μια παλέτα 6 χρωμάτων. Βασικά, 5. Το μαύρο είναι σταθερό. Ορίζονται 3 pens κατά τη διάρκεια του hsync (περίπου 30 nops) και στη συνέχεια, τα pen 1 και pen 3 ορίζονται ξανά κατά τη σχεδίαση της γραμμής. Αυτό επιτρέπει το αναβόσβημα (blink) ενός χρώματος είτε στην αριστερή είτε στη δεξιά στήλη. Το αριστερό εικονίδιο δεν επηρεάζεται από το blanking.
Αυτό θα μπορούσε να χρησιμοποιηθεί σε οποιοδήποτε παιχνίδι τύπου spreadsheet, πιστεύω. Επιτρέπει το αναβόσβημα μιας γραμμής αλλάζοντας μόνο 8 τιμές σε κάθε κύκλο.
Το παιχνίδι μπορεί να ολοκληρωθεί σε περίπου 2 με 3 ώρες. Ή σε λίγα λεπτά, αν απλώς αφήνετε τον χρόνο να περνά μέχρι να κερδίσει ο αντίπαλος…
Χρησιμοποίησα το AceDL για να δω πώς υλοποιήθηκε στο παιχνίδι Le Fugitif. Η βασική ιδέα είναι να δημιουργήσεις μια μεγάλη λίστα από πένες (pens), να δείχνεις σε αυτήν με τον καταχωρητή HL και στη συνέχεια να έχεις κάτι σαν το παρακάτω:
; ορισμός χρώματος φόντου
ld e, 0x54
out (c), 0
out (c), e
ld c, 0x01
ld d, 0x02
ld e, 0x03
display_loop:
out (c), c
outi
inc b
out (c), d
outi
inc b
out (c), e
outi
nop
...
nop
dec a
jp nz, display_loop
Κάθε outi θα θέσει το χρώμα που δείχνει ο HL στην επιλεγμένη πένα και στη συνέχεια θα τον αυξήσει (increment). Είναι πολύ σημαντικό να κάνεις inc b μετά, επειδή η outi μειώνει τον B.
Και, φυσικά, πριν από αυτό, πρέπει να περιμένεις το VBL για να συγχρονιστείς.
; αναμονή VBL
ei ; ενεργοποίηση διακοπών (τις χρειαζόμαστε για το HALT)
ld b,0xF5
novbl:
in a,(c)
rra
jr nc,novbl
halt ; είμαστε συγχρονισμένοι 16 γραμμές πριν από την οθόνη
di ; και τώρα απενεργοποιούμε τις διακοπές μέχρι το τέλος
; εδώ μπορεί να μπει οποιοσδήποτε κώδικας έχει ακριβή χρονισμό, όπως ο FAP player. Ή πολλά nop και loops για κατανάλωση χρόνου.
Και, φυσικά, μπορείς να εκτελέσεις outi;inc b αρκετές φορές για να αλλάξεις την ίδια πένα πολλές φορές κατά τη διάρκεια της γραμμής, εξ ου και ο διαχωρισμός (split).
Μέσα στο παιχνίδι; Χρησιμοποίησε τα βελάκια και το return για να επιλέξεις ένα στοιχείο από το μενού. Στη συνέχεια, χρησιμοποίησε τα γράμματα που επισημαίνονται με κόκκινο χρώμα στα ρήματα για [Next]. Ή [Pass] για να προχωρήσεις στο επόμενο συμβάν. (Τέλος κατασκευής, αύξηση πληθυσμού, ολοκλήρωση έρευνας..)
Ίσως θα έπρεπε να προσθέσω μια οθόνη βοήθειας για τα πλήκτρα χειρισμού.