-
Notifications
You must be signed in to change notification settings - Fork 10
Circumvent the Problem of a Counter Incrementing Twice in the Same Frame es
En este ejemplo veras como evitar el problema de que un contador se incremente dos veces en el mismo frame combinando un SubSource y AddHits.
En la libreria del Game Boy Advance hay un plataformero Navideño conocido como Santa Claus Jr. Advance. Hay algunos logros de coleccionar varios dulces en cada uno de los Stages Bonus.
Esos logros se suponen que tendrian que ser algo simple, como esto:
ID | Special? | Memory | Cmp | Type | Mem/Val | Hits |
---|---|---|---|---|---|---|
1 | 0xDULCES | != | Delta | 0xDULCES | (N) | |
2 | ResetIf | 0xSTAGE | != | Value | 0xBONUS |
Esto se traduciría "checa si el contador de dulces cambio N
veces en el stage bonus".
Nota: estamos utilizando 0xDULCES != Delta 0xDULCES
(utilizando !=
, y no >
) porque cuando el jugador cuenta con 99 dulces y colecciona uno mas el contador se va a cero.
Sin embargo, hay un aspecto en este juego (y muchos otros) donde si el jugador colecciona 2 dulces a la vez el contador va a aumentar por 2 en el mismo frame. Cuando pasa el contador de hits es aumentado por uno mientras que el contador de dulces aumento en dos. Esto, obviamente, arruina la lógica que utilizamos arriba.
En manera que podamos evitar este problema tenemos que utilizar la técnica de utilizar SubSource
para contar incrementos específicos combinado con una
AddHits
flag.
Echemos un vistazo a la lógica del logro y así poder ver la explicación:
Variables (Addresses)
-
0x80dc
: Contador de Dulces. -
0x809c
: ID de Stage.
Así que ahora la estructura de logro seria de esta manera:
Condiciones
-
Junto con la condición 2, es un truco para ver si
0xDULCES - Delta 0xDULCES = 2
. En otras palabras, el contador de dulces fue incrementado por dos. -
Utilizando a la vez con la condición 1 (como se explica arriba) y 3. Como se explica en su respectiva pagina, cuando la condición de
AddHits
es verdadera, el hit counter en la siguiente condición es incrementado. Entonces , en nuestro ejemplo de aquí, cuando condición 2 es verdadera, el hitcounter en condición 3 es incrementado. -
Contador cuando el contador de dulces cambia.
-
Resetear contador si no se encuentra en un Stage Bonus.
Todas esta condiciones se pueden traducir como "mientras estés en un stage bonus, salta el logro si el contador de dulces cambia 99 veces, y si el contador de dulces es incrementado por 2 en el mismo frame, añade un cambio extra al contador de dulces."
- 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