#Fabio Quinzi 0000210574
#Alfredo Saglimbeni 0000241904
#Gabriele Verardi   0000119364

    .text
    .globl main

main:       la $a0,menu            
            jal stampas
            
#####################################################
#MENU A SCELTA                                      #            
switch:     la $a0,menuPrompt
            jal stampas
            jal leggii      
            beq $v0,1,inizio
            beq $v0,2,istruz
            beq $v0,3,credit
            beq $v0,4,esci
            j switch                     
            
#####################################################
#ISTRUZIONI DEL GIOCO                               #           
istruz:    la $a0, istruzS
           jal stampas          
           j end
           
#####################################################
#CREDIT DEL GIOCO                                   #           
credit:    la $a0, capolungo
           jal stampas
           la $a0, credits
           jal stampas           
           j end

#####################################################
#INIZIO DEL GIOCO                                   #           

#####################################################
#GIOCATORE FITTIZIO                                 #
inizio: la $a0, capolungo
        jal stampas
        la $a0,fittiz
        jal stampas
        la $a0,soluz        #giocatore fittizio inserisce la sequenza da indovinare
        li $a1,5
        jal leggis
        jal fcontrolseq
        la $a0,capolungo
        jal stampas
        la $a0,play         #intestazione a inizio gioco
        jal stampas
        li $s3,10
          
#####################################################
#GIOCATORE REALE                                    #        
start:  subu $s3,$s3,1      #riduce il contatore dei tentativi
        la $a0,tenta        #///sequenza Costruzione grafica \\\
        jal stampas         #              ||               # 
        move $a0,$s3        #              ||               #
        jal stampai         #  stampa il numero tentativo   #
        la $a0,spazio       #              ||               #
        jal stampas         #              ||               #
        la $a0,indov        #              ||               #
        li $a1,5            #              ||               #
        jal leggis          #leggo la sequnza del  giocatore#
        la $a0,fintab       #              ||               #
        jal stampas         #     \\\Fine sequenza ///      #
        jal rcontrolseq
        li $s2,0            #  contatore colori indovinati  #
        li $t1,0            #              ||               #
        li $t3,0            #    \\Fine inizializzazione//  #
loop1:  lb $t2,indov($t3)         #Inizio ciclo di controllo sequenza player
loop2:  lb $t0,soluz($t1)
        addi $t1,1
        beqz $t0,error
        bne $t2,$t0,loop2   #termine controllo della seqenza colori
        subu $t1,$t1,1      #se passo di qui il colore è giusto devo verificare la posizione           
        bne $t1,$t3,nopos   #controllo la posizione e salto a --> nopos se non uguale 
        la $a0,nero         #coretto nella pos giusta
        addi $s2,1
        j loop3
nopos:  la $a0,bianco       #colore coretto ma nella pos sbagliata
        j loop3        
error:  #colore sbagliato
        la $a0,err
loop3:  jal stampas         #stampo il carattere se è corretto nella pos giusta 
        # o se è corretto pos sbagliata o errato        
        li $t1,0            # termine controllo del carattere passo a quello successivo
        addi $t3,1
        blt $t3,4,loop1        
        beq $s2,4,vinto     #se il giocatore indovina la sequenza esco dal ciclo e stampo il messaggio di vincita
tentctr:bnez $s3,start      #continua a ciclare finchè i tentativi non sono terminati        
        la $a0,frase
        jal stampas 
        jal stampc          # stampo la sequnza con i nomi dei colori
        la $a0,pe0          #se arrivo qua sono finiti i tentativi e ho perso
        jal stampas        
        j end
vinto:  la $a0,frase        # arrivo in au in caso di vittoria!
        jal stampas 
        jal stampc          # stampo la sequnza con i nomi dei colori
        la $a0,frase2
        jal stampas
        li $t0,10
        subu $t0,$t0,$s3    #calcolo il numero di tentativi
        move $a0,$t0
        jal stampai         #stampo il numero di tentativi
        la $a0,vi0       
        jal stampas
end:    jal leggii         #fine del gioco attendo invio per ricominciare
        j main
esci:   li $v0,10          #termine programma
        syscall   
        
#####################################################
#FUNZIONI PREDEFENITE                               #

      #stampa stringhe  
stampas: li $v0,4
         syscall
         jr $ra
    #stampa interi
stampai: li $v0,1
         syscall
         jr $ra
    #legge stringa
leggis:  li $v0,8
         syscall
         jr $ra
    #leggi integer        
leggii: li $v0,5
        syscall
        jr $ra

# stampa i nomi della sequenza di colori
stampc: li $t0,0
coloop1:lb $t2,soluz($t0)
        la $t3, colori
coloop2:lw $t4, ($t3)
        lb $t5,($t4)
        addi $t3,4
        bne $t5,$t2,coloop2        
        move $a0, $t4
        move $t6,$ra
        jal stampas
        move $ra,$t6
        addu $t0,$t0,1
        blt $t0,4,coloop1 
        jr $ra

#controllo la corretteza nella seqenza colori del giocatore fittizio

fcontrolseq: li $t0,0
fctrloop1:   addu $t1,$t0,1
             lb $t2, soluz($t0)
fctrloop2:   lb $t3, soluz($t1)
             addi $t1,1
             beq $t2,$t3,fseqerr
             blt $t1,4,fctrloop2
             li $t3,0
fctrloop3:   lw $t4, colori($t3)
             lb $t5,($t4)
             addi $t3,4
             beq $t5,$t2,fseqend
             blt $t3,24,fctrloop3    
fseqerr:     j inizio                                           
fseqend:     addi $t0,1
             blt $t0,4,fctrloop1
             j $ra

#controllo la corretteza nella seqenza colori del giocatore fittizio
            
