Banner
  • Nosso banner:
    SMW Tech

Parceiros
SMW Central



Forumeiros

Conectar-se

Esqueci minha senha

Últimos assuntos
» Super Mario Kingdom 1 - The Peach Poison
6/9/2015, 00:54 por Shadow Ninja

» Yoshi Quest - The Awakening of Magic
6/9/2015, 00:30 por Shadow Ninja

» como inserir sprite diferente no luigi?
17/5/2015, 16:08 por caiquinus17

» HACK COLLAB BR - POSSIBILIDADE?
13/1/2014, 13:05 por Aeon

» Collab?
12/1/2014, 22:47 por Manuz

» O que querem de novo no fórum?
12/1/2014, 22:46 por Manuz

» Regras (WIP)
12/1/2014, 22:02 por Manuz

» Ghost House
10/1/2014, 18:33 por Mirann

» Tema do fórum?
26/12/2013, 21:07 por Koopster

Estatísticas
Temos 20 usuários registrados
O último usuário registrado atende pelo nome de caiquinus17

Os nossos membros postaram um total de 145 mensagens em 42 assuntos

Tutorial de Counters e Inventários

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Tutorial de Counters e Inventários

Mensagem por Manuz em 10/12/2013, 22:27

TUTORIAL: COMO INSERIR CUSTOM COUNTERS, OBJETOS-CHAVE E “INVENTÁRIOS” USANDO ASM
 
            Uma vez, o Blizzard Man me pediu para explicar como se cria Custom Counters na Status Bar do SMW. Depois de MUITO TEMPO, eis um pequeno tutorial.
            Deseja criar counters para coisas especiais, como por exemplo, Frog Coins? Ou então relíquias que sinalizam que você passou de mundo e permitem o avanço no jogo (Como as que eu fiz, na hack cancelada Super Yoshi’s Galaxy)? Aqui mostrarei tudo o que fiz, e como pode ser feito, usando, é claro, ASM. Se tiver problemas com ASM, sugiro que leia meu tutorial básico, especialmente a parte de CMP e AND, além de tables. Então, ao tutorial:
(1) CUSTOM COUNTERS
            Então, primeiramente, criaremos os custom counters em si. Eles são patches, então você deve saber ao menos fazer um hijack, ou seja, mudar uma rotina original e adicionar a sua customizada, mas sem perder a original! A título de facilitar, dou como exemplo esse aqui:
                        org $008F32
                        JSL Code
                        NOP #5
                        org !Freespace
 
                        Code:
                        LDA $0DBF
                        SEC
                        SBC #$64
                        STA $0DBF
 
            Após o hijack, recomendo fortemente que você use uma RATS Tag, para proteger seu código. Uma notícia boa: você pode colocar múltiplos counters em um patch só!
            Agora, você deve prestar atenção em dois tipos de RAM essenciais aqui. O primeiro tipo são as FreeRAMs que você pode usar. Recomendo fortemente que use as RAMs $1F2B, $1F2C e $1F2D para counters definitivos, já que elas são salvas na SRAM. Se não, use o SRAM expand patch. O outro tipo são as RAMs de posição na Status Bar. As RAMs vão de $0EF9 a $0F2F.
            Agora, após o hijack, você só vai fazer o seguinte: carregue sua RAM do counter (LDA $1F2B, por exemplo). Agora, faça um JSL para essa rotina abaixo:
            HexToDec:                 ; HEX->DEC converter
                     LDX #$00         ;> Set X to 0
StartCompare:
                     CMP #$0A                   ;\
                     BCC ReturnLong         ; |While A >= 10:
                     SBC #$0A                    ; |Decrease A by 10
                     INX                              ; |Increase X by 1
                     BRA StartCompare      ;/
ReturnLong:
                     RTL
           
            E se seu counter for de três dígitos? Simples, use essa rotina aqui:
 
HexToDec:                        ;HEX->DEC converter
                     LDX #$00                ;> Set X to 0
                     LDY #$00                ;> Set Y to 0
StartCompare1:
                     CMP #$64                    ;\
                     BCC StartCompare2    ; |While A >= 100:
                     SBC #$64                     ; |Decrease A by 100
                     INY                              ; |Increase Y by 1
                     BRA StartCompare1    ;/
StartCompare2:
                     CMP #$0A                   ;\
                     BCC ReturnLong         ; |While A >= 10:
                     SBC #$0A                    ; |Decrease A by 10
                     INX                              ; |Increase X by 1
                     BRA StartCompare2    ;/
