Autore Topic: Lss Mimigame  (Letto 20962 volte)

ice00

  • Utente
  • **
  • Post: 469
    • http://digilander.iol.it/ice00
Lss Mimigame
« il: 24 Maggio 2004, 22:51:08 »
 Ok, tengo il forum di Ready64 aggiornato sul minigame in corso di sviluppo: qui
http://digilander.iol.it/ice00/download/lss.zip trovate l'eseguibile in via di sviluppo che di volta in voltà aggiornerò. Il file è criptato e la password è "Ready64 è fantastico" tutto in minusolo, attaccato e senza le virgolette, così solo chi segue questo forum potrà provare il gioco prima del rilascio ufficiale e potrà proporre miglioramenti e correggere eventuali bug.

Il platform vuole essere piccolo clone di The Great Giana Syster.

Il personaggio è già disegnato e l'animazione utilizza due soli frames (in totale 4 sprite per avere il movimento a sinistra e quello a destra).
Probabilmente per risparmiare spazio il frame del salto rimarrà uno di quelli già presenti.

Ho iniziato a scrivere il codice semplicemente prendendo il sorgente di EFNY di Cadaver commentato sull'articolo "dissect" che invito tutti a leggere perché spiega nel minimo dettaglio come il gioco sia realizzato (guardate anche "scroll" perché spiega molte tecniche per realizzare lo scroll).

Ho cominciato a togliere tutto quello che penso non mi serva e cercato di ridurre al minimo le routine utilizzate per risparmiare spazio.
Al momento non mi preoccupo dello spazio (sperando che siano diponibili 8KB, ma se fossero 4KB vedrò di sacrificare qualcosa), inoltre l'eseguibile non è compresso e ottimizzato nello spazio.

La grafica di EFNY utilizza blocchi di caratteri 4x4 (32x32 pixels). Come dice Lasse, è preferibile utilizzare potenze di due, quindi blocchi 2x2, 4x4 perché si guadagna in facilità di gestione utilizzando l'aritmetica binaria (rispetto ad esempio a un 3x3 - che per la cronaca era la dimensione dei caratteri utilizzati in MArkanoid dello scorso anno).
2x2 mi sembrano troppo pochi, perché porterebbe ad avere una mappa molto grande in termini di occupazione di spazio. Probabilmente per un platform così, il meglio sarebbe caratteri 4x2, ma temo di sprecare troppo spazio per le mappe, per cui ho optato per 4x4.

Il blocco del terreno è composto da solo 2 caratteri base ripetuti sui 4x4, così come per le lance accuminate nel terreno.

Le nuvole si mangiano invece 8 caratteri (4x2), ma ho ottenuto 3 blocchi diversi per avere nuvole sul'orrizzonte ad altezze diverse.
In caso di problemi di spazio, tengo un solo tipo di nuvola e cancello 2 blocchi.
Al momento non aggiungo altri elementi decorativi (come siepi/alberi) per non occupare spazio e perché forse rileverà le collisioni tra sprite/dati se questo serve a ridurre il codice di gestione delle collisioni.

Lo schermo tiene 5 blocchi di caratteri in altezza, per cui mi rimane una linea vuota in basso per il titolo e ben 4 righe in alto per metterci il punteggio e contatori vari.

Ci sono pertanto due interrupt attivi (li vedete perché ho lasciato le lineette grigie colorate) che servono per modificare i paramentri dello scroll.