rcontrolseq: li $t0,0
rctrloop1:   addu $t1,$t0,1
             lb $t2, indov($t0)
rctrloop2:   lb $t3, indov($t1)
             addi $t1,1
             beq $t2,$t3,rseqerr
             blt $t1,4,rctrloop2
             li $t3,0
rctrloop3:   lw $t4, colori($t3)
             lb $t5,($t4)
             addi $t3,4
             beq $t5,$t2,rseqend
             blt $t3,24,rctrloop3    
rseqerr:     la $a0, frase3
             jal stampas
             j tentctr                                           
rseqend:     addi $t0,1
             blt $t0,4,rctrloop1
             j $ra


#####################################################
#DATI ALLOCATI PER L'APPLICAZIONE                   #        
    .data

#####################################################
#STRINGHE MENU GRAFICHE VARIE                       #        

menu:       .asciiz "\n\n\n\n\n\n     __.--^*@ MASTER MIND |!| MENU DI INIZIO @*^--.__\n\n\n\n -Menu:\n\n    1) Inizi a Giocare\n\n    2) Istruzioni gioco\n\n    3) Credit \n\n    4) Esci\n\n"
menuPrompt: .asciiz "\nScegli (1,2,3,4): "
capolungo: .asciiz "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
fittiz: .asciiz "__.--^*@ MASTER MIND |!| GIOCATORE FITTIZIO @*^--.__\n\n I colori consentiti sono: \n (r)-rosso (g)-giallo (v)-verde (b)-blu (n)-nero (a)-arancione\nInserisci la seqenza di colori da indovinare: "
play: .asciiz "__.--^*@ MASTER MIND |!| INIZIA IL GIOCO @*^--.__\n\n\n--------------- | N   TENTATIVO  | INDOVINA | \n|x| |x| |x| |x| "
frase: .asciiz "\n\n\n\n\nLa seqenza corretta e':"
frase2: .asciiz "\nTentativi usati:"
frase3: .asciiz "|   <<seqenza inserita sbagliata ritenta>>  |\n|x| |x| |x| |x| "
istruzS: .asciiz "\n\n\n\n\n\n Il gioco consiste nell'indoovinare la sequnza di colori corretta.\n si ha a disposizione 10 tentativi.\n Ad ogni inserimento colore corrisponderanno a:\n colore corretto ma nella posizione sbagliata --> |?|\n Colore coretto posizione giusta --> |!|\n colore sbagliato--> |x|\n Buon divertimento.\n\n\n"
credits: .asciiz "Progettato, Sviluppato e testato da:\n   Fabio Quinzi\n    Alfredo Saglimbeni\n    Gabriele Verardi\n"


#####################################################
#STRINGHE - HAI VINTO - HAI PERSO                   #        
vi0: .ascii "\n"
vi1: .ascii "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
vi2: .ascii "!!   _    _   ______   _  !!!  _        _   _   __    _   _______   ______   !!\n"
vi3: .ascii "!!  | |  | | |  __  | | | !!! \ \      / / | | |  \  | | |__   __| |  __  |  !!\n"
vi4: .ascii "!!  | |__| | | |__| | | | !!!  \ \    / /  | | |   \ | |    | |    | |  | |  !!\n"
vi5: .ascii "!!  |  __  | |  __  | | | !!!   \ \__/ /   | | | |\ \| |    | |    | |  | |  !!\n"
vi6: .ascii "!!  | |  | | | |  | | | | !!!    \    /    | | | | \   |    | |    | |__| |  !!\n"
vi7: .ascii "!!  |_|  |_| |_|  |_| |_| !!!     \__/     |_| |_|  \__|    |_|    |______|  !!\n"
vi8: .ascii "!!                        !!!                                                !!\n"
vi9: .asciiz"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n PREMI INVIO PER CONTINUARE"    
pe0: .ascii "\n"
pe1: .ascii "XxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxX\n"
pe2: .ascii "Xx  _    _   ______   _   xXx   ____    ______   ______   ____   ______  xX\n"
pe3: .ascii "Xx | |  | | |  __  | | |  xXx  |  _ \  |   ___| |  __  | |  __| |  __  | xX\n"
pe4: .ascii "Xx | |__| | | |__| | | |  xXx  | |_| | |  |_    | |__| | | |__  | |  | | xX\n"
pe5: .ascii "Xx |  __  | |  __  | | |  xXx  | ___/  |   _|   |     _| |__  | | |  | | xX\n"
pe6: .ascii "Xx | |  | | | |  | | | |  xXx  | |     |  |___  | |\  \   __| | | |__| | xX\n"
pe7: .ascii "Xx |_|  |_| |_|  |_| |_|  xXx  |_|     |______| |_| \__| |____| |______| xX\n"
pe8: .ascii "Xx                        xXx                                            xX\n"
pe9: .asciiz "XxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxX\n PREMI INVIO PER CONTINUARE"   


#####################################################
#STRINGHE DI COSTRUZIONE GRAFICA                    #        
nero: .asciiz "|!| "
bianco: .asciiz "|?| "
err: .asciiz "|x| "
tenta: .asciiz "|  Rimanenti   "
spazio: .asciiz " |   "
fintab: .asciiz "   |\n"

#####################################################
#DATI PER LA SEQUENZA NOMI COLORI                   #        
colori: .word rosso, giallo, verde, nero2, blu, arancio	
rosso: .asciiz "rosso "
giallo: .asciiz "giallo "
verde: .asciiz "verde "
nero2: .asciiz "nero "
blu: .asciiz "blu "     
arancio: .asciiz "arancione "


#####################################################
#DATI DI ALLOCAZIONE PER LA SEQUENZA COLORI         #        
indov: .space 5
soluz: .space 5		

