-
Notifications
You must be signed in to change notification settings - Fork 10
Leaderboards pt_BR
Link para o texto em inglês: Leaderboards
Atualmente Leaderboards podem ser editadas por desenvolvedores no site. É uma interface bastante robusta e um trabalho difícil para fazer com que uma leaderboard funcione corretamente. É realmente necessário algum cuidado e atenção para obter uma boa leaderboard, então, neste documento nós vamos tentar entender como isto funciona.
Isto é como uma lista de Leaderboard de um jogo aparece no site
No centro você pode ver todas as Leaderboard feitas, e na coluna direita você pode ver as Code Notes (Notas de Código). As Code Notes estão aqui para ajudar com algumas condições que veremos abaixo.
Aqui está uma breve explicação de cada canpo de uma Leaderboard:
- Título: O título de uma Leaderboard
- Descrição: A descrição de uma Leaderboard
-
Formato: Isto pode ser
Pontuação
,Tempo (Frames)
,Tempo (Milissecondos)
orValor
. É usado para distinguir que tipo de leaderboard é (Nos vamos falar disso abaixo) - "LowerIsBetter" ("Abaixoémelhor") caixa de marcação: Quando marcado, isso quer dizer, um valor baixo é a melhor coisa. É geralmente usando em casos de leaderboards baseadas em tempo, enquanto uma pontuação maior geralmente é melhor.
- **Start: Inicia as condições, aka STA
- Cancel: Cancela as condições, aka CAN
- Submit: envia as condiçoes, aka SUB
- Valor: Um intérprete de valores, aka VAL
Nota: Uma leaderboard válida DEVE ter todas as quatro condições.
Esses 4 últimos campos são realmente importantes e MUITOS cuidados devem ser tomados na entrada de qualquer caracter dentro dessas linhas. É por isso que eles merecem uma explicação mais na frente:
A condição STA ou Start é uma série de valores, como uma conquista, isso deve ser verdadeiro para começar a procurar uma Leaderboard. Uma vez que o STA for verdadeiro, o jogo irá ativar os outros tres
Se a condição Cancel (CAN) for verdadeira, ela irá cancelar todo o progresso relativo a sujeição da leaderboard. Se no entanto a condição Submit (SUB) for verdadeira, entao, o placar gerado na leaderboard irá ser enviado
Finalmente, o Valor (VAL) é um caso especial, e irá ser pegado da memória usando a formula iniciada na caixa de memória (memory box)
O Endereço de memória para STA/CAN/SUB/VAL tem o segunte formato:
location/size | prefix (the letters can be in lower case) | example |
---|---|---|
bit0 | 0xM |
0xM01234 |
bit1 | 0xN |
0xN01234 |
bit2 | 0xO |
0xO01234 |
bit3 | 0xP |
0xP01234 |
bit4 | 0xQ |
0xQ01234 |
bit5 | 0xR |
0xR01234 |
bit6 | 0xS |
0xS01234 |
bit7 | 0xT |
0xT01234 |
Lower4 | 0xL |
0xL01234 |
Upper4 | 0xU |
0xU01234 |
8bit | 0xH |
0xH01234 |
16bit | 0x |
0x01234 |
32bit | 0xX |
0xX01234 |
location: localização / size: tamanho / prefix: prefixo / the letters can be in lower case: as letras podem ser minusculas / example: exemplo
Nota do tradutor: Não foi colocado na caixa acima pois iria alterar muito do texto original
O melhor lugar para iniciar é olhando uma das leaderboards existentes http://retroachievements.org/leaderboardList.php e desmontar para ver como funciona. Nós iremos usar o Green Hill Act 1 (Sonic the Hedgehog) Leaderboard para este propósito. Vamos ver como fica:
O campo Titulo/Descrição são um pouco óbvio.
O Tipo é "Tempo (Frame)". Em Sonic a cada 60 frames é 1 segundo, entao eles irao monitorar o tempo usando os frames.
A caixa marcada Lower Is Better está marcada, entao aquele que fizer o tempo mais curto será o #1.
Agora nos vamos explicar as partes mais importantes.
STA: 0xfe10=h0000_0xhf601=h0c_d0xhf601!=h0c_0xfff0=0
-
0xfe10=h0000
: Se o endereço da RAM 0xfe10 é equivalente hex 0000, -
_
: E, -
0xhf601=h0c
: Se o endereço da RAM 8-bits 0xf601 é equivalente para hex 0c, -
_
: E, -
d0xhf601!=h0c
: Se o endereço da RAM 8-bits anterior 0xf601 NÃO é equivalente ao 0c, -
_
: E, -
0xfff0=0
Se o endereço da RAM 0xfff0 é equivalente ao 0.
Esto parece ser intimidador, porque nos nao sabemos o que esse endereço diz. É por isso que o Code Note na coluna direita é de bastante ajuda! Voce pode ser como esses endereços estão classificados na memoria. Em nosso exemplo nos temos:
- 0xfe10 é o nivel, e espera-se que seja 0 (o primeiro nivel).
- 0xf601 é um endereço de memória de 8 bits, e nos usamos o prefixo '0xh' em vez de '0x' para significar isso. 0xf601 é o modo de tela. A segunda e terceira parte do inicio desta afirmação está dizendo "o atual modo deveria ser 'ingame' (0c) e o modo anterior NAO deve ser 'ingame'. Note que 'd' representa delta, ou "o valor do frame anterior". Em outras palavras, isto ativa se caso iniciarmos um nivel (o início do nível, quando queremos começar a testar seu tempo).
- Finalmente nos alem de esperar que 0xfff0 seja aquivalente a 0, porque 0xfff0 é o modo de demonstração e nos não queremos enviar pontuações para a leaderboard quando a demo estiver ativa!
CAN: 0xhfe13<d0xhfe13
- 0xfe13 é o numero de vidas.
A seção de cancelamento checa se o contador de VIDAS do jogar se tormar menor. Literalmente, isto diz "Cancela se o ATUAL valor em 0xfe13 é menor que o valor ANTERIOR em 0xfe13. Nos queremos que faça isso porque voce pode alcançar o checkpoint final e correr fora do tempo, resetando seu contador para 0:00. Nos nao queremos permitir isso, porque isto nao é a forma correta de completar o nivel. Entao, se o jogardor morrer, nos resetamos o progresso do leaderboard dele.
SUB: 0xf7cc!=0_d0xf7cc=0
- 0xf7cc isto é a bandeira de final de fase, não-interativo.
A seção de envio checa se o frame atual tem o marcador de 'endlevel' (fim de fase) for para verdadeiro (ou !=0
, 'naozero'), e o frame anterior (delta) tem isto para ser falso (ou =0
, 'zero'). Isto sugere que o jogador chegou ao fim do nivel, e provou ser um benchmark bastante robusto
Dica: isto pode ser util para observar estes valores na memória para ver como eles executam, e que tipo de valores eles terminam em diferentes circunstancias.
VAL: 0xhfe24*1_0xhfe25*60_0xhfe22*3600
Finalmente, valores. Uma vez que o jogador chegou ao inicio da condição, elel irão ser mostrados em uma caixa quue permanece na tela, aparecendo o progresso deles ate agora. Se é uma leaderboard de tempo, será um relógio, e se for uma pontuação, será apenas o valor. Se eles cumprirem a condição de cancelamento, eles serão informados de que eles falharam, e o pop-up será removido. Se caso o jogador chegar com sucesso à condição de envio, o valor atual será pego e submetido como pontuação. o pop-up ingame irá informar o jogador o tao longe da leaderboard, e a posição deles na leaderboard.
A condição de valor é especial em poucas maneiras. Ele é avaliado constantemente e exibido na tela o tempo todo quando a leaderboard está ativa. Isto nao funciona como as outras condiçoes. isto espera endereços da seguinte maneira:
endereço*modificador
(endereço tempo modificador)
e usa o _
sublinhado como um 'plus'. O *
asterisco significa 'multiplo', entao no valor
0xhfe24*1_0xhfe25*60_0xhfe22*3600
representa:
8-bit 0xfe24 vezes 1, PLUS 8-bit 0xfe25 vezes 60, PLUS 8-bit 0xfe22 vezes 3600
A razão para isso é que os valores em cada um desses endereços significam frames, segundos e minutos respectivamentes. Quando nos adicionamos esses valores juntos, nos conseguimos um grande total em frames que vamos enviar para o "Banco de dados".
Lembre que o campo 'Formato' pode ser Pontuação, Tempo (Frames), Tempo (Milisegundos) ou Valor. Tempo(Frames) é o mais comum, e representa 'frames'. Tempo (Milisegundos) espera um valor que nos podemos converver diretamente para milisegundos. (Super Mario Kart usa isso). No entanto, para converter um valor em frame dentro de um formato "para ser lidos por humanos", nos devemos dividiu o valor por 60 para uma representação de segundos correta, e um valor em milisegundos deve ser dividido por 100 para conseguir o numero de segundos. Isso é usado no site e no aplicativo para exibir o valor apropriadamente, e é importante para distinguir, para que possamos ter certeza de obter o valor mais preciso do emulador, usando qualquer formato que eles usem para registrar o tempo.
Infelizmente há MUITAS maneiras de este processo dar errado, entao, se voce tiver algum problema, sinta-se livre pra pedir ajuda em nosso servidor do Discord.
Se voce quer praticar, é altamente recomendado criar sua propria leaderboard e tentar alguma coisa em um novo jogo, melhor que usar uma leaderboard existente
Por favor, lembre-se que esses arquivos são puxados diretamente para o jogo de alguém se eles decidirem jogá-lo, e uma má formação de endereço de memória ou linha pode causar um crash no emulador, entao por favor, teste seu codigo da leaderboard!
- User Guidelines
- Developer Guidelines
- Content Guidelines
- FAQ
- Setup Guide
- Emulator Support and Issues
- Ways to Contribute
- RABot, the RA Discord Robot
- Events
- Overlay Themes
- Useful Links
- Contributing with the docs
- About Us
- Tutorials
- Developer Docs
- How to Become an Achievement Developer
- Getting Started as an Achievement Developer
- Game Identification
- Achievement Design
- Achievement Scoring
- Difficulty Scale and Balance
- Progression and Win Condition Typing
- Badge and Icon Creation
- Achievement Development Overview
- Flags
- BitCount Size
- Alt Groups
- Hit Counts
- Delta Values
- Prior Values
- Value Definition
- Condition Syntax
- Minimum Required Versions for Logic Features
- Memory Inspector
- Real Examples
- Set Development Roadmap
- Achievement Templates
- Tips and Tricks
- Leaderboards
- Rich Presence
- RATools
- Console Specific Tips
- Emulator Hotkeys for Developers
- libretro core support
- Docs To Do List
- WIP User Code of Conduct
- WIP CoC FAQ
- WIP Content Guidelines
- WIP-Jr
- WIP---Dev-Tips---Code-Notes-En-Masse
- WIP-‐-Reauthorship-Policy
- Manifesto RetroAchievements
- Código de Conduta do Usuário
- FAQ - Perguntas Frequentes
- Como contribuir se você não é um desenvolvedor
- Tutorial para Jogos Multi-Discos
- Introdução
- Primeiros Passos como um Desenvolvedor de Conquistas
- Recursos de Lógica para Achievements
- Exemplos Reais
- Dicas e Truques
- Dicas Específicas de Console
- Modelos de Achievement
- Escala de Dificuldade e Equilíbrio
- Roteiro de Desenvolvimento de um Set de Conquistas
- Criação de Ícones e Emblemas
- Leaderboards
- Rich Presence
- Design de Conquistas
- Manifesto RetroAchievements
- Código de Conducta del Usuario
- FAQ - Preguntas Frecuentes
- Tablas Globales y Reglas para la Casería de Logros
- Mi juego no esta cargando los logros
- Como contribuir si no eres un desarrollador
- Por que no deberías utilizar la función de cargar estado
- Contribuyendo con los documentos
- Como funciona la Documentación de RA
- Descargas
- Intro
- Código de Conducta del Desarrollador
- Como convertirme en un Desarrollador de Logros
- Primeros pasos como un Desarrollador de Logros
- Un vistazo al Inspector de Memoria
- Características en la Logica de un Logro
- Ejemplos Reales
- Intro
- Utilizando Hit Counts como un Temporizador
- Utilizando Valores Delta y Hit Counts para Detectar un Incremento
- Un Ejemplo Simple en como evitar el Abuso de Estados de Guardado
- Evitar el Problema de que un Contador se Incremente Dos Veces en el Mismo Frame
- Creando un Temporizador con un ResetIf Hits basándote en la Velocidad de un Juego
- Plantillas para Logros
- Tips y Trucos
- Escala de Dificultad y Balance
- Diseño de Logros
- Mapa de Desarrollo de Set
- Revisiones en Set de Logros
- Creación de Iconos y Badges
- Tablas de Clasificación
- Rich Presence
- Trabajando con el ROM apropiado
- Identificación del Juego
- Guía para Sets Bonus
- Logros para ROM hacks
- Tips Específicos por Consola