Infatti, lo scroll è ottenuto in hardware con una velocità tra 1 e 4 pixels (come spiegato nell'articolo) e spostando tutti i caratteri (ben 40*20) quando lo scroller hardware ha terminato il max scroll (8 pixels).
Questo si mangia metà raster line disponibili, anche perché bisogna spostare oltre alla grafica anche i colori.
A differenze di EFNY, ho optato per avere gli stessi colori per ogni blocco. Questo implica che si può effettuare lo scroll di 1/4 di locazioni di memoria (come spiegato in "scroll" e implementato in Metal Warrior 1).
Dato che non viene utilizzato il buffer video (perché porterebbe via troppo codice), questo riduce il codice da eseguire per fare lo scroll (che risulta parecchio comunque).

Col joystick in porta 2 potete provare lo scroll su una piccola mappa (potete volare sopra le lance, perché ancora non c'è il controllo collisioni).

Il prossimo passo è quello di aggiungere i mattoni in aria e attivare il salto.

Poi penso di mettere i diamanti da prendere come sprite e utilizzare un nemico
mono sprite ma qui devo ancora pensarci su.

Per stasera termino qui.

bye
S.T.

Alberto

  • Utente
  • **
  • Post: 589
  • Gioco Preferito: Grand Prix Circuit
Lss Mimigame
« Risposta #1 il: 25 Maggio 2004, 16:11:05 »
 Ciao

mettendo come password

ready64èfantastico

non riesco a decomprimere il file :confused:  

ice00

  • Utente
  • **
  • Post: 469
    • http://digilander.iol.it/ice00
Lss Mimigame
« Risposta #2 il: 25 Maggio 2004, 19:18:53 »
 La password è propio quella e da me con unzip a riga di comando non da nessun problema.

Qualcuno lo apre?

hiryu

  • Utente
  • **
  • Post: 649
    • http://hiryu.netsons.org/
  • Gioco Preferito: Wizard Of Wor
Lss Mimigame
« Risposta #3 il: 25 Maggio 2004, 19:24:17 »
 neanche a me lo apre... è meglio se cambi la pwd, credo che sia la "è" a dare problemi
Elwood: "E' partito un pistone"
Jake: "Poi torna?"
________________________________________________________
Hiryu @ http://hiryu.netsons.org | http://www.virb.com/hiryu

ice00

  • Utente
  • **
  • Post: 469
    • http://digilander.iol.it/ice00
Lss Mimigame
« Risposta #4 il: 25 Maggio 2004, 19:38:50 »
 Ho tolto la "è" dalla password. Provate ora.

Altrimenti il mio zio su linux non va come da voi.

bye
S.T.

Roberto

  • Administrator
  • Utente
  • *****
  • Post: 2411
    • https://ready64.org
  • Gioco Preferito: Impossible Mission
Lss Mimigame
« Risposta #5 il: 25 Maggio 2004, 19:42:49 »
 Non funziona nemmeno a me.
Se apro l'archivio con winace, riesco a vedere l'interno (lss.prg , credo) ma non si riesce ad estrarre niente.

Ti segnalo anche che il forum è tornato visibile a tutti, e quindi anche altri possono accedere al file (non tutti i mali vengono per nuocere).

Dobbiamo trovare un altra idea per non divulgare troppo il file :)  
Per collaborare, segnalare un errore (o qualsiasi altra comunicazione importante) utilizzare la pagina dei contatti:
https://ready64.org/informazioni/contatti.php

hiryu

  • Utente
  • **
  • Post: 649
    • http://hiryu.netsons.org/
  • Gioco Preferito: Wizard Of Wor
Lss Mimigame
« Risposta #6 il: 25 Maggio 2004, 19:42:49 »
 OK!! :D

senza la "è" funzia
Elwood: "E' partito un pistone"
Jake: "Poi torna?"
________________________________________________________
Hiryu @ http://hiryu.netsons.org | http://www.virb.com/hiryu

Alberto

  • Utente
  • **
  • Post: 589
  • Gioco Preferito: Grand Prix Circuit
Lss Mimigame
« Risposta #7 il: 25 Maggio 2004, 21:22:22 »
 
Perfetto!! ;)
 

ice00

  • Utente
  • **
  • Post: 469
    • http://digilander.iol.it/ice00
Lss Mimigame
« Risposta #8 il: 25 Maggio 2004, 21:40:04 »
 Il file è criptato (opzione -e), il che forse è diverso da essere protetto da password del tipo Winzip (opzione -P).

Se la gente che legge il forum lo scarica non c'è problema, ma se lo scarica qualcono dall'area del download del sito è meglio che non lo sappia utilizzare, altrimenti sarebbe un pò diffcile dire che il gioco non era mai stato pubblicato prima della competizione.
(qui posso dire che era per testare lo sviluppo del gioco con altri italiani)

bye
S.T.

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Lss Mimigame
« Risposta #9 il: 25 Maggio 2004, 22:50:05 »
 
Citazione da: "ice00"
Ok, tengo il forum di Ready64 aggiornato sul minigame in corso di sviluppo
Sto studiando il disassemblato e ho un paio di domande da porti visto che puo' tornarmi utile :)

Vedo che ci sono molte volte
Codice: [Seleziona]
LDA $0CA3,X
...
LDA $0C8B,X
etc ripetute piu' volte nel codice.
Usare un puntatore in pagina 0 richiederebbe un piccolo overhead per caricarlo, ma poi si ridurrebbero sia i byte di codice che i cicli impiegati, giusto? ad es
Codice: [Seleziona]
lda #$0c
sta $fc
lda #$a3
sta $fb
...
lda $fb,x
etc.

Tra l'altro mi occorre un chiarimento sulla differenza sostanziale tra lda($fb,x) e lda($fb),y ...
Il primo prende come indirizzo ($fb+($fc <<8))+X e da li' legge il valore
il secondo prende come ind. ($fb+($fc <<8)), legge il valore e somma Y
...
o e' il contrario? Spesso mi confondo
 :overkiller:
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

Alberto

  • Utente
  • **
  • Post: 589
  • Gioco Preferito: Grand Prix Circuit
Lss Mimigame
« Risposta #10 il: 25 Maggio 2004, 23:15:30 »
 
Citazione
CODE 

lda #$0c
sta $fc
lda #$a3
sta $fb
...
lda $fb,x
Giusto,però occhio all'ultima istruzione.Se usi LDA $FB,X carichi solo il byte basso o alto dell'indirizzo da cui andare a prendere i dati;quel che ti interessa,invece,è caricare il contenuto delle locazioni $0ca3 in avanti.
Per ottenere l'effetto voluto,basta sostituire LDA $FB,X con LDA ($FB),Y.
 
