-
Notifications
You must be signed in to change notification settings - Fork 10
Achievement Templates
Here you'll see examples of some typical achievements. You can use them as inspiration to create your own achievement. But keep in mind the following:
EVERY GAME IS DIFFERENT! The memory has a different behavior from game to game.
So do NOT take these examples as a rule. They are here just for educational purposes.
In these examples we use the following convention 0xLEVEL is the memory address with the level ID; 0xLIFE is the address used for the character life; 0xTIME for time, 0xITEM for getting an item, etc...
In this example we want to award when the player finish the level N
and goes to level N+1
.
ID | Special? | Memory | Cmp | Type | Mem/Val | Hits |
---|---|---|---|---|---|---|
1 | 0xLEVEL | = | Value | N | (1) | |
2 | 0xLEVEL | = | Value | N+1 | ||
3 | 0xLEVEL | > | Delta | 0xLEVEL | ||
4 | ResetIf | 0xLEVEL | = | Value | TITLE |
Conditions
- On level
N
at least one time - Currently at level
N+1
- The level has been increased
- Reset the hit counter when back to title screen
The value 0xTITLE means "at game's title screen". You need to ResetIf
going to the title screen to avoid the awarding at a wrong time.
Here is an example of game flow that could make the achievement trigger at a wrong time if it wasn't for that ReseIf:
- Start the game and reach level 2 (this make the hit counter goes to 1)
- Get a game over while on level 2
- Go back to the title screen
- Use a password for level 3
If not using the ResetIf we will have these conditions:
- Hit level 2: TRUE
- Current level = level 3: TRUE
- Level increased (from title/password screen to level 3): TRUE
And it would be enough to trigger the cheevo (at a wrong time). That's why we're using the ResetIf
in this example.
In this example we consider a game where the time decreases (e.g.: Super Mario Bros). Adapt it accordingly the time on your game has a different behavior.
We want to award if the player finishes the level N
while time is greater than T
.
ID | Special? | Memory | Cmp | Type | Mem/Val | Hits |
---|---|---|---|---|---|---|
1 | 0xLEVEL | = | Value | N | (1) | |
2 | 0xLEVEL | = | Value | N+1 | ||
3 | 0xLEVEL | > | Delta | 0xLEVEL | ||
4 | ResetIf | 0xLEVEL | = | Value | TITLE | |
5 | 0xTIME | >= | Value | T |
Conditions
Conditions 1-4 are the same as Finish Level N template.
- time is greater than
T
Keep in mind that besides knowing how the time behaves in game you also need to research how it behaves in memory.
ID | Special? | Memory | Cmp | Type | Mem/Val | Hits |
---|---|---|---|---|---|---|
1 | 0xLEVEL | = | Value | N | (1) | |
2 | 0xLEVEL | = | Value | N+1 | ||
3 | 0xLEVEL | > | Delta | 0xLEVEL | ||
4 | ResetIf | 0xLEVEL | = | Value | TITLE | |
5 | 0xSCREEN | = | Value | LVL_N_INTRO | (1) | |
6 | ResetIf | 0xLIFE | < | Delta | 0xLIFE |
Conditions
Conditions 1-4 are the same as Finish Level N template.
- a checkpoint to represent the point from where the player is suposed to start the chalenge of not losing a life. If the game has a level intro screen, it can be a good checkpoint.
- reset hit count if life decreased.
ID | Special? | Memory | Cmp | Type | Mem/Val | Hits |
---|---|---|---|---|---|---|
1 | 0xLEVEL | = | Value | N | (1) | |
2 | 0xLEVEL | = | Value | N+1 | ||
3 | 0xLEVEL | > | Delta | 0xLEVEL | ||
4 | ResetIf | 0xLEVEL | = | Value | TITLE | |
5 | 0xITEM | = | Value | TRUE |
Conditions
Conditions 1-4 are the same as Finish Level N template.
- the player have the item
ID | Special? | Memory | Cmp | Type | Mem/Val | Hits |
---|---|---|---|---|---|---|
1 | 0xLEVEL | = | Value | N | (1) | |
2 | 0xLEVEL | = | Value | N+1 | ||
3 | 0xLEVEL | > | Delta | 0xLEVEL | ||
4 | ResetIf | 0xLEVEL | = | Value | TITLE | |
5 | ResetIf | 0xWEAPON | = | Value | TRUE |
Conditions
Conditions 1-4 are the same as Finish Level N template.
- reset hit count if the weapon was used
Here's a way to check if an item is collected in the level/room ID it is supposed to be collected. It avoids awarding an "get item X" by loading a savestate where player already has the item.
ID | Special? | Memory | Cmp | Type | Mem/Val | Hits |
---|---|---|---|---|---|---|
1 | 0xITEM | = | Value | FALSE | (1) | |
2 | 0xITEM | = | Value | TRUE | ||
3 | ResetIf | 0xLEVEL | != | Value | collect level |
Conditions
- Do not have the item while on the collect level, the hit is a checkpoint so 1&2 can both be true at once.
- Have the item
- Reset hit counter if in a level different than the one where the item must be obtained
Conditions 1 and 3 together mean "arrived the level/Room ID without the item".
Even if the player loads a savestate and goes to the required level they will not be able to add hits to condition 1, thus they can't get it except in normal gameplay.
It does not necessarily have to be level/Room ID. There are other ways to approach this problem, for example a unique Mem/Val that only occurs on collection. Etc.
In this example we want to detect a value changing from 2f
to ff
ten times:
ID | Special? | Type | Memory | Cmp | Type | Mem/Val | Hits |
---|---|---|---|---|---|---|---|
1 | Mem | 0xADDRESS | = | Value | 0xff | (10) | |
2 | Delta | 0xADDRESS | = | Value | 0x2f | (10) | |
3 | PauseIf | Mem | 0xADDRESS | = | Delta | 0xADDRESS |
Concept For Not allowing worn mask in Majora's Mask in 3 certain zones and collecting and depositing all eggs
Core:
Egg in fortress 1 hit (not collected)
Egg not in fortress 1 hit (collected)
"" above 2 for each egg
Delta was Great Bay Area ID 1 hit (a checkpoint for before getting egg 1)
ALT 1
ResetIf mask on
PauseIf != Zone ID1
ALT 2
ResetIf mask on
PauseIf != Zone ID2
ALT 3
ResetIf mask on
PauseIf != Zone ID3
ALT 4
All eggs turned in 0 hits
- 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