Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 18 additions & 11 deletions docs/developer-docs/am-i-ready-for-review.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@ description: Comprehensive guidelines for the Junior Developer Program, includin
---

# Am I Ready for Code Review?
Now that your set is shaping up, you feel it's getting closer to publication. A couple things are left to do, namely testing, debugging and adjusting things to avoid bad practices and improve your set.

Now that your set is shaping up, you feel it's getting closer to publication. A couple things are left to do, namely testing, debugging and adjusting things to avoid bad practices and improve your set.

Tips for testing:

- If you aren’t skilled enough to do the challenge, you can test individual pieces by creating dummy achievements for pieces of them, such as level completion, starting the challenge, taking damage. Often times you can freeze invincibility frames or other things to help test too.
- Always make sure that your achievement can pop, and always make sure your failure conditions (ResetIf, Pauselocks, etc) only happen when you expect.
- Try to approach your challenges and achievements from wrong directions and goofy actions. Players do all kinds of weird things. Maybe a player does something in a different order than usual. Maybe they shoot something you didn’t realize could be shot and the achievement fails unexpectedly. In short: **Try to break your achievements.**
Expand All @@ -15,19 +17,22 @@ Tips for testing:
# Requesting a Review

Before you request a review on your set, it must be clear of bad practices. In particular, you must use [AutoCR](https://authorblues.github.io/retroachievements/AutoCR/) and go through every issue it flags. As with any automatic feedback tool, it is not perfect, and flags can sometimes be ignored. It is still invaluable to identify issues with your set, especially while you are still learning. In your Ready for Review post on #jr-devs-request, you must:

- Have an approved Set Plan for at least 7 days
- Explain your testing process
- Link to the Unpublished achievement page for your game
- Include a link to Set Plan Review thread
- Link to the AutoCR page for the set (using the Load by Game ID feature)
- Explain why any issue flagged by AutoCR has been ignored

Review requests deemed incomplete will simply be denied and you will have to make another one later. Take your time to get your set as close to publishable as you can before making that request; there's no rush! Don't hesitate to ask for help from your fellow juniors and code reviewers. Below is a list of absolute requirements before getting on the backlog:

[[toc]]

## The set is clear from bad practices in logic

Everything below should be **avoided**. If you need to make an exception, explain why.

- Achievements without a Delta-Mem pair
- Achievements using only a single address (even if it uses it for multiple conditions)
- Having a hit count target of (1) or higher without a way to reset hits
Expand All @@ -38,14 +43,14 @@ Everything below should be **avoided**. If you need to make an exception, explai
- Redundant AndNext
- Redundant Alt groups
- Using a Pauselock without a way to reset it

## Code notes are clear and concise

Read over the [Code Notes](/guidelines/content/code-notes) guidelines and ensure you are following all the advice.

- Check that you have a size tag on every note
- Check that every note has specific values noted, where appropriate
- Make sure *all* addresses used in achievements and leaderboards have a code note
- Make sure _all_ addresses used in achievements and leaderboards have a code note

## Assets have clear descriptions and unique titles with proper grammar

Expand Down Expand Up @@ -80,17 +85,19 @@ Are grammar and capitalization not your strong suit? Having trouble coming up wi
## Achievements are save protected or password protected

Test that loading a save file (especially an end game save file) or loading from a password does not trigger any achievements.
1. Load up the game, then activate all achievements.
2. Load your save file or enter your password.
3. Does anything trigger?
- If yes, you’ll need to add code to block them from triggering on save load.
- Make sure to test that they still pop normally
- Generally, loading a save file or password should not lock someone out of earning achievements. We are only looking for the save load/password load to not cause achievements to trigger.

1. Load up the game, then activate all achievements.
2. Load your save file or enter your password.
3. Does anything trigger?
- If yes, you’ll need to add code to block them from triggering on save load.
- Make sure to test that they still pop normally
- Generally, loading a save file or password should not lock someone out of earning achievements. We are only looking for the save load/password load to not cause achievements to trigger.

- If there are save files, have you tested that your logic works with all save slots? That is a requirement for an achievement set.
- If not, do so now.
- If it does not work with all save slots, you will need to revise your logic so that it does so. Usually there is at least an "active save slot" address, and often the active save data gets copied to a common location. Either case should be handled.
- If the system uses a save on a memory card, have you tested that your logic works if the player has no memory card "inserted" in the emulator?
Note: This **does not** mean that achievements have to disallow passwords. It just means that achievements cannot be earned as a result of entering a password, which would happen if an achievement only checks that you are on a given stage, for example.
Note: This **does not** mean that achievements have to disallow passwords. It just means that achievements cannot be earned as a result of entering a password, which would happen if an achievement only checks that you are on a given stage, for example.

## Achievements are protected against cheats when appropriate

Expand Down
28 changes: 14 additions & 14 deletions docs/developer-docs/console-specific-tips.md
Original file line number Diff line number Diff line change
Expand Up @@ -144,29 +144,29 @@ Checks if the 8-bit value at 0x18BAB5 is equal to 0x20. This means 0x18BAB5 cont
## GameCube

- Identification of the game/disc:
- Serial is located at **0x00000000** as a string of ASCII characters.
- Disc Number (for multidisk games) is stored at **0x80000006**. (0 = Disc 1)
- Revision Number is stored at **0x00000007**.
- You can use these to determine the specific disc loaded.
- Serial is located at **0x00000000** as a string of ASCII characters.
- Disc Number (for multidisk games) is stored at **0x80000006**. (0 = Disc 1)
- Revision Number is stored at **0x00000007**.
- You can use these to determine the specific disc loaded.
- GameCube uses a PowerPC chipset with big-endian data. Filter using `16-Bit BE`, `32-Bit BE`, `Float BE`, and `Double32 BE` for data types wider than 1 byte (8-bits). Data is typically aligned on Gamecube, so 16-Bit data is always at an even address and 32-bit data addresses at a multiple of 4, etc.
- Gamecube has one bank of RAM, 24MB, located at `0x80000000-0x817FFFFF`, which is mapped at `0x00000000-0x017FFFFF` in the RA toolkit.
- Therefore, pointers found will start with 0x8, and to use them, you can mask them using `0x1fffffff` to convert to RA addressing.
- `Add Address 32-Bit BE Pointer & 0x1fffffff`
- Uncached mirror of the RAM exists as well at `0xC0000000`. If you happen to find pointers that begin with 0xC, the same masking scheme will work to convert them to the RA addressing.
- Therefore, pointers found will start with 0x8, and to use them, you can mask them using `0x1fffffff` to convert to RA addressing.
- `Add Address 32-Bit BE Pointer & 0x1fffffff`
- Uncached mirror of the RAM exists as well at `0xC0000000`. If you happen to find pointers that begin with 0xC, the same masking scheme will work to convert them to the RA addressing.

## Wii

- Identification of a retail game/disc:
- Serial is located at **0x00000000** as a string of ASCII characters.
- Disc Number (for multidisk games) is stored at **0x80000006**. (0 = Disc 1)
- Revision Number is stored at **0x00000007**.
- You can use these to determine the specific disc loaded.
- Serial is located at **0x00000000** as a string of ASCII characters.
- Disc Number (for multidisk games) is stored at **0x80000006**. (0 = Disc 1)
- Revision Number is stored at **0x00000007**.
- You can use these to determine the specific disc loaded.
- WiiWare game ID is located at **0x00003180** as a 4-byte string of ASCII characters.
- Wii uses a PowerPC chipset with big-endian data. Filter using `16-Bit BE`, `32-Bit BE`, `Float BE`, and `Double32 BE` for data types wider than 1 byte (8-bits). Data is typically aligned on Wii, so 16-Bit data is always at an even address and 32-bit data addresses at a multiple of 4, etc.
- Wii has two banks of RAM, 24MB called "MEM1" located at `0x80000000-0x817FFFFF`, which is mapped at `0x00000000-0x017FFFFF` in the RA toolkit, and 64MB called "MEM2" located at `0x90000000-0x93FFFFFF`, which is mapped at `0x10000000-0x13FFFFFF` in the RA toolkit.
- Therefore, pointers found will start with 0x8 or 0x9, and to use them, you can mask them using `0x1fffffff` to convert to RA addressing.
- `Add Address 32-Bit BE Pointer & 0x1fffffff`
- Uncached mirrors of MEM1 and MEM2 exist as well at `0xC0000000` and `0xD0000000`, respectively. If you happen to find pointers that begin with 0xC or 0xD, the same masking scheme will work to convert them to the RA addressing.
- Therefore, pointers found will start with 0x8 or 0x9, and to use them, you can mask them using `0x1fffffff` to convert to RA addressing.
- `Add Address 32-Bit BE Pointer & 0x1fffffff`
- Uncached mirrors of MEM1 and MEM2 exist as well at `0xC0000000` and `0xD0000000`, respectively. If you happen to find pointers that begin with 0xC or 0xD, the same masking scheme will work to convert them to the RA addressing.

## Neo Geo

Expand Down
2 changes: 1 addition & 1 deletion docs/developer-docs/devjam.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ Check the links here for console-specific guidelines and info:
| 06 | 2024-12-01 - 2025-03-16 | [Apple II](/developer-docs/devjam/6-appleii) | 20 | 40 |
| 07 | 2025-04-01 - 2025-06-30 | [Sega CD/32X](/developer-docs/devjam/7-segacd-32x) | 27 | 40 |
| 08 | 2025-07-01 - 2025-09-30 | [MSX](/developer-docs/devjam/8-msx) | 26 | 79 |
| 09 | 2026-02-01 - 2025-04-30 | [Catch-Up](/developer-docs/devjam/9-catch-up) | ?? | ?? |
| 09 | 2026-02-01 - 2025-04-30 | [Catch-Up](/developer-docs/devjam/9-catch-up) | ?? | ?? |

## Planned DevJams

Expand Down
17 changes: 12 additions & 5 deletions docs/developer-docs/devquests.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,37 @@

## What are DevQuests?

DevQuests are achievement development-related quests that developers can take part in at any time. Each one has a specific goal and upon reaching that goal, the achievement developer will earn a badge.
DevQuests are achievement development-related quests that developers can take part in at any time. Each one has a specific goal and upon reaching that goal, the achievement developer will earn a badge.

## General Rules

Outside exceptions explicitely written in the individual quest rules, quests of each type follow the general rules below:

- DevQuests are not available for Junior Developers.
- To be awarded credit towards a quest, ping the team via a Discord ping in [`#devquest`](https://discord.com/channels/310192285306454017/842845740078334002) or via [site message](https://retroachievements.org/messages/create?to=DevQuest) within one week of completion, with a link to the appropriate achievement page.
- Collaborations and subsets are not allowed by default.
- If you are working on a set and it becomes eligible to a DevQuest, it cannot be used if 50% of the work is already done. This can happen when new quests are introduced, when a set receives enough requests to be eligible for [DQ7](#007-most-wanted) or when a set is featured in Wish This Set, making it eligible for [DQ16](#_016-wish-this-set). If this happens while you are *less* than halfway done, please reach out to the team to confirm eligibility.
- If you are working on a set and it becomes eligible to a DevQuest, it cannot be used if 50% of the work is already done. This can happen when new quests are introduced, when a set receives enough requests to be eligible for [DQ7](#007-most-wanted) or when a set is featured in Wish This Set, making it eligible for [DQ16](#_016-wish-this-set). If this happens while you are _less_ than halfway done, please reach out to the team to confirm eligibility.

Type specific rules:

**Set-Creation**

- Making a set can only contribute to a single quest. For example, if you make a set for a Japan-exclusive game with a female protagonist that was featured on Wish This Set, you have to choose between [DQ8](#_008-world-traveler), [DQ16](#0_16-wish-this-set) and [DQ24](#_024-she-s-got-this), you don't get all three.
- Standard set quality or better is expected for DevQuest sets. If a set appears to be of insufficient effort, it may be rejected at the DevQuest team's discretion. Rich Presence is required for DevQuest sets. The DevQuest team is happy to suggest improvements for qualification.

**Maintenance**

- You cannot be an original author on the set being maintained.
- General revision rules apply: contact the active authors on sets whose content you will update or add to. Moreover, discussions, dev votes and revision claims are required when adding new achievements to a set.
- Every action can only contribute to a single quest. For example, if you repair a set for [DQ2](#_002-retro-renovator), resolving tickets is part of that task, so these tickets cannot be tallied up towards [DQ1](#_001-ticket-massacre). However, some sets can benefit from different independant actions in a way that yields credits towards multiple DevQuests. If you add a rich presence, leaderboards and revise a set to cover content that was missing before, you could get credit for DQ13, DQ14 and DQ22.
- Every action can only contribute to a single quest. For example, if you repair a set for [DQ2](#_002-retro-renovator), resolving tickets is part of that task, so these tickets cannot be tallied up towards [DQ1](#_001-ticket-massacre). However, some sets can benefit from different independant actions in a way that yields credits towards multiple DevQuests. If you add a rich presence, leaderboards and revise a set to cover content that was missing before, you could get credit for DQ13, DQ14 and DQ22.
- For revision quests ([DQ2](#_002-retro-renovator), [DQ13](#_013-complete-me) and [DQ22](#0_22-this-belonged-in-a-museum) Dust-offs), the game needs to be in the approved list. You may propose games you feel should qualify prior to working on them and the team will determine if it fits the quest. While [DQ13](#_013-complete-me) credit can sometimes be granted along [DQ2](#_002-retro-renovator) or [DQ22](#_022-this-belonged-in-a-museum), this is up to a team vote and should only be allowed when both the current content and missing content require significant work.
- When you update the logic of any asset, keep a backup of the old logic posted in the game's official forum for reference.
- For miscellaneous maintenance quests ([DQ1](#_001-ticket-massacre), [DQ3](#_003-singles-in-your-area), [DQ5](#_005-trigger-happy) and [DQ14](#_014-laudable-leaderboards)), create a column in the DevQuest Remastered sheet to the left of completed entries and fill it in as you work. Contact the DevQuest team for review only after you have completed the quest. For quests that can be repeated, one row of the column will be for which badge number you are working towards.

**Legacy**

Legacy quests ([DQ4](#_004-veteran-developer), [DQ15](#_015-console-conqueror) and [DQ20](#_020-genre-conqueror)) are fully retroactive and are awarded for having an extensive and wide portfolio as a developer.

- You may request to be tracked for these after reaching some minimum threshold as determined in the rules of each individual quests.
- Following that first tracking request, updates are made in sweeps periodically; this means you don't have to (and shouldn't) ping the team every time you complete a new set that adds to your portfolio. Every couple months, the dev responsible for the sweeps for that particular quest will update the status of everyone being tracked and announce the progress in [`#devquest`](https://discord.com/channels/310192285306454017/842845740078334002).

Expand Down Expand Up @@ -415,7 +420,7 @@ Each system ID will have an achievement associated with it. Newly supported syst
- [Player-Input RP](https://retroachievements.org/game/28506)
- [Single Save Support](https://retroachievements.org/game/28449)
- [Outdated Version](https://retroachievements.org/hub/29482)
- If you identify a set you believe should qualify for a task like this, simply request approval from the team. Providing support to an updated version of a hack, homebrew or language patch will yield 1 point regardless of if it was tagged as outdated, provided the update required actual logic updates and/or adding achievements to cover added content.
- If you identify a set you believe should qualify for a task like this, simply request approval from the team. Providing support to an updated version of a hack, homebrew or language patch will yield 1 point regardless of if it was tagged as outdated, provided the update required actual logic updates and/or adding achievements to cover added content.
4. No collaboration allowed.
5. Sets are subject to DevQuest team approval, along with a small plan on what the dust-off will be about. Sets already in the approved DQ22 list do not require approval, only notification.
6. Badge updates must go through the Icon-Gauntlet revision process.
Expand Down Expand Up @@ -461,13 +466,15 @@ Each system ID will have an achievement associated with it. Newly supported syst
6. Each point of credit (equivalent to one set) must have a different female character as the protagonist (or different ensemble of female characters)

## Wheel Spin DevQuest Rules

[DQ6](#_006-the-unwanted), [DQ19](#_019-wheel-of-genres) and [DQ23](#_023-well-of-wishes) use wheels to give random goals. You are allowed to spin again to change your random goal **three months** after spinning. The first and second spins for each quest are free. If you want to keep on spinning, you will need to earn a new respin token by doing one of the following tasks:

- Resolve (Not close) 10 tickets from inactive devs (can be used towards [DQ1](#_001-ticket-massacre) Ticket Massacre)
- Earn [DQ3](#_003-singles-in-your-area) Singles in Your Area
- Update 10 achievements towards [DQ5](#_005-trigger-happy) Trigger Happy
- Earn a point towards [DQ2](#_002-retro-renovator) Retro Renovator or [DQ13](#013-complete-me) complete.me
- Make a set for [DQ16](#_016-wish-this-set) Wish This Set

Refreshing your spin this way can only be done while your spin is used up. For example, you cannot use an old Wish This Set game you made prior to spinning.

## New DevQuests and suggestions
Expand Down
Loading
Loading