Citazione
Tra l'altro mi occorre un chiarimento sulla differenza sostanziale tra lda($fb,x) e lda($fb),y ...
con lda ($fb),y l'indirizzo puntato da $FB-$FC viene incrementato di y locazioni,e il contenuto dell'indirizzo ottenuto viene caricato nell'accumulatore.
con lda ($fb,x) il puntatore $FB-$FC viene incrementato di x locazioni,e il valore nell'indirizzo puntato dal vettore ottenuto viene caricato nell'accumulatore.
Esempio

nel primo caso

$FB $FC

01   08     --> y= 3 -> lda ($fb),y -> A contiene il valore in $0804

nel secondo caso

$FB $FC

01   08     --> x=3 -> lda ($fb,x) -> A contiene il valore nella locazione puntata da
                                                    $FE-$FF

Da notare che nel programma di Ice00,pur usando X come indice si ottiene un effetto analogo al primo modo di indirizzamento,poichè non viene modificato l'indice X,ma il contenuto dei vettori $82-$83 e $86-$87.

Ciauz

Alberto

  • Utente
  • **
  • Post: 589
  • Gioco Preferito: Grand Prix Circuit
Lss Mimigame
« Risposta #11 il: 25 Maggio 2004, 23:31:27 »
 Poi volevo chiedere anch'io una cosa a Ice00  :D

Per abilitare/disabilitare gli interrupt,invece che caricare opportunamente i registri appositi, non si potrebbe sostituire il tutto con un normale SEI e CLI?
Se fosse equivalente,ci sarebbe il vantaggio di risparmio di cicli macchina e di bytes...
Buonanotte a tutti :)

ice00

  • Utente
  • **
  • Post: 469
    • http://digilander.iol.it/ice00
Lss Mimigame
« Risposta #12 il: 26 Maggio 2004, 20:51:16 »
 
Citazione
Sto studiando il disassemblato e ho un paio di domande da porti visto che puo' tornarmi utile

Accidenti, non è necessario ricorrere al disassemblato: aggiunto il sorgente allo zip (anche se è un pò più avanti, perché comincio a mettere le routine di salto).


le LDA aaaa,x e STA aaaa,y sono le più semplici da utilizzare e finchè non c'è la necessità di ridurre il codice per problemi di spazio, preferisco rimanere sul semplice.
Del resto usando Exomixer come compressore, le tecniche di scrittura del codice cambiano parecchio:

lda  #4
jsr  routine
lda  #5
jsr  routine

routine:
    xxxx
    rts
   
può essere compresso meno di
 lda  #4
 xxxx
 lda  #5
 xxxx
 
 con xxx=parecchie istruzioni
     
pertanto l'ottimizzazione va fatta come ultimo passo.

 

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Lss Mimigame
« Risposta #13 il: 26 Maggio 2004, 22:10:39 »
 
Citazione da: "Alberto"
Per abilitare/disabilitare gli interrupt,invece che caricare opportunamente i registri appositi, non si potrebbe sostituire il tutto con un normale SEI e CLI?
 
Lo credevo anche io fino a che non mi sono imbattuto negli High score saver da installare nei miei cracks :)
Questo ad esempio e' quello che ho dovuto fare in Netherworld
Codice: [Seleziona]
   SEI
    jsr noirq
    lda #$00
    sta $d01a; blocca gli interrupt in arrivo
    LDA #$37
    STA $01
    jsr ioin
    [...]

noirq  
    jsr l; prima LEGGO da DCOD per liberarmi gli irq pendenti
    LDA #$7F; poi blocca tutto
    STA $DC0D
    STA $DD0D
l   LDA $DC0D
    LDA $DD0D
    rts
ioin  
    ldx #2
t   lda $00,x
    sta $4000,x
    inx
    bne t
    LDX #$00
    LDY #$41
    sec
    jsr $fd1a; prima copio i vettori correnti a $4100
    jsr $fd15; poi ripristino quelli veri
    rts
Non sai quante volte mi si e' bloccato prima di arrivare alla soluzione finale :)
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Lss Mimigame
« Risposta #14 il: 26 Maggio 2004, 22:23:24 »
 
Citazione
Per ottenere l'effetto voluto,basta sostituire LDA $FB,X con LDA ($FB),Y.

Ah gia' ora ho notato bene la tabella degli opcode. Si puo' fare solo con Y.

Citazione
nel primo caso

$FB $FC

01   08     --> y= 3 -> lda ($fb),y -> A contiene il valore in $0804

nel secondo caso

$FB $FC

01   08     --> x=3 -> lda ($fb,x) -> A contiene il valore nella locazione puntata da
                                                    $FE-$FF
Ok, ora credo di aver capito
lda ($fb),y per leggere un Array puntato da $fb/$fc e con indice Y. In effetti la uso spesso anche nei miei trainers.
lda ($fb,x) e' un array di puntatori, per selezionare un puntatore con indirizzo $fb+X e da li' andare a leggere la locazione puntata da  $fb+X/$fb+X+1 .
Quindi e' bene che x sia incrementato sempre di 2 se abbiamo una serie di puntatori.
Minc*a, da usare solo se costretti :P
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -