diff --git a/docs/developer-docs/real-examples/circumvent-the-problem-of-a-counter-incrementing-twice-in-the-same-frame.md b/docs/developer-docs/real-examples/circumvent-the-problem-of-a-counter-incrementing-twice-in-the-same-frame.md index 3cb70f34..e7e657af 100644 --- a/docs/developer-docs/real-examples/circumvent-the-problem-of-a-counter-incrementing-twice-in-the-same-frame.md +++ b/docs/developer-docs/real-examples/circumvent-the-problem-of-a-counter-incrementing-twice-in-the-same-frame.md @@ -14,7 +14,7 @@ Such achievements were supposed to be quite simple, like this: | ID | Special? | Memory | Cmp | Type | Mem/Val | Hits | | --- | -------- | --------- | --- | ----- | --------- | ---- | | 1 | | 0xCANDIES | != | Delta | 0xCANDIES | (N) | -| 2 | ResetIf | 0xSTAGE | != | Value | 0xBONUS | +| 2 | ResetIf | 0xSTAGE | != | Value | 0xBONUS | | This translates into "check if the candy canes counter changed `N` times in the bonus stage". @@ -26,16 +26,16 @@ In order to circumvent this issue we have to use that technique of [using `SubSo Let's take a look at the achievement logic and then we'll see the explanation: -**Addresses** +## Addresses - `0x80dc`: Candy Canes counter. - `0x809c`: Stage ID. So now the structure of the achievement is going to be like this: -![](https://i.imgur.com/sDtPpX9.png) +![Basic achievement logic in editor for Santa Claus Jr](/public/santa-jr-achievement-editor-basic.png) -**Conditions** +## Conditions 1. Together with condition 2, is a trick used to check if `0xCANDIES - Delta 0xCANDIES = 2`. In other words, the candy counter was incremented by two. @@ -47,13 +47,13 @@ So now the structure of the achievement is going to be like this: All these conditions could be translated as "while in the bonus stage, trigger the achievement if the candy counter changes 99 times, and if the candy counter is incremented by 2 in the same frame, count an extra change in the candy counter." -So, now it is 100% solved, right? Well, actually, almost. There is still a very minor exception. Remember it was said before that `!=` was being used instead of `>` because `when the player has 99 candies and collect one more, the counter goes to zero`? +So, now it is 100% solved, right? Well, actually, almost. There is still a very minor exception. Remember it was said before that `!=` was being used instead of `>` because **when the player has 99 candies and collect one more, the counter goes to zero**? This means that, if we get two canes in the same frame (which is already rare), there's a very small possibility that this change will be from `98 -> 00` or from `99 -> 01`. In these only two cases our code won't work, because `00 - 98` is not 2, it is `-98`. Same thing for `01 - 99`, it is not 2, it is also `-98`. Despite being a very unlikely possibility, we should treat this case too. So we're gonna add two more requirements to the code, and it will end up looking like this: -![](https://i.imgur.com/6wePK8N.png) +![Complete achievement logic with edge case handling in editor](/public/santa-jr-achievement-editor-complete.png) It is the same as before, with the only changes being lines 3 and 4, which represents an extra `SubSource + `AddHits``to check if`0xCANDIES - Delta 0xCANDIES = -98`, only to take care of this very minor exception just mentioned. diff --git a/docs/developer-docs/real-examples/creating-a-timer-with-reset-if-hits-based-on-the-speed-of-the-game.md b/docs/developer-docs/real-examples/creating-a-timer-with-reset-if-hits-based-on-the-speed-of-the-game.md index c537faed..c4d6510f 100644 --- a/docs/developer-docs/real-examples/creating-a-timer-with-reset-if-hits-based-on-the-speed-of-the-game.md +++ b/docs/developer-docs/real-examples/creating-a-timer-with-reset-if-hits-based-on-the-speed-of-the-game.md @@ -11,7 +11,7 @@ Every game has an address which is constantly increasing, it functions like a en > Please note that PAL Games (50hz) have a lower framerate than NTSC Games (60hz) and aren't compatible with this method. It is recommended to create every Timer based on the NTSC version of the game, unless PAL version is the only version existing and there is no NTSC Patch available. -**Addresses** +## Addresses - `0x19`: Demo Mode: `01`=Active, `00`=Inactive - `0x1a`: Game Engine (speed based on framerate) @@ -19,13 +19,13 @@ Every game has an address which is constantly increasing, it functions like a en - `0x2c`: Game Progression: `03`=Before Stage starts, `04`=Stage started, `08`=Stage finished - `0x30`: Stage ID (in this example, Stage 1) -![Contra-Timer](https://user-images.githubusercontent.com/8508804/57049681-81f45380-6c4f-11e9-9a35-f62c8124498a.jpg) +![Contra timer achievement setup in editor](/public/contra-timer-achievement-editor.png) Link to Cheevo: [Contra Speedrun](https://retroachievements.org/achievement/65443) -YouTube: [ResetIfHits Demo: Contra Stage 1 60 seconds Speedrun ](https://youtu.be/6PpdG04tM4s) +YouTube: [ResetIfHits Demo: Contra Stage 1 60 seconds Speedrun](https://youtu.be/6PpdG04tM4s) -**Conditions** +## Conditions 1. Activates the Cheevo's 'Hit' when entering a Stage (`03`only appears once in each Stage). diff --git a/docs/developer-docs/real-examples/using-add-source-and-deltas-for-collectibles-and-similar-achievements.md b/docs/developer-docs/real-examples/using-add-source-and-deltas-for-collectibles-and-similar-achievements.md index cd415507..1ef34f7d 100644 --- a/docs/developer-docs/real-examples/using-add-source-and-deltas-for-collectibles-and-similar-achievements.md +++ b/docs/developer-docs/real-examples/using-add-source-and-deltas-for-collectibles-and-similar-achievements.md @@ -9,17 +9,17 @@ In this example is a simple way one can utilize the `AddSource` flag in their ac We'll look at an achievement from [Suikoden (PlayStation)](https://retroachievements.org/game/11255) entitled [Treasure Hunter - Dragon Knights' Domain](http://retroachievements.org/Achievement/80100): -**Addresses Used** +## Addresses Used - `0x1b8244`: bit0-bit4 are treasures in Soniere, bit5 is a treasure at the Northern Checkpoint, and bit6-bit7 are treasures at the Dragon Den. - `0x1b8245`: bit0 is a treasure at the Dragon Den, bit1-bit5 are treasures at Seek Valley, and bit6-7 are treasures in Kalekka. - `0x1b824b`: bit0-bit1 are treasures at the Village of the Hidden Rune, bit2 is unused, bit3-4 are treasures at the Dragon Knights' Fortress, bit5-6 are treasures in Teien, and bit7 is a treasure at Luiken's House. -![addsource-example1](https://u.cubeupload.com/televandalist/docssuikotreasure.png) +![Suikoden achievement editor example](/public/suikoden-achievement-editor-example.png) This particular achievement only requires treasures from Dragon Knights' Fortress, Dragon Den, and Seek Valley; therefore, we only need bit6-7 from `0x1b8244`, bit0-bit5 from `0x1b8245`, and bit3-bit4 from `0x1b824b`. -**Logic Breakdown** +## Logic Breakdown - There are two groups of ten conditions with the main differences being the Delta type and the total. This is to ensure that the player goes from nine of these treasures obtained to having all ten of these treasures obtained. _Note: Remember to use hexadecimal for `AddSource` totals!_ - Since we're using bitflags here, the totals for individual conditions will only ever be 0x00 or 0x01. Obviously, we want them all to be 0x01 for the trigger, but we don't want someone to get the achievement simply by loading a save with all ten treasures already found. @@ -29,11 +29,3 @@ This particular achievement only requires treasures from Dragon Knights' Fortres This method is mostly handy for when the totals between the Delta-type and Mem-type only have a difference of 0x01, but it can be used in various types of achievements: collectibles that are only obtainable one-at-a-time, map completion (such as dungeon-crawlers with viewable maps that get revealed as you enter new areas), learnable skills, bestiaries, completing a certain number of side missions, and many others. If you run into a situation where more than one bitflag in an `AddSource` chain toggles at the same time, you can still utilize this template. However, you'll want to clone the Delta conditions and make it so both totals create a range. Still using the above achievement as an example, the existing total could be changed to `<= 0x09` and the total for the second group could be `>= 0x05`. This would make it so the achievement would trigger if the total goes from 5-9 treasures to 10 treasures. - ---- - -To Do: - -- Provide a separate example for the Delta range. -- Go over using BitCount in a similar achievement. -- Go over using `/` when you need at least one of multiple things. diff --git a/docs/developer-docs/real-examples/using-delta-values-and-hit-counts-to-detect-an-increment.md b/docs/developer-docs/real-examples/using-delta-values-and-hit-counts-to-detect-an-increment.md index bb68738e..68046274 100644 --- a/docs/developer-docs/real-examples/using-delta-values-and-hit-counts-to-detect-an-increment.md +++ b/docs/developer-docs/real-examples/using-delta-values-and-hit-counts-to-detect-an-increment.md @@ -14,7 +14,7 @@ as a case study, and [Steel Grip - Defeat 10 enemies without dropping your weapo - `0xef37`: weapon type - `0xef4e`: number of KOs (player 1) -![steelgrip-example](https://user-images.githubusercontent.com/8508804/33313210-32f5451e-d411-11e7-8042-2b9007a5cffb.png) +![Streets of Rage 2 steel grip achievement configuration](/public/sor2-steel-grip-achievement-editor.png) **Conditions** diff --git a/docs/developer-docs/real-examples/using-hit-counts-as-a-timer.md b/docs/developer-docs/real-examples/using-hit-counts-as-a-timer.md index a6345044..e28532c9 100644 --- a/docs/developer-docs/real-examples/using-hit-counts-as-a-timer.md +++ b/docs/developer-docs/real-examples/using-hit-counts-as-a-timer.md @@ -14,7 +14,7 @@ Let's see what [Super Hang-On (Mega Drive)](http://retroachievements.org/Game/16 - `0x0055a`: is the speed. - `0x0c757`: is 0x00 when the game is unpaused. -![speedfreak-example](https://user-images.githubusercontent.com/8508804/33312584-77f7fb0e-d40f-11e7-9daf-827c0f8d7dc6.png) +![Super Hang-On speed achievement using timer](/public/super-hang-on-timer-achievement-editor.png) For this achievement, we are looking for a condition that is met 600 times consecutively. The reason why is that the genesis is locked into processing 60 frames of logic per second (NTSC at least?). And the condition we're checking is "speed is over 300". Also, we want the player to keep the speed above 300 without pausing the game. diff --git a/docs/es/developer-docs/real-examples/circumvent-the-problem-of-a-counter-incrementing-twice-in-the-same-frame.md b/docs/es/developer-docs/real-examples/circumvent-the-problem-of-a-counter-incrementing-twice-in-the-same-frame.md index 49d873e9..9c79677a 100644 --- a/docs/es/developer-docs/real-examples/circumvent-the-problem-of-a-counter-incrementing-twice-in-the-same-frame.md +++ b/docs/es/developer-docs/real-examples/circumvent-the-problem-of-a-counter-incrementing-twice-in-the-same-frame.md @@ -7,7 +7,7 @@ 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 | +| 2 | ResetIf | 0xSTAGE | != | Value | 0xBONUS | | Esto se traduciría "checa si el contador de dulces cambio `N` veces en el stage bonus". @@ -20,16 +20,16 @@ En manera que podamos evitar este problema tenemos que utilizar la técnica de [ Echemos un vistazo a la lógica del logro y así poder ver la explicación: -**Variables (Addresses)** +## Variables (Addresses) - `0x80dc`: Contador de Dulces. - `0x809c`: ID de Stage. Así que ahora la estructura de logro seria de esta manera: -![](https://i.imgur.com/ufPTDF3.png) +![Lógica básica del logro en el editor para Santa Claus Jr](/public/santa-jr-achievement-editor-basic.png) -**Condiciones** +## Condiciones 1. 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. diff --git a/docs/es/developer-docs/real-examples/creating-a-timer-with-reset-if-hits-based-on-the-speed-of-the-game.md b/docs/es/developer-docs/real-examples/creating-a-timer-with-reset-if-hits-based-on-the-speed-of-the-game.md index 3a989609..71b996e7 100644 --- a/docs/es/developer-docs/real-examples/creating-a-timer-with-reset-if-hits-based-on-the-speed-of-the-game.md +++ b/docs/es/developer-docs/real-examples/creating-a-timer-with-reset-if-hits-based-on-the-speed-of-the-game.md @@ -4,7 +4,7 @@ Cada juego tiene una variable que esta constantemente aumentando, esta funciona > Ten en cuenta que juegos PAL (50hz) tiene un framerate mas bajo a los juegos NTSC (60hz) y no son compatibles con este método. Es recomendable crear cada temporizador utilizando la versión NTSC del juego, a menos que la versión PAL sea la uncia versión existente y no exista un parche NTSC disponible. -**Variables (Addresses)** +## Variables (Addresses) - `0x19`: Modo Demo: `01`=Activo, `00`=Inactivo - `0x1a`: Motor del Juego (velocidad basada en el framerate) @@ -12,13 +12,13 @@ Cada juego tiene una variable que esta constantemente aumentando, esta funciona - `0x2c`: Progresion del Juego: `03`=Antes que empiece el Stage, `04`=Stage iniciado, `08`=Stage terminado - `0x30`: ID de Stage (en este ejemplo, Stage 1) -![](https://i.imgur.com/moghMLT.png) +![Configuración del logro del temporizador de Contra en el editor](/public/contra-timer-achievement-editor.png) Link al Logro: [Contra Speedrun](https://retroachievements.org/achievement/65443) -YouTube: [ResetIfHits Demo: Contra Stage 1 60 segundos Speedrun ](https://youtu.be/6PpdG04tM4s) +YouTube: [ResetIfHits Demo: Contra Stage 1 60 segundos Speedrun](https://youtu.be/6PpdG04tM4s) -**Condiciones** +## Condiciones 1. Se activa el Hit del Logro cuando se entra al Stage (`03`solo aparece una vez por cada Stage). diff --git a/docs/es/developer-docs/real-examples/using-delta-values-and-hit-counts-to-detect-an-increment.md b/docs/es/developer-docs/real-examples/using-delta-values-and-hit-counts-to-detect-an-increment.md index a3c057f2..0e8dfd12 100644 --- a/docs/es/developer-docs/real-examples/using-delta-values-and-hit-counts-to-detect-an-increment.md +++ b/docs/es/developer-docs/real-examples/using-delta-values-and-hit-counts-to-detect-an-increment.md @@ -7,7 +7,7 @@ como ejemplo, y al logro [Steel Grip - Derrota a 10 enemigos sin tirar tu arma]( - `0xef37`: tipo de arma - `0xef4e`: numero de KOs (jugador 1) -![steelgrip-example](https://user-images.githubusercontent.com/8508804/33313210-32f5451e-d411-11e7-8042-2b9007a5cffb.png) +![Configuración del logro Steel Grip de Streets of Rage 2](/public/sor2-steel-grip-achievement-editor.png) **Condiciones** diff --git a/docs/es/developer-docs/real-examples/using-hit-counts-as-a-timer.md b/docs/es/developer-docs/real-examples/using-hit-counts-as-a-timer.md index 3f800791..0de83edc 100644 --- a/docs/es/developer-docs/real-examples/using-hit-counts-as-a-timer.md +++ b/docs/es/developer-docs/real-examples/using-hit-counts-as-a-timer.md @@ -7,7 +7,7 @@ Veamos como en [Super Hang-On (Mega Drive)](http://retroachievements.org/Game/16 - `0x0055a`: es la velocidad. - `0x0c757`: es 0x00 cuando el juego no se encuentra pausado. -![speedfreak-example](https://user-images.githubusercontent.com/8508804/33312584-77f7fb0e-d40f-11e7-9daf-827c0f8d7dc6.png) +![Logro de velocidad de Super Hang-On usando temporizador](/public/super-hang-on-timer-achievement-editor.png) En este logro, queremos que una condición sea verdadera 600 veces consecutivamente. La razón de esto es que el Sega Genesis procesa fijamente 60 frames de lógica por segundo (mínimo NTSC?). Y también estamos buscando que la "velocidad sea sobre 300". Y aparte que el jugador mantenga la velocidad sin pausar el juego. diff --git a/docs/pt/developer-docs/real-examples.md b/docs/pt/developer-docs/real-examples.md index 3b750f30..9a4ad60b 100644 --- a/docs/pt/developer-docs/real-examples.md +++ b/docs/pt/developer-docs/real-examples.md @@ -1,3 +1,8 @@ +--- +title: Exemplos Reais +description: Explore real examples of achievement logic, including using hit counts as timers, delta values, managing counters, and more. Learn techniques for effective achievement development through practical case studies. +--- + # Exemplos Reais **Link para o texto em inglês:** [Real Examples](/developer-docs/real-examples) @@ -6,3 +11,6 @@ Um dos melhores recursos de aprendizagem está em analisar alguns exemplos reais - [Usando Hit Counts e ResetIf](/pt/developer-docs/real-examples/using-hit-counts-as-a-timer) - [Usando Delta Values e ResetIf](/pt/developer-docs/real-examples/using-delta-values-and-hit-counts-to-detect-an-increment) +- [Contornando o Problema de um Contador Incrementando Duas Vezes no Mesmo Frame](/pt/developer-docs/real-examples/circumvent-the-problem-of-a-counter-incrementing-twice-in-the-same-frame) +- [Criando um Temporizador com `ResetIf` Hits Baseado na Velocidade do Jogo](/pt/developer-docs/real-examples/creating-a-timer-with-reset-if-hits-based-on-the-speed-of-the-game) +- [Usando `AddSource` e Deltas para Colecionáveis e Conquistas Similares](/pt/developer-docs/real-examples/using-add-source-and-deltas-for-collectibles-and-similar-achievements) diff --git a/docs/pt/developer-docs/real-examples/circumvent-the-problem-of-a-counter-incrementing-twice-in-the-same-frame.md b/docs/pt/developer-docs/real-examples/circumvent-the-problem-of-a-counter-incrementing-twice-in-the-same-frame.md new file mode 100644 index 00000000..2a997df1 --- /dev/null +++ b/docs/pt/developer-docs/real-examples/circumvent-the-problem-of-a-counter-incrementing-twice-in-the-same-frame.md @@ -0,0 +1,60 @@ +--- +title: Contornando o Problema de um Contador Incrementando Duas Vezes no Mesmo Frame +description: Aprenda como lidar com o problema de um contador incrementando duas vezes no mesmo frame usando SubSource e flags AddHits, garantindo uma lógica precisa de conquistas em jogos com coleta simultânea de itens. +--- + +# Contornando o Problema de um Contador Incrementando Duas Vezes no Mesmo Frame + +Neste exemplo, você verá como contornar o problema de um contador incrementando duas vezes no mesmo frame combinando [SubSource](/developer-docs/flags/subsource) e [AddHits](/developer-docs/flags/addhits-subhits). + +Na biblioteca do Game Boy Advance, existe um jogo de plataforma natalino chamado [Santa Claus Jr. Advance](http://retroachievements.org/Game/7152). Existem algumas conquistas para coletar todas as bengalas de doce em cada um dos estágios bônus. + +Essas conquistas deveriam ser bem simples, desta maneira: + +| ID | Special? | Memory | Cmp | Type | Mem/Val | Hits | +| --- | -------- | --------- | --- | ----- | --------- | ---- | +| 1 | | 0xCANDIES | != | Delta | 0xCANDIES | (N) | +| 2 | ResetIf | 0xSTAGE | != | Value | 0xBONUS | | + +Isso se traduz em "verificar se o contador de bengalas de doce mudou `N` vezes no estágio bônus". + +**Nota**: estamos usando `0xCANDIES != Delta 0xCANDIES` (usando `!=` e não `>`) porque quando o jogador tem 99 doces e coleta mais um, o contador vai para zero. + +No entanto, existe um aspecto neste jogo (e em muitos outros) onde se o jogador coletar 2 bengalas de doce simultaneamente, o contador é aumentado em 2 no mesmo frame. Quando isso acontece, o contador de hits é aumentado em um enquanto o contador de doces é aumentado em dois. Isso, obviamente, arruína a lógica usada acima. + +Para contornar esse problema, precisamos usar aquela técnica de [usar `SubSource` para contar incrementos específicos](/developer-docs/flags/subsource#using-subsource-to-count-specific-increments) combinada com a [flag `AddHits`](/developer-docs/flags/addhits-subhits). + +Vamos dar uma olhada na lógica da conquista e depois veremos a explicação: + +## Endereços + +- `0x80dc`: Contador de Bengalas de Doce. +- `0x809c`: ID do Estágio. + +Agora a estrutura da conquista será assim: + +![Lógica básica da conquista no editor para Santa Claus Jr](/public/santa-jr-achievement-editor-basic.png) + +## Condições + +1. Junto com a condição 2, é um truque usado para verificar se `0xCANDIES - Delta 0xCANDIES = 2`. Em outras palavras, o contador de doces foi incrementado em dois. + +2. Usado junto com a condição 1 (como explicado acima) e 3. Como explicado em [sua respectiva página](/developer-docs/flags/addhits-subhits), quando a condição `AddHits` é verdadeira, o contador de hits na próxima condição é incrementado. Portanto, em nosso exemplo aqui, quando a condição 2 é verdadeira, o contador de hits na condição 3 é incrementado. + +3. Conta quando o contador de doces muda. + +4. Reseta o contador se não estiver no estágio Bônus. + +Todas essas condições podem ser traduzidas como "enquanto estiver no estágio bônus, ativar a conquista se o contador de doces mudar 99 vezes, e se o contador de doces for incrementado em 2 no mesmo frame, contar uma mudança extra no contador de doces." + +Então, agora está 100% resolvido, certo? Bem, na verdade, quase. Ainda existe uma exceção muito pequena. Lembra que foi dito antes que `!=` estava sendo usado em vez de `>` porque **quando o jogador tem 99 doces e coleta mais um, o contador vai para zero**? + +Isso significa que, se pegarmos duas bengalas no mesmo frame (o que já é raro), existe uma possibilidade muito pequena de que essa mudança seja de `98 -> 00` ou de `99 -> 01`. Nesses dois únicos casos, nosso código não funcionará, porque `00 - 98` não é 2, é `-98`. O mesmo vale para `01 - 99`, não é 2, também é `-98`. + +Apesar de ser uma possibilidade muito improvável, devemos tratar esse caso também. Então vamos adicionar mais dois requisitos ao código, e ele ficará assim: + +![Lógica completa da conquista com tratamento de casos especiais no editor](/public/santa-jr-achievement-editor-complete.png) + +É o mesmo que antes, com as únicas mudanças sendo as linhas 3 e 4, que representam um `SubSource + AddHits` extra para verificar se `0xCANDIES - Delta 0xCANDIES = -98`, apenas para cuidar dessa exceção muito pequena que acabamos de mencionar. + +E agora está resolvido! diff --git a/docs/pt/developer-docs/real-examples/creating-a-timer-with-reset-if-hits-based-on-the-speed-of-the-game.md b/docs/pt/developer-docs/real-examples/creating-a-timer-with-reset-if-hits-based-on-the-speed-of-the-game.md new file mode 100644 index 00000000..84cac65f --- /dev/null +++ b/docs/pt/developer-docs/real-examples/creating-a-timer-with-reset-if-hits-based-on-the-speed-of-the-game.md @@ -0,0 +1,42 @@ +--- +title: Criando um Temporizador com `ResetIf` Hits Baseado na Velocidade do Jogo +description: Aprenda a criar temporizadores precisos no jogo usando a flag ResetIf para considerar a taxa de quadros do jogo, permitindo mecanismos de temporização precisos para conquistas em vários cenários de jogo. +--- + +# Criando um Temporizador com `ResetIf` Hits Baseado na Velocidade do Jogo + +Neste exemplo, você aprenderá como criar um Temporizador no jogo baseado na taxa de quadros (framerate) do jogo. + +Todo jogo tem um endereço que está constantemente aumentando, ele funciona como um motor em um carro que está constantemente em movimento, independentemente do que você faz, e começa assim que você inicia o jogo. O jogo em si é seu carro, e alguns carros são mais rápidos que outros. + +> Por favor, note que jogos PAL (50hz) têm uma taxa de quadros menor que jogos NTSC (60hz) e não são compatíveis com este método. É recomendado criar todos os Temporizadores baseados na versão NTSC do jogo, a menos que a versão PAL seja a única existente e não haja Patch NTSC disponível. + +## Endereços + +- `0x19`: Modo Demo: `01`=Ativo, `00`=Inativo +- `0x1a`: Motor do Jogo (velocidade baseada na taxa de quadros) +- `0x25`: Jogo Pausado: `01`=Sim, `00`=Não +- `0x2c`: Progressão do Jogo: `03`=Antes do Estágio começar, `04`=Estágio iniciado, `08`=Estágio finalizado +- `0x30`: ID do Estágio (neste exemplo, Estágio 1) + +![Configuração da conquista do temporizador de Contra no editor](/public/contra-timer-achievement-editor.png) + +Link para a Conquista: [Contra Speedrun](https://retroachievements.org/achievement/65443) + +YouTube: [ResetIfHits Demo: Contra Estágio 1 60 segundos Speedrun](https://youtu.be/6PpdG04tM4s) + +## Conditions + +1. Ativa o 'Hit' da Conquista ao entrar em um Estágio (`03` só aparece uma vez em cada Estágio). + +2. Ativa a Conquista quando um Estágio foi finalizado. + +3. Estágio Atual (neste exemplo, Estágio 1). + +4. Pausa a Conquista se o Jogo estiver 'Pausado' (Para o Temporizador na Conquista). + +5. Reseta a Conquista se `60` segundos `3600` Hits forem atingidos. `1` segundo = `60Hits` (NTSC 60fps), `50Hits` (PAL 50fps). + +6. Reseta a Conquista se o `Modo Demo` estiver ativo. + +7. Reseta o Temporizador da Conquista ao entrar em um novo Estágio. diff --git a/docs/pt/developer-docs/real-examples/using-add-source-and-deltas-for-collectibles-and-similar-achievements.md b/docs/pt/developer-docs/real-examples/using-add-source-and-deltas-for-collectibles-and-similar-achievements.md new file mode 100644 index 00000000..ee293d04 --- /dev/null +++ b/docs/pt/developer-docs/real-examples/using-add-source-and-deltas-for-collectibles-and-similar-achievements.md @@ -0,0 +1,31 @@ +--- +title: Usando `AddSource` e Deltas para Colecionáveis e Conquistas Similares +description: Aprenda a usar efetivamente a flag AddSource e Deltas para criar conquistas para colecionáveis, garantindo rastreamento preciso e prevenindo disparos prematuros nos jogos. +--- + +# Usando `AddSource` e Deltas para Colecionáveis e Conquistas Similares + +Neste exemplo, veremos uma maneira simples de utilizar a flag `AddSource` na lógica de suas conquistas. + +Vamos analisar uma conquista de [Suikoden (PlayStation)](https://retroachievements.org/game/11255) intitulada [Treasure Hunter - Dragon Knights' Domain](http://retroachievements.org/Achievement/80100): + +## Endereços Utilizados + +- `0x1b8244`: bit0-bit4 são tesouros em Soniere, bit5 é um tesouro no Checkpoint Norte, e bit6-bit7 são tesouros no Covil do Dragão. +- `0x1b8245`: bit0 é um tesouro no Covil do Dragão, bit1-bit5 são tesouros no Vale Seek, e bit6-7 são tesouros em Kalekka. +- `0x1b824b`: bit0-bit1 são tesouros na Vila da Runa Escondida, bit2 não é usado, bit3-4 são tesouros na Fortaleza dos Cavaleiros do Dragão, bit5-6 são tesouros em Teien, e bit7 é um tesouro na Casa de Luiken. + +![Exemplo do editor de conquistas de Suikoden](/public/suikoden-achievement-editor-example.png) + +Esta conquista específica requer apenas tesouros da Fortaleza dos Cavaleiros do Dragão, Covil do Dragão e Vale Seek; portanto, só precisamos dos bit6-7 de `0x1b8244`, bit0-bit5 de `0x1b8245`, e bit3-bit4 de `0x1b824b`. + +## Detalhamento da Lógica + +- Existem dois grupos de dez condições com as principais diferenças sendo o tipo Delta e o total. Isso é para garantir que o jogador passe de nove desses tesouros obtidos para ter todos os dez tesouros obtidos. _Nota: Lembre-se de usar hexadecimal para totais `AddSource`!_ +- Como estamos usando bitflags aqui, os totais para condições individuais sempre serão apenas 0x00 ou 0x01. Obviamente, queremos que todos sejam 0x01 para o disparo, mas não queremos que alguém ganhe a conquista simplesmente carregando um save com todos os dez tesouros já encontrados. +- O disparo ocorre no primeiro frame em que o jogador passa de nove para dez tesouros obtidos. Isso ajuda a evitar que a conquista seja ativada quando não deveria. +- A flag `Measured` está na última condição para que o jogador possa verificar o quanto falta para seu objetivo. Se eles tiverem oito de dez tesouros, a conquista mostrará que está 80% completa na sobreposição (RAEmus) ou menu de conquistas (RetroArch). + +Este método é principalmente útil para quando os totais entre o tipo Delta e o tipo Mem têm apenas uma diferença de 0x01, mas pode ser usado em vários tipos de conquistas: colecionáveis que só podem ser obtidos um por vez, conclusão de mapas (como em jogos dungeon-crawler com mapas visíveis que são revelados conforme você entra em novas áreas), habilidades que podem ser aprendidas, bestiários, completar um certo número de missões secundárias e muitos outros. + +Se você encontrar uma situação onde mais de uma bitflag em uma cadeia `AddSource` alterna ao mesmo tempo, você ainda pode utilizar este modelo. No entanto, você vai querer clonar as condições Delta e fazer com que ambos os totais criem um intervalo. Ainda usando a conquista acima como exemplo, o total existente poderia ser alterado para `<= 0x09` e o total para o segundo grupo poderia ser `>= 0x05`. Isso faria com que a conquista fosse ativada se o total passasse de 5-9 tesouros para 10 tesouros. diff --git a/docs/pt/developer-docs/real-examples/using-delta-values-and-hit-counts-to-detect-an-increment.md b/docs/pt/developer-docs/real-examples/using-delta-values-and-hit-counts-to-detect-an-increment.md index 029b3e89..5c170c31 100644 --- a/docs/pt/developer-docs/real-examples/using-delta-values-and-hit-counts-to-detect-an-increment.md +++ b/docs/pt/developer-docs/real-examples/using-delta-values-and-hit-counts-to-detect-an-increment.md @@ -11,7 +11,7 @@ como um caso de estudo, e o achievement [Steel Grip - Defeat 10 enemies without - `0xef37`: tipo de arma - `0xef4e`: número de KOs (player 1) -![steelgrip-example](https://user-images.githubusercontent.com/8508804/33313210-32f5451e-d411-11e7-8042-2b9007a5cffb.png) +![Configuração da conquista Steel Grip de Streets of Rage 2](/public/sor2-steel-grip-achievement-editor.png) **Condições** diff --git a/docs/pt/developer-docs/real-examples/using-hit-counts-as-a-timer.md b/docs/pt/developer-docs/real-examples/using-hit-counts-as-a-timer.md index ec0aa34b..69745a94 100644 --- a/docs/pt/developer-docs/real-examples/using-hit-counts-as-a-timer.md +++ b/docs/pt/developer-docs/real-examples/using-hit-counts-as-a-timer.md @@ -10,7 +10,7 @@ Vamos ver como o achievement [Super Hang-On (Mega Drive)](http://retroachievemen - `0x0055a`: é a velocidade. - `0x0c757`: é 0x00 quando o jogo é sem compensação (sem pausar). -![speedfreak-example](https://user-images.githubusercontent.com/8508804/33312584-77f7fb0e-d40f-11e7-9daf-827c0f8d7dc6.png) +![Conquista de velocidade de Super Hang-On usando temporizador](/public/super-hang-on-timer-achievement-editor.png) Nesse achievement, desejamos que haja um fato ou condição que seja verdadeira 600 vezes consecutivamente. A razão para isso é que o Genesis/Mega Drive está travado no processamento de 60 frames de lógica por segundo (NTSC pelo menos?). E o fato que estamos procurando é que "a velocidade é mais de 300". Além disso, queremos que o jogador mantenha a velocidade acima de 300 sem pausar o jogo. diff --git a/docs/public/contra-timer-achievement-editor.png b/docs/public/contra-timer-achievement-editor.png new file mode 100644 index 00000000..9699fe1a Binary files /dev/null and b/docs/public/contra-timer-achievement-editor.png differ diff --git a/docs/public/santa-jr-achievement-editor-basic.png b/docs/public/santa-jr-achievement-editor-basic.png new file mode 100644 index 00000000..d4d1d346 Binary files /dev/null and b/docs/public/santa-jr-achievement-editor-basic.png differ diff --git a/docs/public/santa-jr-achievement-editor-complete.png b/docs/public/santa-jr-achievement-editor-complete.png new file mode 100644 index 00000000..74508707 Binary files /dev/null and b/docs/public/santa-jr-achievement-editor-complete.png differ diff --git a/docs/public/sor2-steel-grip-achievement-editor.png b/docs/public/sor2-steel-grip-achievement-editor.png new file mode 100644 index 00000000..00013c19 Binary files /dev/null and b/docs/public/sor2-steel-grip-achievement-editor.png differ diff --git a/docs/public/suikoden-achievement-editor-example.png b/docs/public/suikoden-achievement-editor-example.png new file mode 100644 index 00000000..cb780344 Binary files /dev/null and b/docs/public/suikoden-achievement-editor-example.png differ diff --git a/docs/public/super-hang-on-timer-achievement-editor.png b/docs/public/super-hang-on-timer-achievement-editor.png new file mode 100644 index 00000000..183935cb Binary files /dev/null and b/docs/public/super-hang-on-timer-achievement-editor.png differ