ReturnLong:
                     RTL
 
           
            Qualquer que seja a rotina escolhida, ela terá o Acumulador com as unidades e a variável X com as dezenas (no último caso, Y terá as cententas). Agora, simplesmente as arranje na Status Bar (use STA, STX e STY) e complemente sua edição com o Status Bar Editor. Quer um exemplo? Imagine que eu queira um counter onde fica o “MARIO”. Eis o exemplo:
 
                        org $008F32
                        JSL Code
                        NOP #5
                        org !Freespace
 
                        ««RATS TAG»»
 
                        Code:
                        LDA $0DBF
                        SEC
                        SBC #$64
                        STA $0DBF
 
                        LDA $1F2B
                        JSL HexToDec
 
                        STA $0EFE    ; Arranja as unidades na Status Bar
                        STX $0EFD   ; Dezenas
                        STY $0EFC    ; Centenas
 
                        ««ROTINA DE CONVERSÃO HEX-DEC»»
                        ««CUSTOM CODE»»
 
            Parabéns, agora você pode criar counters! Mas agora, como afetá-los? SIMPLES! Crie custom blocks que alterem o valor da RAM do Counter (exemplo, um bloco que tenha INC $1F2B no code, ou LDA $1F2B : CLC : ADC #$xx : STA $1F2B) e divirta-se! Você pode criar counters como dinheiro, tesouros, entre outros... mas e um sistema de “inventário” simples? Veremos na próxima seção.
 
         (2) “INVENTÁRIOS” SIMPLES NA STATUS BAR
            Essa parte vai ser um pouco mais chatinha, por que teremos que usar AND para nos ajudar. Comece do mesmo jeito um patch, como mostrado acima. Agora, a melhor forma de se fazer um sistema desses é com bits, assim você pode condicioná-los mais facilmente. Digamos que você queira, por exemplo, colocar um sistema de relíquias encontradas na status bar. Use de novo uma daquelas três FreeRAMs se for algo pro jogo todo ($1F2x). Agora, eis como fazer: Carregue a RAM e vá testando... BIT A BIT. Note que com esse método estou assumindo que você colocará um inventário de no máximo OITO elementos. Eis o pedaço de código:
            LDA $1F2B
            AND #$01
            BNE Item1
            AND #$02
            BNE Item2
            AND #$04
            BNE Item3
            ...
            AND #$80
            BNE Item8
            Item1:
            Item2:
            Item3:
            ...
            Item8:
 
            Logo após, a parte chata: Ponha LDA #$xx em CADA UM (#$xx é o número do tile a ser usado, veja o link que eu mostrei acima) e STA $yyyy ($yyyy é a posição, reveja o link) E um BRA Skip. No Skip, continue seu código. Exemplo:
            LDA $1F2B
            AND #$01
            BNE Item1
            AND #$02
            BNE Item2
            AND #$04
            BNE Item3
            ...
            AND #$80
            BNE Item8
            Item1:
                        LDA #$FF
                        STA $0EF9
                        BRA Skip
            Item2:
                        LDA #$0E
                        STA $0EFA
                        BRA Skip
            Item3:
            ...
            Item8:
                        LDA #$08
                        STA $0F00 ; como já vamos pro Skip, nada de BRA Skip
            Skip:
                        ««SEU CODE»»
 
            Agora, como modificar a RAM agora? Use TSB e TRB para colocar os bits como 1 ou 0, respectivamente. Exemplo: LDA #$80 TSB $1F2B ativa o bit mais significativo da RAM $1F2B, alterando o counter na status bar. Use esse código em blocos ou sprites que você quer que alterem seu “inventário”. Mas e itens que devem ser coletados SOMENTE UMA VEZ? São os objetos-chave ou RELÍQUIAS, na última seção desse tutorial.
 
            (3) RELÍQUIAS – O CÓDIGO DE COLETA
            Agora, se você quer um sistema de inventário com objetos que só podem ser coletados UMA ÚNICA VEZ, faça o seguinte: repita a estratégia de counter acima, e crie um SPRITE para cada relíquia, que use TSB para ativar os bits. Para economizar em ASMs, use isso aqui:
            LDA $7FAB28,x
            TSB $1F2B
 
Agora, é só criar os .cfg para o MESMO .asm modificando apenas o Extra Property Byte 1. Isso vai otimizar a inserção.
            Tudo bem, mas e a parte de coleta ÚNICA desses sprites? Ponha esse código na rotina INIT do Sprite:
LDA $7FAB28,x
PHX
LDX $000DB2
BIT $001F2C,x
BEQ NEXT1
PLX
STZ $14C8,x              ; Erase sprite if already gotten
RTL
NEXT1:          PLX
JSR SUB_HORZ_POS        ;face mario initially
TYA
STA $157C,x
RTL
 
            Na rotina MAIN, logo após o LDA $7FAB28,x : TSB $1F2B, coloque isso aqui:
PHY
                        LDY $000DB2
                        LDA $001F2C,y
                        ORA $7FAB28,x
                        STA $001F2C,y
                        PLY
 
            Após criar tudo isso, recomendo sinceramente que adicione uma coisa por vez, e que teste TUDO! Como você está mexendo com partes sensíveis da ROM, qualquer erro te dará um CRASH, então esteja avisado!
            Espero ter sido de grande ajuda com esse tutorial, mas ele será melhor aproveitado se você tiver conhecimentos ao menos elementares de ASM. No mais, custom counters não são difíceis de fazer. Qualquer coisa, me mandem PM. Terei prazer em ajudá-los. Divirtam-se criando seus counters e relíquias!!!
 

                                                                       Manuz, major Flare


Última edição por Manuz em 11/12/2013, 12:58, editado 1 vez(es) (Razão : Legenda Laranja - precisa de muita coisa sobre ASM e afins.)
avatar
Manuz
Estrela Nova
Estrela Nova

Mensagens : 47
Pontos : 1416
Data de inscrição : 10/12/2013
Idade : 22
Localização : Deathbringer Burrow
Humor : Neutro

Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo


 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum