QuizMenuTool Tutorial: Difference between revisions
Happylappy (talk | contribs) |
Happylappy (talk | contribs) I thiiiink I removed the unfinished part? |
||
| (19 intermediate revisions by 2 users not shown) | |||
| Line 1: | Line 1: | ||
This guide explains how to use QuizMenuTool to create a custom Personality Quiz. The bulk of this guide will explain the use of the google sheets portion of the tool. A rudimentary understanding of SkyTemple scripting is helpful for this task, but not strictly required. These topics will be covered at the end for the sake of completion, but only to the extent that they are needed for QuizMenuTool. | |||
== About QuizMenuTool == | |||
=== What Is QuizMenuTool? === | |||
QuizMenuTool is a customizable ExplorerScript replica of the Explorers of Sky Personality Quiz and Starter Selection, with minimal hardcoded aspects. The original quiz was designed to consist mostly of <code>message_Menu()</code> ASM, to make editing the personality quiz accessible without the need to learn ASM. | |||
=== What can QuizMenuTool do? === | |||
QuizMenuTool can modify the process of using the quiz to select a starter, expand/reduce the starter list, add/remove/modify questions from the quiz, and much more! In fact, the better question might be... | |||
=== What Limitations does QuizMenuTool have? === | |||
There are a few critical things QuizMenuTool was not designed to do, though many of these could be remedied in the future if enough demand exists. Here's a list of what QuizMenuTool fails to replicate from the vanilla quiz: | |||
* Hero/Partner Type Exclusion: In the vanilla quiz, the hero and partner are prevented from sharing a type, to encourage team balance. No option for such a restriction has been implemented yet, though such a thing would be possible in the future, or be scripted manually for a specific hack. | |||
* SwitchMenu Portraits: In the vanilla quiz, scrolling to a partner choice displays a portrait of that partner, which gradually changes in expression. This feature would require significant custom code to emulate, and is unlikely to be available for QuizMenuTool. | |||
* Third Party Starter Tweaks: The original starter list is '''completely unused''' by QuizMenuTool. Changing it has no impact on the quiz. Players of a hack using QuizMenuTool will have difficulty adding their own starters to the game, though this could potentially be remedied with a special process checking the starter list against what it is expected to be, and assigning the desired starter if a mismatch is found? | |||
* Incompatibility with Japanese ROMs: Currently, QuizMenuTool is designed to only work for NA and EU ROMs. while in theory a Japanese Quiz could be designed, the Special Processes are not Japanese-compatible. This could be remedied with little effort, but the tool is designed for EU/NA ROMs. | |||
== Who QuizMenuTool is for == | == Who QuizMenuTool is for == | ||
| Line 35: | Line 51: | ||
There are two ways to paste values, either by right-clicking the paste location and selecting "Paste Special" then "Values Only", or by holding shift as you paste. | There are two ways to paste values, either by right-clicking the paste location and selecting "Paste Special" then "Values Only", or by holding shift as you paste. | ||
== Quiz Preamble Generator | == Quiz Preamble Generator == | ||
The Quiz Preamble Generator Tab as a whole exists to create the very beginning of the quiz. | The Quiz Preamble Generator Tab as a whole exists to create the very beginning of the quiz. | ||
| Line 50: | Line 66: | ||
The orange output cell on this sheet is largely unimportant, but is present for debug purposes. It compiles the portions of the script using the inputs on this tab of the sheet. | The orange output cell on this sheet is largely unimportant, but is present for debug purposes. It compiles the portions of the script using the inputs on this tab of the sheet. | ||
== Starter Selection Generator | == Starter Selection Generator == | ||
This tab of the sheet is primarily for inputting data about the starters, or the personality pools they belong to. | This tab of the sheet is primarily for inputting data about the starters, or the personality pools they belong to. | ||
| Line 111: | Line 127: | ||
=== Fuwarante Blacklist === | === Fuwarante Blacklist === | ||
Finally, on the far end of the table, is the Fuwarante Blacklist inputs. These are perhaps the most complicated portion of this tab of the sheet.[[File:Fuwarante Blacklist.png|alt=Location of the Fuwarante Blacklist|center|thumb|300x300px|Location of the Fuwarante Blacklist]]Each column corresponds to a bit of the script variable $BIT_FUWARANTE_LOCAL. If the matching flag is on, the starter in that row '''cannot''' be chosen. This will be elaborated on further in the "Question Loop Generator", but this is a brief explanation of what the bits represent by default: | Finally, on the far end of the table, is the Fuwarante Blacklist inputs. These are perhaps the most complicated portion of this tab of the sheet.[[File:Fuwarante Blacklist.png|alt=Location of the Fuwarante Blacklist|center|thumb|300x300px|Location of the Fuwarante Blacklist]]Each column corresponds to a bit of the script variable <code>$BIT_FUWARANTE_LOCAL</code>. If the matching flag is on, the starter in that row '''cannot''' be chosen. This will be elaborated on further in the "Question Loop Generator", but this is a brief explanation of what the bits represent by default: | ||
{| class="wikitable" | {| class="wikitable" | ||
|+ | |+ | ||
| Line 118: | Line 134: | ||
|- | |- | ||
|0 | |0 | ||
|If enabled, $PLAY_OLD_GAME will be true, meaning the player answered that they have played Time/Darkness before. | |If enabled, <code>$PLAY_OLD_GAME</code> will be true, meaning the player answered that they have played Time/Darkness before. | ||
|- | |- | ||
|1 | |1 | ||
| Line 124: | Line 140: | ||
|- | |- | ||
|2 | |2 | ||
|If enabled, the player has participated in a Mystery Mail event before, according | |If enabled, the player has participated in a Mystery Mail event before, according to a custom ending question. | ||
|- | |- | ||
|3 | |3 | ||
| Line 136: | Line 152: | ||
Once again, the orange output cells on the far right of this sheet are largely unimportant, but are present for debug purposes. It compiles the portions of the script using the inputs on this tab of the sheet. | Once again, the orange output cells on the far right of this sheet are largely unimportant, but are present for debug purposes. It compiles the portions of the script using the inputs on this tab of the sheet. | ||
== Question Loop Generator | == Question Loop Generator == | ||
=== Upper Panel === | === Upper Panel === | ||
| Line 148: | Line 164: | ||
These are the primary use-cases for the Fuwarante Blacklist described above. | These are the primary use-cases for the Fuwarante Blacklist described above. | ||
== Question Generator | The <code>[S:0]</code> text tag will be explained in further detail below. | ||
== Question Generator == | |||
Note: The "Yes." and "No." options have the <code>[S:0]</code> text tag after them. This does functionally nothing, and exists primarily to aid in automatic string translation, as the localization teams translated the same English responses for questions differently based on context. This will be elaborated on further in "Full Script Translation". If there are no plans to use the sheet's translation features, it is safe to remove any variants of <code>[S:0]</code>. (instructions to do so in SkyTemple directly are present below). | |||
=== About Question Templates === | === About Question Templates === | ||
This tab of the sheet is dedicated to the design and storage of the individual random questions in the quiz. The way this sheet works revolves around "Question Templates" that store the question text, question number, answer text, pool ID, and points for that pool ID. Below is an example of a Question Template, and how it translates to question data: | This tab of the sheet is dedicated to the design and storage of the individual random questions in the quiz. The way this sheet works revolves around "Question Templates" that store the question text, question number, answer text, pool ID, and points for that pool ID. Below is an example of a Question Template, and how it translates to question data: | ||
{| class="wikitable" | {| class="wikitable" | ||
|+ Do you prefer to be busy or have\na lot of free time?^35 |Being busy.^11^4^8^2|Free time!^9^4|In between.^12^4 | |+ Do you prefer to be busy or have\na lot of free time?^35 |<code>Being busy.^11^4^8^2|Free time!^9^4|In between.^12^4</code> | ||
!Question Text | !Question Text | ||
! colspan="8" |Question # | ! colspan="8" |Question # | ||
| Line 160: | Line 179: | ||
| colspan="8" |35 | | colspan="8" |35 | ||
|- | |- | ||
!Answer Text | ! rowspan="2" |Answer Text | ||
! colspan="2" |Pool 1 | ! colspan="2" |Pool 1 | ||
! colspan="2" |Pool | ! colspan="2" |Pool 2 | ||
! colspan="2" |Pool | ! colspan="2" |Pool 3 | ||
! colspan="2" |Pool | ! colspan="2" |Pool 4 | ||
|- | |||
!ID | |||
!Points | |||
!ID | |||
!Points | |||
!ID | |||
!Points | |||
!ID | |||
!Points | |||
|- | |- | ||
|Being busy. | |Being busy. | ||
| Line 210: | Line 238: | ||
Before moving onto the next question, copy the template output, and '''Paste Values''' in the corresponding slot on the "Question Template List". By default, templates for each vanilla question are already in the Question Template List, ready to be edited or modified by copying and pasting into the Question Template Input. The Script Output Column is again for debug purposes, and is read automatically by another tab of the sheet. | Before moving onto the next question, copy the template output, and '''Paste Values''' in the corresponding slot on the "Question Template List". By default, templates for each vanilla question are already in the Question Template List, ready to be edited or modified by copying and pasting into the Question Template Input. The Script Output Column is again for debug purposes, and is read automatically by another tab of the sheet. | ||
== Personality Pool Selection Generator | == Personality Pool Selection Generator == | ||
Once the quiz itself is completed, the points need to be tallied, so that a winning pool can be selected. The exact way that this happens in vanilla is a tad complicated, especially when it comes to breaking ties. Here are the steps that occur in vanilla: | Once the quiz itself is completed, the points need to be tallied, so that a winning pool can be selected. The exact way that this happens in vanilla is a tad complicated, especially when it comes to breaking ties. Here are the steps that occur in vanilla: | ||
| Line 225: | Line 253: | ||
=== Pool Tinkering === | === Pool Tinkering === | ||
As stated above, the vanilla quiz favors pools with Sky-Exclusive Starters for the specified gender if they've played Time/Darkness. Through checking the BIT_FUWARANTE_LOCAL flags from the "Question Loop Generator", we can mimic this effect. | As stated above, the vanilla quiz favors pools with Sky-Exclusive Starters for the specified gender if they've played Time/Darkness. Through checking the <code>$BIT_FUWARANTE_LOCAL</code> flags from the "Question Loop Generator", we can mimic this effect. | ||
[[File:Pool Tinkering.png|alt=Location of Pool Tinkering Portion.|center|thumb|600x600px|Location of Pool Tinkering Portion.]] | [[File:Pool Tinkering.png|alt=Location of Pool Tinkering Portion.|center|thumb|600x600px|Location of Pool Tinkering Portion.]] | ||
On the far left, are the IDs of the two flags that should be checked (without modification, this could be 0 for "Time/Darkness", and 3/4 for "Male/Female"). Depending on if the 1st and 2nd flags are true (1), or false (0), the selected pools (as many as needed) will gain the specified number of points. In order to accommodate for the "Surprise Me!" gender option, 2 points are given for male, 2 for "not male", 2 for "female", and 2 for "not female", in order to influence every pool containing a sky-exclusive starter. (A similar process is done for the Time/Darkness exclusive starters I've added to my example quiz, if the player has NOT played time/darkness). Up to 10 slots are present for pool tinkering, though more could be added if there is a pressing need. | On the far left, are the IDs of the two flags that should be checked (without modification, this could be 0 for "Time/Darkness", and 3/4 for "Male/Female"). Depending on if the 1st and 2nd flags are true (1), or false (0), the selected pools (as many as needed) will gain the specified number of points. In order to accommodate for the "Surprise Me!" gender option, 2 points are given for male, 2 for "not male", 2 for "female", and 2 for "not female", in order to influence every pool containing a sky-exclusive starter. (A similar process is done for the Time/Darkness exclusive starters I've added to my example quiz, if the player has NOT played time/darkness). Up to 10 slots are present for pool tinkering, though more could be added if there is a pressing need. | ||
== Aura Bow Generator | == Aura Bow Generator == | ||
The Aura Bow Generator serves to emulate the cinematics of the vanilla aura bow portion of the quiz. In addition to simply detecting when and for how long the player is touching the Aura Bow, the actual bow color needs to be determined! For the vanilla quiz, the process is as follows: | The Aura Bow Generator serves to emulate the cinematics of the vanilla aura bow portion of the quiz. In addition to simply detecting when and for how long the player is touching the Aura Bow, the actual bow color needs to be determined! For the vanilla quiz, the process is as follows: | ||
* Use DS Favorite Color (75% Chance): If the DS Favorite Color is selected, the user's favorite color will match the color of the bow. | * Use DS Favorite Color (75% Chance): If the DS Favorite Color is selected, the user's favorite color will match the color of the bow. | ||
* Use DS Mac Address (25% Chance): If the Mac Address is selected, then | * Use DS Mac Address (25% Chance): If the Mac Address is selected, then <code>mac_address & 0xF</code> determines the color of the bow. | ||
This functionality can be replicated by QuizMenuTool, and the chances can even be altered! | This functionality can be replicated by QuizMenuTool, and the chances can even be altered! | ||
| Line 251: | Line 279: | ||
Finally, the Bow Selection Panel handles the actual selection and presentation of the Aura Bow. [[File:Bow Selection Panel.png|alt=Bow Selection Panel Location.|center|thumb|600x600px|Bow Selection Panel Location.]]The upper left of the panel is for assigning weights to the three methods for selecting a bow color: DS Favorite Color, DS MAC Address, or a custom block of code. Note that these weights '''must be integers''' or the sheet will generate invalid code. For convenience, the percent chance of each option is computed by the sheet, based on the weights and total weight. The ExplorerScript input for the custom bow selection is on the right of this panel, and on the bottom left is the flavor-text for each bow color. | Finally, the Bow Selection Panel handles the actual selection and presentation of the Aura Bow. [[File:Bow Selection Panel.png|alt=Bow Selection Panel Location.|center|thumb|600x600px|Bow Selection Panel Location.]]The upper left of the panel is for assigning weights to the three methods for selecting a bow color: DS Favorite Color, DS MAC Address, or a custom block of code. Note that these weights '''must be integers''' or the sheet will generate invalid code. For convenience, the percent chance of each option is computed by the sheet, based on the weights and total weight. The ExplorerScript input for the custom bow selection is on the right of this panel, and on the bottom left is the flavor-text for each bow color. | ||
== Variable Cleanup & End-Cap Generator | == Variable Cleanup & End-Cap Generator == | ||
This tab of the sheet aims to clean up the bevy of variables used by the quiz, and prep the game for actually running. Since QMT uses a majority of the script variables the game has to function, this tab resets them all back to what they should be at the beginning of a save file, now that the quiz no longer needs them. If some part of the quiz needs to be remembered, such as the color of the aura bow, whether the player has played Time/Darkness, or the winning Quiz personality pool, that needs to be preserved in this tab. In addition, this is the tab where the starters are officially initialized, which allows them to be nicknamed. Finally, the special process for actually assigning the starters, PROCESS_SPECIAL_INIT_MAIN_TEAM_AFTER_QUIZ, will wipe $CONFIG_COLOR_KIND clean, replacing it with what the real quiz determined your aura bow color to be. Because the real quiz never runs during QMT, this will always be zero. As a result, the aura bow color needs to be saved somewhere besides $CONFIG_COLOR_KIND, then returned afterwards. | This tab of the sheet aims to clean up the bevy of variables used by the quiz, and prep the game for actually running. Since QMT uses a majority of the script variables the game has to function, this tab resets them all back to what they should be at the beginning of a save file, now that the quiz no longer needs them. If some part of the quiz needs to be remembered, such as the color of the aura bow, whether the player has played Time/Darkness, or the winning Quiz personality pool, that needs to be preserved in this tab. In addition, this is the tab where the starters are officially initialized, which allows them to be nicknamed. Finally, the special process for actually assigning the starters, <code>PROCESS_SPECIAL_INIT_MAIN_TEAM_AFTER_QUIZ</code>, will wipe <code>$CONFIG_COLOR_KIND</code> clean, replacing it with what the real quiz determined your aura bow color to be. Because the real quiz never runs during QMT, this will always be zero. As a result, the aura bow color needs to be saved somewhere besides <code>$CONFIG_COLOR_KIND</code>, then returned afterwards. | ||
=== Upper Panel === | === Upper Panel === | ||
This tab ALSO has an upper panel! The number of pools to clear should ideally match the number of pools in use. "White Space" does the same thing it has up to this point, and the far right output cell is read elsewhere, and only exists for debug purposes. | This tab ALSO has an upper panel! The number of pools to clear should ideally match the number of pools in use. "White Space" does the same thing it has up to this point, and the far right output cell is read elsewhere, and only exists for debug purposes. | ||
[[File:Variable Cleanup & End-Cap Upper Panel.png|alt=Variable Cleanup & End-Cap Upper Panel Location.|center|thumb|600x600px|Variable Cleanup & End-Cap Upper Panel Location.]] | [[File:Variable Cleanup & End-Cap Upper Panel.png|alt=Variable Cleanup & End-Cap Upper Panel Location.|center|thumb|600x600px|Variable Cleanup & End-Cap Upper Panel Location.]] | ||
In the center of the panel are three new checkboxes. "Name Partner?" and "Name Hero?" should be somewhat intuitive, they enable/disable the ExplorerScript inputs for naming the hero and partner respectively, which will be elaborated on below. Finally, "Set $VERSION to 1?" sets the | In the center of the panel are three new checkboxes. "Name Partner?" and "Name Hero?" should be somewhat intuitive, they enable/disable the ExplorerScript inputs for naming the hero and partner respectively, which will be elaborated on below. Finally, "Set $VERSION to 1?" sets the <code>$VERSION</code> script variable to 1 at the very end of the script. Without ASM modification, saving the game with this variable as anything besides 1 results in a "corrupt" save file. In the absence of a strong reason otherwise, this box should remain checked. | ||
=== Hero Name, Partner Name, & Closing Remarks === | === Hero Name, Partner Name, & Closing Remarks === | ||
These ExplorerScript Inputs are for... the code used for nicknaming the partner and hero respectively, as well as the last few lines of text before the quiz truly ends.[[File:Hero-Partner-Closing Remarks Input.png|alt=Location of ExplorerScript Code Inputs.|center|thumb|600x600px|Location of ExplorerScript Code Inputs.]]Note that MENU_PARTNER_NAME will not function without the dedicated SkyPatch, in the QMT github repo (linked at the top). Additionally, the menus themselves will close any active text-box the instant they are done printing, which is why the hero monologue ends with a [K]. A message_Close(); would also suffice. Finally, the closing remarks should actually fade out the | These ExplorerScript Inputs are for... the code used for nicknaming the partner and hero respectively, as well as the last few lines of text before the quiz truly ends.[[File:Hero-Partner-Closing Remarks Input.png|alt=Location of ExplorerScript Code Inputs.|center|thumb|600x600px|Location of ExplorerScript Code Inputs.]]Note that <code>MENU_PARTNER_NAME</code> will not function without the dedicated SkyPatch, in the QMT github repo (linked at the top). Additionally, the menus themselves will close any active text-box the instant they are done printing, which is why the hero monologue ends with a <code>[K]</code>. A <code>message_Close();</code> would also suffice. Finally, the closing remarks should actually fade out the BGM and screen as desired. Feel free to optimize the fades, there is probably a more efficient way to achieve the right effect. | ||
=== Script Variable Preservation Panel === | === Script Variable Preservation Panel === | ||
The Script Variable Preservation Panel serves to determine what information should be preserved after the quiz. By default, only the variables storing the personality pool counts are actually being erased, though certain configurations may require some variables to be kept, and others to be wiped in addition.[[File:Script Variable Preservation Panel.png|alt=Script Variable Preservation Panel Location.|center|thumb|600x600px|Script Variable Preservation Panel Location.]]Beginning at the top, is the "Variable Erasure Blacklist". Based on other interactions with the sheet, the "Automatic Variables" will fill up automatically, but any script variables specified in this row will be kept as they are at the end of the quiz, and not erased. An example of a manual blacklist example might be $VERSION, which doesn't need a dedicated line of code for erasure if it will ALSO be set to 1 at the end. The next row, "Additional Variables to Erase", will be added to the list of erased variables if they are not already present. The $BIT_FUWARANTE_LOCAL variables should be erased in addition, as the Driftblim Gondola will interpret these variables as valid station passes to enter. Below that, is the "Variable Transfer Table". Prior to erasing anything, variables in the "Old Variable Name" column will be moved to the "New Variable Name". The old variable will be slated for erasure, while the new one will be spared. For convenience, the "Variable Meaning" Tab on the left will autofill one or both of these columns depending on the option you select: | The Script Variable Preservation Panel serves to determine what information should be preserved after the quiz. By default, only the variables storing the personality pool counts are actually being erased, though certain configurations may require some variables to be kept, and others to be wiped in addition.[[File:Script Variable Preservation Panel.png|alt=Script Variable Preservation Panel Location.|center|thumb|600x600px|Script Variable Preservation Panel Location.]]Beginning at the top, is the "Variable Erasure Blacklist". Based on other interactions with the sheet, the "Automatic Variables" will fill up automatically, but any script variables specified in this row will be kept as they are at the end of the quiz, and not erased. An example of a manual blacklist example might be <code>$VERSION</code>, which doesn't need a dedicated line of code for erasure if it will ALSO be set to 1 at the end. The next row, "Additional Variables to Erase", will be added to the list of erased variables if they are not already present. The <code>$BIT_FUWARANTE_LOCAL</code> variables should be erased in addition, as the Driftblim Gondola will interpret these variables as valid station passes to enter. Below that, is the "Variable Transfer Table". Prior to erasing anything, variables in the "Old Variable Name" column will be moved to the "New Variable Name". The old variable will be slated for erasure, while the new one will be spared. For convenience, the "Variable Meaning" Tab on the left will autofill one or both of these columns depending on the option you select: | ||
{| class="wikitable" | {| class="wikitable" | ||
|+ | |+ | ||
| Line 272: | Line 300: | ||
|- | |- | ||
|Aura Bow Preserve | |Aura Bow Preserve | ||
|$CONFIG_COLOR_KIND | |<code>$CONFIG_COLOR_KIND</code> | ||
|$LOCAL0 | |<code>$LOCAL0</code> | ||
|If this Variable Meaning is present, $CONFIG_COLOR_KIND will be restored in post. It's only purpose is to prevent the quiz from wiping the variable on running | |If this Variable Meaning is present, <code>$CONFIG_COLOR_KIND</code> will be restored in post. It's only purpose is to prevent the quiz from wiping the variable on running <code>PROCESS_SPECIAL_INIT_MAIN_TEAM_AFTER_QUIZ</code>. | ||
|- | |- | ||
|Winning Pool | |Winning Pool | ||
|$SCENARIO_SUB7 | |<code>$SCENARIO_SUB7</code> | ||
|Any | |Any | ||
|This variable retains the winning Pool ID from the quiz itself. This could prove useful for dialogue, or perhaps some other purpose? | |This variable retains the winning Pool ID from the quiz itself. This could prove useful for dialogue, or perhaps some other purpose? | ||
|- | |- | ||
|Winning Points | |Winning Points | ||
|$SCENARIO_SUB6 | |<code>$SCENARIO_SUB6</code> | ||
|Any | |Any | ||
|This variable retains the number of points the winning Pool ID had after the tie-breaking process. This could prove useful for dialogue, or perhaps some other purpose? | |This variable retains the number of points the winning Pool ID had after the tie-breaking process. This could prove useful for dialogue, or perhaps some other purpose? | ||
|- | |- | ||
|Fuwarante Bit X | |Fuwarante Bit X | ||
|$BIT_FUWARANTE_LOCAL[X] | |<code>$BIT_FUWARANTE_LOCAL[X]</code> | ||
|Any | |Any | ||
|These correspond directly to the FUWARANTE blacklist, and in this example is used to pass forward the Time/Darkness question to $PLAY_OLD_GAME, the variable responsible for the recruitment rate buff for playing Time/Darkness. | |These correspond directly to the FUWARANTE blacklist, and in this example is used to pass forward the Time/Darkness question to <code>$PLAY_OLD_GAME</code>, the variable responsible for the recruitment rate buff for playing Time/Darkness. | ||
|- | |- | ||
|Direct Script Variable | |Direct Script Variable | ||
| Line 298: | Line 326: | ||
A full list of script variables with their appropriate descriptions will be provided in "Other Resources", and might prove useful for more advanced tinkering in this panel. | A full list of script variables with their appropriate descriptions will be provided in "Other Resources", and might prove useful for more advanced tinkering in this panel. | ||
== Full Script Translation: == | == Full Script Translation == | ||
This tab of the sheet is dedicated to translating all lines of dialogue into Spanish, French, German, and Italian, for an EU ROM. If the hack this is for doesn't need translation, this tab can be completely skipped. One of the most essential features of a translated quiz is the ability to pre-translate the vanilla text strings from the original quiz. | |||
=== Upper Panel === | |||
By default, the left-most checkbox of the upper panel will "activate" this sheet for translation. This may cause lag, and will cause more lag every time a change is made on one of the prior sheets, while enabled. Only begin translating once finished with the quiz, at least in the short term. [[File:Full Script Translation Upper Panel.png|alt=Location of the Full Script Translation Upper Panel.|center|thumb|600x600px|Location of the Full Script Translation Upper Panel.]]The "Auto-Translate Vanilla Strings" check-box will automatically search for and translate exact matches to vanilla Quiz strings. Additional translations can be added in "Vanilla Translation Strings" as needed. If no exact match is found, the translation will be left blank for manual translation. "Auto-Translate Pokemon" similarly will attempt to translate exact matches for dialogue specific to the final species. For example, the English string <code>[R][CN]Will be a [CS:K]Magnemite[CR]![W:60]</code> will be automatically translated to <code>[R][CN]wird ein [CS:K]Magnetilo[CR]![W:60</code>] (German), based on Magnemite's German name and the phrase "wird ein ___!". This will only occur if the checkbox is enabled, and only for Pokemon names present in "Vanilla Translation Strings". Finally, the "Trim [S:0] Before Translation" checkbox will remove all <code>[S:0]</code> text tags from the dialogue before searching for a match, ensuring that the various "Yes.", "No.". "Of Course!", and "Open it!" are not translated automatically, per their vanilla quiz questions. Regardless of whether this checkbox is enabled, the final script output will not contain the <code>[S:0]</code> tags. | |||
=== String Translation Panel === | |||
The string translation panel, on the right of this tab, is where text string translation will actually occur. | |||
[[File:String Translation Panel.png|alt=Location of String Translation Panel.|center|thumb|600x600px|Location of String Translation Panel.]] | |||
On the left, are English lines of text extracted from other tabs of the sheet. each column corresponds to an EU language (Spanish, French, German, Italian). At the top of each column, is a count of how many untranslated lines of dialogue are left for that language, as well as a checkbox to enable/disable each language. In the above screenshot, French dialogue will not be added to the final script, because the checkbox is enabled. In the rows themselves, are pink cells (vanilla translated text), green cells (empty), and blue cells (manual translation). Simply review each pink cell, and manually translate the English for that row for green cells so they turn blue. If a pink cell needs editing, simply copy the cell, and '''Paste Values''' it on top of itself, and it will turn blue, which is safe to edit. | |||
== Vanilla Translation Strings == | |||
This tab of the sheet is used to store vanilla strings from the base game, and official Pokemon translations. These can be amended and edited as desired, to include custom strings for auto-translation, or new Pokemon name translations. | |||
[[File:Vanilla Translation Strings Dialogue.png|alt=Vanilla Translation Strings Dialogue|center|thumb|600x600px|Vanilla Translation Strings Dialogue]] | |||
This area above contains all relevant vanilla strings, which can be added to or amended as desired, in the green cells in these 5 columns. If a need arises to make changes to the quiz after translation, it is best to move all manually translated lines to this tab, before making any changes. Additionally, the lookup table for Pokemon species names can be modified: | |||
[[File:Vanilla Translation Strings Species.png|alt=Vanilla Translation Strings Species|center|thumb|452x452px|Vanilla Translation Strings Species]] | |||
On the far right of the tab, are a list of every Pokemon through Scarlet & Violet, and the French/German translations for each species (Spanish and Italian use English species names). These can also be amended or added to as desired. | |||
== Full Script Compression: = | == Full Script Compression == | ||
Last but not least, is the Full Script Compression Tab. This tab compiles all of the information from the other tabs, and compresses it into a copy/pastable batch of scripts for SkyTemple. | |||
=== Upper Panel === | |||
There are a handful of settings in this upper panel. "White Space" is as it has been for every prior tab, but that's the only returning input. | |||
[[File:Full Script Compression Upper Panel.png|alt=Full Script Compression Upper Panel Location.|center|thumb|600x600px|Full Script Compression Upper Panel Location.]] | |||
"Use Full MegaScript" will compile the entire quiz into one script. This is only possible for English-only quizzes, and is only advised for quizzes with few questions and fewer starter choices. "Use Translated Scripts?" will use the outputs from Full Script Translation, which will be empty if the sheet is not active. Disable this checkbox for English-only quizzes. "Generate Unionall CORO" will create the unionall code needed to run the quiz, for a copy and paste replacement for the existing <code>CORO EVENT_M00A_01</code> coroutine. The "Script File LEVEL Name" should reflect the location of the map LEVEL "folder" that the script file will actually be under. The "Script File SCRIPT Name" should become the name of the acting script itself, and should be 8 alphanumerical characters or fewer (not case-sensitive). Finally, the "Sector Param." is the sector parameter of the <code>supervision_ExecuteActingSub();</code> [[List of Opcodes#0x12d - supervision ExecuteActingSub|Opcode]]. Generally this should be zero, though none of these scripts internally utilize the sector parameter, should it be of interest for customization. | |||
== | === SkyTemple Script Outputs === | ||
This portion of the sheet consists of outputs to SkyTemple. Unlike most output cells thus far, these are actually intended for use! | |||
[[File:SkyTemple Script Outputs.png|alt=SkyTemple Script Outputs Location.|center|thumb|600x600px|SkyTemple Script Outputs Location.]] | |||
The intended places for each of these outputs will be described in "Importing The Scripts To SkyTemple", but when copying a script, be sure to copy all cells in the box with text. | |||
== Importing The Scripts To SkyTemple == | == Importing The Scripts To SkyTemple == | ||
Now for the fun part! Actually applying everything to SkyTemple, and seeing the quiz actually play out. This section will briefly cover installation of SkyPatches and Special Processes, though more generalized guides for these things are or will be available. First though, prior installation of StarterMenuTool will change some of these steps. | |||
=== Converting From StarterMenuTool === | |||
There are very few differences between starting fresh and converting from StarterMenuTool. The differences are as follows: | |||
* FixPartnerNameMenu is Applied: Since the SkyPatch is already applied, it does not need to be applied again. It can be reapplied without issue, though it already exists in the ROM. | |||
* Existing Special Processes: Older versions of <code>starter_setter</code> and <code>set_frame_color</code> were added via StarterMenuTool. These may function as intended for QMT, especially <code>set_frame_color</code> which has seen zero change between the two tools, but it is recommended to update them by replacing them, or to use new slots for the QMT SPs. | |||
* Existing Acting Script: StarterMenuTool takes the same approach as QMT in creating a new acting scene for the quiz itself. This existing script can be repurposed into one of the QMT acting scripts, though with SkyTemple alone it cannot be renamed, meaning the script name it will be used for in the Full Script Compression Upper Panel must be renamed. | |||
* Edit to Vanilla Quiz: StarterMenuTool modifies the original quiz script m00a01a.ssb. While these changes have no net impact on QMT, it would impact the debug mode, as the code to create a team from the default starters has been removed. If this functionality needs to be restored, simply add the following line after "if ( debug ) {" in m00a01a.ssb: | |||
<code>switch ( ProcessSpecial(PROCESS_SPECIAL_INIT_MAIN_TEAM_AFTER_QUIZ, 0, 0) ) { }</code> | |||
* Existing Unionall Edit: StarterMenuTool also requires the modification of <code>coro EVENT_M00A_01</code>. QuizMenuTool will require this coroutine to be edited to run m00a01a in debug mode, and the QMT scripts otherwise. | |||
=== Installing the SkyPatches === | |||
In order for QuizMenuTool to function, the following SkyPatches must be applied. | |||
* FixPartnerNameMenu: Gives <code>MENU_PARTNER_NAME</code> the ability to actually nickname the partner. Requires ExtraSpace as a pre-requisite. | |||
* ExtractSPCode: Enables the use of custom Special Processes used heavily by QMT. | |||
Installing FixPartnerNameMenu is relatively simple. After downloading the file from the github repo, navigate to <code>Patches -> ASM</code> in SkyTemple. Then, click the "Open Patch Directory" button. | |||
[[File:InstallFixPartnerNamePatch.png|alt=The "Open Patch Folder" button is on the bottom left.|center|thumb|600x600px|The "Open Patch Directory" button is on the bottom left.]] | |||
Finally, drag <code>FixPartnerName.skypatch</code> into the folder, and close it. The patch will now be in the "Others" Tab, ready for installation. If ExtraSpace is not installed, SkyTemple will prompt the installation of both patches sequentially. This is good, do that. | |||
=== | Next, is the installation of ExtractSPCode. Once again, navigate to <code>Patches->ASM</code>, and select the "Utility" tab. Install ExtractSPCode, and any necessary pre-requisites (there shouldn't be any, except maybe ExtraSpace). | ||
[[File:ExtractSPCode.png|alt=ExtractSPCode Location|center|thumb|600x600px|ExtractSPCode Location]] | |||
=== Applying The Special Processes === | |||
Now for installing the Special Processes themselves. If the hack already has custom Special Processes it wishes to keep, or the IDs of the special processes in the sheet have been changed, apply the SPs as desired, but ensure the sheet has accurate IDs (NOT Effects), so it can call them. For simplicity, these are the default locations of each SP: | |||
{| class="wikitable" | |||
|+ | |||
!Spreadsheet Tab | |||
!Spreadsheet Input Name | |||
!SP File Name | |||
!ID | |||
!Effect | |||
|- | |||
|Starter Selection Generator | |||
|starter_setter SP ID | |||
|starter_setter.asm | |||
|64 | |||
|61 | |||
|- | |||
|Starter Selection Generator | |||
|set_frame_color SP ID | |||
|set_frame_color.asm | |||
|65 | |||
|62 | |||
|- | |||
|Aura Bow Generator | |||
|CheckTSPress SP ID | |||
|CheckTSPress.asm | |||
|66 | |||
|63 | |||
|- | |||
|Aura Bow Generator | |||
|ReturnTSPFrames SP ID | |||
|ReturnTSPFrames.asm | |||
|67 | |||
|64 | |||
|- | |||
|Aura Bow Generator | |||
|MoveText2TopScreen SP ID | |||
|MoveText2TopScreen.asm | |||
|68 | |||
|65 | |||
|- | |||
|Starter Selection Generator | |||
|Set_Demo_Character SP ID | |||
|Set_Demo_Character.asm | |||
|69 | |||
|66 | |||
|- | |||
|Aura Bow Generator | |||
|get_favorite_config_color SP ID | |||
|get_favorite_config_color.asm | |||
|70 | |||
|67 | |||
|} | |||
Ensure that you download the correct set of special processes for your version of the ROM (US or EU). Next, navigate to <code>Patches->ASM->Special Processes</code>, and click the "Add Special Process" button until enough IDs are in the list for each new Special Process. | |||
[[File:How2AddSpecialProcesses1.png|alt=The "Add Special Process" button is at the very bottom.|center|thumb|600x600px|The "Add Special Process" button is at the very bottom.]] | |||
The list should look like it does in the image when done. With that completed, navigate to the "Effects Code" tab. Click the "+" Button to create a new effect. Then, click the "Import Code" button at the bottom to select the special process to be imported to this effect. | |||
[[File:How2AddSpecialProcesses2.png|center|thumb|600x600px|Clicking the "+" Button adds a new effect. Each new effect must have the correct .asm file imported into it, as specified in the table.]] | |||
In the above image, Special Process <code>starter_setter.asm</code> is being imported to Effect 61, which corresponds to ID 64. Similarly, <code>set_frame_color.asm</code> should be imported to Effect 62 (ID 65), <code>CheckTSPress.asm</code> should be imported to Effect 63, etc. | |||
Once all the necessary Special Processes have been imported to their effects, the last thing that needs to be done is assigning the effects to their IDs. Navigating back to the "Special Process Effects" tab, assign each effect to the correct ID, as shown below: | |||
[[File:How2AddSpecialProcesses3.png|alt=Simply clicking on the effect cell will allow it to be edited.|center|thumb|600x600px|Simply clicking on the effect cell will allow it to be edited.]] | |||
With that, SP importing is complete, and all that remains is to save the ROM. | |||
=== Creating QMT Script Files === | |||
Next, is the process of actually creating the QMT script files. For simplicity, this guide will demonstrate the process on LEVEL_S02P01A, the same location in the script files as the original quiz. If you plan on putting the QMT script files elsewhere, ensure this is properly accounted for in Full Script Compression. Navigate to Script Scenes->S02P01A. If you are using a MegaScript, create ONE new acting scene. Otherwise, create four of them, each with the name in FullScriptCompression. | |||
[[File:ImportingQMTScriptFiles1.png|alt=Be sure you click "Create Acting Scene"! It is important that these scripts are acting scenes.|center|thumb|600x600px|Be sure you click "Create Acting Scene"! It is important that these scripts are acting scenes.]] | |||
The newly created scenes should appear in the Acting (ssa) folder. Navigate to the first one created, and double-click on "[script-name].ssb". | |||
[[File:ImportingQMTScriptFiles2.png|alt=In this case, "qmt01.ssb" on the right will open the script file's "ssb" code.|center|thumb|600x600px|In this case, "qmt01.ssb" on the right will open the script file's "ssb" code.]] | |||
From there, simply paste from the respective part of the sheet, and attempt to save the script. | |||
[[File:ImportingQMTScriptFiles3.png|center|thumb|600x600px|You can also navigate between script files with the search bar on the left!]] | |||
Repeat the process of pasting in the remaining scripts. Finally, the script that contains the aura bow segment of the quiz (script #2 or the megascript) needs additional work done to the .ssa file. Navigate to S02P01A->M00A01A, and click the Export Button (square with an up arrow in it). | |||
[[File:Export Quiz .ssa.png|alt=Visual for exporting the .ssa for M00A01A for QuizMenuTool|center|thumb|600x600px|The Export Button is up top!]] | |||
Then just import this file into the script containing the Aura Bow segment, as shown below: | |||
[[File:Aura Bow SSA import.png|center|thumb|600x600px|The Export Button is right next to the Import button!]] | |||
After that, save the ROM. The quiz is nearly ready, all that's left is setting up unionall... | |||
=== Editing Unionall === | |||
Unionall is a big file, but there's only a very specific part that needs to be edited. Open Unionall by using the search bar in the Script Engine Debugger, then do CTRL + F (Command + F for Mac, you should know your equivalent if you use Linux) to find coroutine inside unionall. | |||
[[File:Unionall coro EVENT M00A 01.png|center|thumb|600x600px|Be sure you search for EXACTLY "coro EVENT_M00A_01". This should be the only match!]] | |||
Once you find it, select the entire coroutine, and replace it with the unionall final output. the result should look something like this: | |||
[[File:QMT coro EVENT M00A 01.png|center|thumb|600x600px|Modified Unionall Coroutine, should look roughly like this after pasting.]] | |||
With that, save unionall, and the quiz is ready for testing! | |||
== Troubleshooting == | |||
if you run into any of these issues, or the fix doesn't work, reach out to happylappy for questions in the SkyTemple discord! | |||
=== The Game Crashed before the first script loaded! === | |||
Do your script names and locations match between unionall (or the sheet if it's making the unionall coro), and your script file names? If not, that would cause a crash. | |||
=== The Game Crashed When a SP tried to run! === | |||
Have you used the correct SP IDs and regions? Might be worth importing them again, just in case. | |||
=== The Game Crashed/Glitched out between scripts! === | |||
That is... concerning. See, script files are capable of overwriting other things in RAM if they're too big (which is why QMT usually splits into 4 separate scripts). Quizzes with an obscene number of questions or starters may still overwrite something important in RAM anyway, which would need to be handled on a case-by-case basis. | |||
=== One of my scripts won't save! === | |||
That's concerning, but could be the result of leaving a question or starter unfinished? Depends heavily on the error message. | |||
== Other Resources == | == Other Resources == | ||
=== QMT Script Variable Map === | === QMT Script Variable Map === | ||
Below is a table of every script variable used by QuizMenuTool, and what their use-case is for each script. Any variable absent from the table is unused by QMT directly. Variable usage can perhaps be optimized somewhat, but this map functions properly. | |||
{| class="wikitable" | |||
!Script Variable Name | |||
!Index | |||
!Script #1 | |||
!Script #2 | |||
!Script #3 | |||
!Script #4 | |||
|- | |||
|$SCENARIO_SUB1 | |||
|0 | |||
|Backup of Pre-Quiz $PLAYER_KIND | |||
| colspan="3" rowspan="1" |Winning # of Points Backup | |||
|- | |||
|$SCENARIO_SUB2 | |||
|0 | |||
|Backup of 0th index of Pre-Quiz $PLAYER_KIND_BACKUP | |||
| colspan="3" rowspan="1" |Winning Pool ID Backup | |||
|- | |||
|$SCENARIO_SUB3 | |||
|0 | |||
|Backup of Pre-Quiz $ATTENDANT1_KIND | |||
| - | |||
|# of times hero gen. failed | |||
| - | |||
|- | |||
|$SCENARIO_SUB4 | |||
|0 | |||
|Backup of 0th index of Pre-Quiz $ATTENDANT1_KIND_BACKUP | |||
| - | |||
| - | |||
| - | |||
|- | |||
|$BIT_FUWARANTE_LOCAL | |||
|All | |||
| colspan="4" rowspan="1" |FUWARANTE blacklist flags | |||
|- | |||
|$LOCAL0 | |||
| - | |||
|Max # of points. | |||
| colspan="3" rowspan="1" |Winning # of Points / (Aura Bow Color Backup) | |||
|- | |||
|$LOCAL1 | |||
| - | |||
|# Questions Asked / Winning Pool ID | |||
| colspan="3" rowspan="1" |Winning Pool ID | |||
|- | |||
|$SCENARIO_TALK_BIT_FLAG | |||
|Varies | |||
| colspan="4" rowspan="1" |Question Has Been Asked? | |||
|- | |||
|$SCENARIO_MAIN | |||
|0 | |||
| colspan="4" rowspan="1" |# of tied pools (-1 if not checking ties) | |||
|- | |||
|$SCENARIO_SIDE | |||
|0 | |||
| colspan="4" rowspan="1" |# of pts to add to tied pool | |||
|- | |||
|$RECYCLE_COUNT | |||
| - | |||
| colspan="4" rowspan="1" |Post-Tie Max # of Pts. | |||
|- | |||
|$CONFIG_COLOR_KIND | |||
| - | |||
| - | |||
| colspan="3" rowspan="1" |Aura Bow Color | |||
|- | |||
|$HERO_TALK_KIND | |||
| - | |||
| - | |||
| - | |||
| colspan="2" rowspan="1" |Hero Talk Group | |||
|- | |||
|$PARTNER_TALK_KIND | |||
| - | |||
| - | |||
| - | |||
| - | |||
|Partner Talk Group | |||
|- | |||
|$VERSION | |||
| - | |||
| colspan="3" rowspan="1" |Pool 0 Pts. | |||
|Reset to 1 | |||
|- | |||
|$CRYSTAL_COLOR_01 | |||
| - | |||
| colspan="3" rowspan="1" |Pool 1 Pts. | |||
|Reset to 0 | |||
|- | |||
|$CRYSTAL_COLOR_02 | |||
| - | |||
| colspan="3" rowspan="1" |Pool 2 Pts. | |||
|Reset to 0 | |||
|- | |||
|$CRYSTAL_COLOR_03 | |||
| - | |||
| colspan="3" rowspan="1" |Pool 3 Pts. | |||
|Reset to 0 | |||
|- | |||
|$COMPULSORY_SAVE_POINT | |||
| - | |||
| colspan="3" rowspan="1" |Pool 4 Pts. | |||
|Reset to 0 | |||
|- | |||
|$COMPULSORY_SAVE_POINT_SIDE | |||
| - | |||
| colspan="3" rowspan="1" |Pool 5 Pts. | |||
|Reset to 0 | |||
|- | |||
|$SCENARIO_SELECT_BACKUP | |||
|0 | |||
| colspan="3" rowspan="1" |Pool 6 Pts. | |||
|Reset to 0 | |||
|- | |||
|$GROUND_ENTER | |||
| - | |||
| colspan="3" rowspan="1" |Pool 7 Pts. | |||
|Reset to 0 | |||
|- | |||
|$GROUND_ENTER_LINK | |||
| - | |||
| colspan="3" rowspan="1" |Pool 8 Pts. | |||
|Reset to 0 | |||
|- | |||
|$GROUND_GETOUT | |||
| - | |||
| colspan="3" rowspan="1" |Pool 9 Pts. | |||
|Reset to 0 | |||
|- | |||
|$GROUND_MAP | |||
| - | |||
| colspan="3" rowspan="1" |Pool 10 Pts. | |||
|Reset to 0 | |||
|- | |||
|$GROUND_PLACE | |||
| - | |||
| colspan="3" rowspan="1" |Pool 11 Pts. | |||
|Reset to 0 | |||
|- | |||
|$GROUND_ENTER_BACKUP | |||
|0 | |||
| colspan="3" rowspan="1" |Pool 12 Pts. | |||
|Reset to 0 | |||
|- | |||
|$GROUND_ENTER_LINK_BACKUP | |||
|0 | |||
| colspan="3" rowspan="1" |Pool 13 Pts. | |||
|Reset to 0 | |||
|- | |||
|$GROUND_GETOUT_BACKUP | |||
|0 | |||
| colspan="3" rowspan="1" |Pool 14 Pts. | |||
|Reset to 0 | |||
|- | |||
|$GROUND_MAP_BACKUP | |||
|0 | |||
| colspan="3" rowspan="1" |Pool 15 Pts. | |||
|Reset to 0 | |||
|- | |||
|$GROUND_PLACE_BACKUP | |||
|0 | |||
| colspan="3" rowspan="1" |Pool 16 Pts. | |||
|Reset to 0 | |||
|- | |||
|$DUNGEON_SELECT | |||
| - | |||
| colspan="3" rowspan="1" |Pool 17 Pts. | |||
|Reset to 0 | |||
|- | |||
|$DUNGEON_ENTER | |||
| - | |||
| colspan="3" rowspan="1" |Pool 18 Pts. | |||
|Reset to 0 | |||
|- | |||
|$DUNGEON_ENTER_MODE | |||
| - | |||
| colspan="3" rowspan="1" |Pool 19 Pts. | |||
|Reset to 0 | |||
|- | |||
|$DUNGEON_ENTER_INDEX | |||
| - | |||
| colspan="3" rowspan="1" |Pool 20 Pts. | |||
|Reset to 0 | |||
|- | |||
|$DUNGEON_RESULT | |||
| - | |||
| colspan="3" rowspan="1" |Pool 21 Pts. | |||
|Reset to 0 | |||
|- | |||
|$GROUND_START_MODE | |||
| - | |||
| colspan="3" rowspan="1" |Pool 22 Pts. | |||
|Reset to 0 | |||
|- | |||
|$DUNGEON_ENTER_BACKUP | |||
|0 | |||
| colspan="3" rowspan="1" |Pool 23 Pts. | |||
|Reset to 0 | |||
|- | |||
|$DUNGEON_ENTER_MODE_BACKUP | |||
|0 | |||
| colspan="3" rowspan="1" |Pool 24 Pts. | |||
|Reset to 0 | |||
|- | |||
|$DUNGEON_ENTER_INDEX_BACKUP | |||
|0 | |||
| colspan="3" rowspan="1" |Pool 25 Pts. | |||
|Reset to 0 | |||
|- | |||
|$DUNGEON_RESULT_BACKUP | |||
|0 | |||
| colspan="3" rowspan="1" |Pool 26 Pts. | |||
|Reset to 0 | |||
|- | |||
|$GROUND_START_MODE_BACKUP | |||
|0 | |||
| colspan="3" rowspan="1" |Pool 27 Pts. | |||
|Reset to 0 | |||
|- | |||
|$REQUEST_CLEAR_COUNT | |||
| - | |||
| colspan="3" rowspan="1" |Pool 28 Pts. | |||
|Reset to 0 | |||
|- | |||
|$PLAYER_KIND | |||
| - | |||
|Pool 29 Pts. | |||
| colspan="3" rowspan="1" |Reset to Pre-Quiz | |||
|- | |||
|$ATTENDANT1_KIND | |||
| - | |||
|Pool 30 Pts. | |||
| colspan="3" rowspan="1" |Reset to Pre-Quiz | |||
|- | |||
|$ATTENDANT2_KIND | |||
| - | |||
| colspan="3" rowspan="1" |Pool 31 Pts. | |||
|Reset to 0 | |||
|- | |||
|$PLAYER_KIND_BACKUP | |||
|0 | |||
|Pool 32 Pts. | |||
| colspan="3" rowspan="1" |Reset to Pre-Quiz | |||
|- | |||
|$ATTENDANT1_KIND_BACKUP | |||
|0 | |||
|Pool 33 Pts. | |||
| colspan="3" rowspan="1" |Reset to Pre-Quiz | |||
|- | |||
|$ATTENDANT2_KIND_BACKUP | |||
|0 | |||
| colspan="3" rowspan="1" |Pool 34 Pts. | |||
|Reset to 0 | |||
|- | |||
|$HERO_FIRST_KIND | |||
| - | |||
| colspan="3" rowspan="1" |Pool 35 Pts. | |||
|Reset to 0 | |||
|- | |||
|$PARTNER_FIRST_KIND | |||
| - | |||
| colspan="3" rowspan="1" |Pool 36 Pts. | |||
|Reset to 0 | |||
|- | |||
|$RANDOM_REQUEST_NPC03_KIND | |||
| - | |||
| colspan="3" rowspan="1" |Pool 37 Pts. | |||
|Reset to 0 | |||
|- | |||
|$WORLD_MAP_LEVEL | |||
| - | |||
| colspan="3" rowspan="1" |Pool 38 Pts. | |||
|Reset to 0 | |||
|- | |||
|$EVENT_LOCAL | |||
| - | |||
| colspan="3" rowspan="1" |Pool 39 Pts. | |||
|Reset to 0 | |||
|- | |||
|$DUNGEON_EVENT_LOCAL | |||
| - | |||
| colspan="3" rowspan="1" |Pool 40 Pts. | |||
|Reset to 0 | |||
|- | |||
|$LOTTERY_RESULT | |||
| - | |||
| colspan="3" rowspan="1" |Pool 41 Pts. | |||
|Reset to 0 | |||
|- | |||
|$ITEM_BACKUP | |||
|0 | |||
| colspan="3" rowspan="1" |Pool 42 Pts. | |||
|Reset to 0 | |||
|- | |||
|$ITEM_BACKUP_KUREKURE | |||
|0 | |||
| colspan="3" rowspan="1" |Pool 43 Pts. | |||
|Reset to 0 | |||
|- | |||
|$ITEM_BACKUP_TAKE | |||
|0 | |||
| colspan="3" rowspan="1" |Pool 44 Pts. | |||
|Reset to 0 | |||
|- | |||
|$ITEM_BACKUP_GET | |||
|0 | |||
| colspan="3" rowspan="1" |Pool 45 Pts. | |||
|Reset to 0 | |||
|- | |||
|$REQUEST_THANKS_RESULT_KIND | |||
| - | |||
| colspan="3" rowspan="1" |Pool 46 Pts. | |||
|Reset to 0 | |||
|- | |||
|$REQUEST_THANKS_RESULT_VARIATION | |||
| - | |||
| colspan="3" rowspan="1" |Pool 47 Pts. | |||
|Reset to 0 | |||
|- | |||
|$SUB30_SPOT_LEVEL | |||
| - | |||
| colspan="3" rowspan="1" |Pool 48 Pts. | |||
|Reset to 0 | |||
|- | |||
|$TEAM_RANK_EVENT_LEVEL | |||
| - | |||
| colspan="3" rowspan="1" |Pool 49 Pts. | |||
|Reset to 0 | |||
|- | |||
|$PLAY_OLD_GAME | |||
| - | |||
| colspan="3" rowspan="1" |Pool 50 Pts. | |||
|Reset to 0 | |||
|} | |||
Latest revision as of 19:46, 11 August 2025
This guide explains how to use QuizMenuTool to create a custom Personality Quiz. The bulk of this guide will explain the use of the google sheets portion of the tool. A rudimentary understanding of SkyTemple scripting is helpful for this task, but not strictly required. These topics will be covered at the end for the sake of completion, but only to the extent that they are needed for QuizMenuTool.
About QuizMenuTool
What Is QuizMenuTool?
QuizMenuTool is a customizable ExplorerScript replica of the Explorers of Sky Personality Quiz and Starter Selection, with minimal hardcoded aspects. The original quiz was designed to consist mostly of message_Menu() ASM, to make editing the personality quiz accessible without the need to learn ASM.
What can QuizMenuTool do?
QuizMenuTool can modify the process of using the quiz to select a starter, expand/reduce the starter list, add/remove/modify questions from the quiz, and much more! In fact, the better question might be...
What Limitations does QuizMenuTool have?
There are a few critical things QuizMenuTool was not designed to do, though many of these could be remedied in the future if enough demand exists. Here's a list of what QuizMenuTool fails to replicate from the vanilla quiz:
- Hero/Partner Type Exclusion: In the vanilla quiz, the hero and partner are prevented from sharing a type, to encourage team balance. No option for such a restriction has been implemented yet, though such a thing would be possible in the future, or be scripted manually for a specific hack.
- SwitchMenu Portraits: In the vanilla quiz, scrolling to a partner choice displays a portrait of that partner, which gradually changes in expression. This feature would require significant custom code to emulate, and is unlikely to be available for QuizMenuTool.
- Third Party Starter Tweaks: The original starter list is completely unused by QuizMenuTool. Changing it has no impact on the quiz. Players of a hack using QuizMenuTool will have difficulty adding their own starters to the game, though this could potentially be remedied with a special process checking the starter list against what it is expected to be, and assigning the desired starter if a mismatch is found?
- Incompatibility with Japanese ROMs: Currently, QuizMenuTool is designed to only work for NA and EU ROMs. while in theory a Japanese Quiz could be designed, the Special Processes are not Japanese-compatible. This could be remedied with little effort, but the tool is designed for EU/NA ROMs.
Who QuizMenuTool is for
If either of the below points do not apply to you, you do not need QuizMenuTool.
- You would like to expand (or shrink) the list of starter options in the game.
- You would like to keep the personality quiz in the game, or edit the quiz directly.
If you only want to change the size of the starter list, and do not want the personality quiz (as if the SkipQuiz patch is applied), you should instead use StarterMenuTool, which is less powerful but requires much less work to set up.
Programs and Files
Required Programs and Files
- Explorers of Sky Personality Quiz Assembling Sheet
- Necessary Special Processes and SkyPatches
- SkyTemple
General Spreadsheet Tips
Making a Copy of the Sheet
The above link does NOT grant edit access. In order to use the sheet, a copy will need to be made as follows:

First click the "File" button on the top left. Next, "Make a Copy" of the sheet. Finally, name the copy as desired.
Cell Color-Coding
Throughout the spreadsheet, most cells are color-coded. Here's a brief explanation of each color present in the sheet:
- Green Cells are for user input. If a cell is green, it is intended to contain input data.
- Grey Cells contain formulas. They will update automatically, and should not be edited.
- Orange Cells are for user outputs. If a cell is orange, it is intended to be exported elsewhere, such as to a SkyTemple script.
- Cells without a color or of an unspecified color are typically safe to edit. Always check for a formula first though!
Paste Values Only
This tab is the first which will require the use of "Paste Values". When this guide specifies that a copy/paste must "Paste Values", this means that the copied text is a formula, and the pasted text should not be a formula.

There are two ways to paste values, either by right-clicking the paste location and selecting "Paste Special" then "Values Only", or by holding shift as you paste.
Quiz Preamble Generator
The Quiz Preamble Generator Tab as a whole exists to create the very beginning of the quiz.
Upper Panel
Most tabs in the sheet contain an upper panel of some kind, with various simple inputs and feedback on them:

The "Bottom Screen" and "Top Screen" inputs are the map ID that should be used for that screen's background. Similarly, the Background Music Name/ID is a BGM name (or number) of the BGM that should play throughout the quiz. The "White Space?" checkbox will attempt to add indents to the output ExplorerScript lines, making the output script more human-readable.
Preamble Text
This is the first of many direct inputs for ExplorerScript code. Due to the way spreadsheets store cell data, " " behave weirdly when present in the final script. Please use ' ' instead. This input is for the first set of dialogue before the questions actually begin.

Outputs
The orange output cell on this sheet is largely unimportant, but is present for debug purposes. It compiles the portions of the script using the inputs on this tab of the sheet.
Starter Selection Generator
This tab of the sheet is primarily for inputting data about the starters, or the personality pools they belong to.
Upper Panel

This upper panel contains 4 inputs, 3 of which are for Special Processes pertaining to starter selection. If other Special Processes have already been added, these Special Process IDs will need to be changed to free slots. The "White Space?" checkbox is the same as before, except for this tab of the sheet. The 4 grey cells are useful statistics about the input starters: how many different pools are used by the starters, how many species are present, and how many options there are for the hero and partner.
Personality Pool Input
Next, on the lower right is the nature "Pool" input. These contain the pool name, and the text that should be displayed if that pool is selected by the quiz.

The "Pool Name" field is only used by the Question Generator Tab, and will not show up anywhere in the final script. Modify these as desired as soon as possible, as it will be difficult to do so after designing the quiz questions. For best results, ensure all pool names are unique!
Starter Species Data
The bottom left segment of the sheet is the "Starter Species Data" input. This is part of a wider table, but each segment will be discussed individually.

While some of these fields should be intuitive, A brief description of each column is as follows:
- Species Name: The name of the species as you want it shown in the quiz. If the cell turns purple on entering a species name, this means the Pokémon could not be found in Vanilla Translation Strings. French and German Translations will need to be added by hand, or all strings involving the Pokémon will need to be translated manually.
- Species ID: The ID in SkyTemple of the Pokémon. [TODO: Explain how this is affected by ExpandPokeList].
- Gender: The gender of the Pokémon, used to set the frame color, and to add "♂" and "♀" to the hero/partner selection list. 0 is Male, 1 is Female, and 2 is Genderless.
- Pool ID: The number of the Pool the Pokémon should be categorized under. Each Pool that could be chosen by the Quiz should have at least one valid Pokémon, or Bulbasaur will be selected as a failsafe. If the species are not sorted by Pool ID, cells will turn red. The sheet will produce invalid labels if this table is not sorted by Pool ID!
- Start w/ Vowel: If the Pokémon should be referred to as "...an [Pokémon]", check this box.
Talk Group & Role Exclusion
Continuing along the table, the next two subsections are for "Talk Groups" and "Role Exclusion". Both of these segments relate to either the hero, or the partner.

In the vanilla game, the hero and partner have differing dialogue depending on their species-specific "Talk Group". These columns are dedicated to assigning the talk group for the hero or partner if that row's species is chosen. While it handles pronouns for dialogue, especially in gendered languages, it also affects the way the partner's dialogue is written. It does the same for the hero's dialogue, but in the English localization it only affects 2 lines in the entire game ("Whoa" <-> "Wah", "All right" <-> "OK"). This is how they are used in vanilla:
| # | Used By | Notable Species | Description |
|---|---|---|---|
| 1 | Partner | Male Squirtle/Totodile/Chimchar/Meowth/Munchlax | More Masculine/"Rural" Dialogue. (Refers to self as "Oira" in Japanese) |
| 2 | Partner | All other Male Pokémon | More Masculine/"Boyish" Dialogue. (Refers to self as "Boku" in Japanese) |
| 3 | Partner | All Female Pokémon | More Feminine Dialogue. (Refers to self as "Watashi" in Japanese) |
| 4 | Hero | All Male/Genderless Pokémon | Uses Masculine Pronouns |
| 5 | Hero | All Female Pokémon | Uses Feminine Pronouns |
The "Role Exclusion" checkboxes blacklist the row from being an option as a hero or as a partner respectively. Certain Pokémon, particularly Meowth and Munchlax, are unable to be heroes in the vanilla game. This section is how to replicate that feature of the original quiz.
Fuwarante Blacklist
Finally, on the far end of the table, is the Fuwarante Blacklist inputs. These are perhaps the most complicated portion of this tab of the sheet.

Each column corresponds to a bit of the script variable $BIT_FUWARANTE_LOCAL. If the matching flag is on, the starter in that row cannot be chosen. This will be elaborated on further in the "Question Loop Generator", but this is a brief explanation of what the bits represent by default:
| Bit | Description/Use Case |
|---|---|
| 0 | If enabled, $PLAY_OLD_GAME will be true, meaning the player answered that they have played Time/Darkness before.
|
| 1 | If enabled, the player has played EoS before, according to a custom starting question. |
| 2 | If enabled, the player has participated in a Mystery Mail event before, according to a custom ending question. |
| 3 | If enabled, the player claimed to be female in the final gender question. Enable for male starters. |
| 4 | If enabled, the player claimed to be male in the final gender question. Enable for female starters. |
Outputs
Once again, the orange output cells on the far right of this sheet are largely unimportant, but are present for debug purposes. It compiles the portions of the script using the inputs on this tab of the sheet.
Question Loop Generator
Upper Panel
The upper panel of this sheet mostly consists of inputs, though the single output is a reminder of how many unique pools are used by the Starter Selection Generator. The input directly left of it is for telling the Question Loop Generator how many pools are in use, and should be changed to match the display. On the upper left of the panel, there are inputs for how many questions the game should ask the player, and how many questions will be written for the quiz to randomly choose from. In vanilla, there are 64 possible questions, and 8 will be given to the player.

The bottom row consists of checkboxes to enable/disable the Custom/Standard First and Last Questions, such as the Gender Question and the Time/Darkness Question, which boosts recruit rates for certain species if you answer yes, and adds points to certain pools containing sky-exclusive Pokémon.
ExplorerScript Pre/Post Quiz Questions
Room for an additional question before and after the quiz has also been made, which along with the Gender and Time/Darkness questions can be modified in the below ExplorerScript inputs:

These are the primary use-cases for the Fuwarante Blacklist described above.
The [S:0] text tag will be explained in further detail below.
Question Generator
Note: The "Yes." and "No." options have the [S:0] text tag after them. This does functionally nothing, and exists primarily to aid in automatic string translation, as the localization teams translated the same English responses for questions differently based on context. This will be elaborated on further in "Full Script Translation". If there are no plans to use the sheet's translation features, it is safe to remove any variants of [S:0]. (instructions to do so in SkyTemple directly are present below).
About Question Templates
This tab of the sheet is dedicated to the design and storage of the individual random questions in the quiz. The way this sheet works revolves around "Question Templates" that store the question text, question number, answer text, pool ID, and points for that pool ID. Below is an example of a Question Template, and how it translates to question data:
| Question Text | Question # | |||||||
|---|---|---|---|---|---|---|---|---|
| Do you prefer to be busy or to have a lot of free time? | 35 | |||||||
| Answer Text | Pool 1 | Pool 2 | Pool 3 | Pool 4 | ||||
| ID | Points | ID | Points | ID | Points | ID | Points | |
| Being busy. | 11 | 4 | 8 | 2 | - | - | - | - |
| Free time! | 9 | 4 | - | - | - | - | - | - |
| In between. | 12 | 4 | - | - | - | - | - | - |
Question Template Input
On the far left, is an input for an existing Question Template.

The "Use Question Template Input" checkbox tells the sheet whether or not to use the Question Template provided. When writing questions entirely from scratch, disable this checkbox. When modifying existing questions, enable the checkbox, and paste in the Question Template. This will subsequently auto-fill the Question Data Inputs with the data within the template. If the auto-filled data itself needs to be altered, you will need to copy and paste values the data, then disable the checkbox.
Question Data Inputs

The Question Data Inputs Area should seem relatively intuitive. The question text is at the top, the answers are beneath, and up to 4 Personality Pools can gain points from each answer choice. The White Space checkbox is identical to the previous tab, and the question index is just the internal "ID" of the question. It should be incremented for each new question created, and will translate to the ID of the switch case in the final code. Note that the drop-down for the Pool Names is sourced from the Pool Names column of the Starter Selection Generator, and any changes to that list after creating the questions may lead to problems. With the current setup of the sheet, each question is limited to a maximum of 26 answer choices, but this limit is arbitrary, and can be circumvented by editing the question template manually, and pasting it in the Template List. In the event that a single question requires more than 26 choices, please ping happylappy in a support thread.
Question Template Output & Template List
Finally, once the question is complete, a template for the question will be created in "Question Template Output".

Before moving onto the next question, copy the template output, and Paste Values in the corresponding slot on the "Question Template List". By default, templates for each vanilla question are already in the Question Template List, ready to be edited or modified by copying and pasting into the Question Template Input. The Script Output Column is again for debug purposes, and is read automatically by another tab of the sheet.
Personality Pool Selection Generator
Once the quiz itself is completed, the points need to be tallied, so that a winning pool can be selected. The exact way that this happens in vanilla is a tad complicated, especially when it comes to breaking ties. Here are the steps that occur in vanilla:
- Points are added to pools containing Sky-Exclusive Starters if the player has played Time/Darkness.
- If Male is chosen for the gender question, +4 Points are added to Relaxed, Hasty, and Sassy. (Phanpy, Shinx, and Riolu)
- If Female is chosen for the gender question, +4 Points are added to Relaxed and Jolly. (Vulpix and Eevee)
- The highest pool is found, and chosen.
- If there is a tie, it is broken by adding a random number (0-19) to each, and rescoring the points.
- If there is STILL a tie, it chooses the smallest pool it can.
This tab of the sheet serves to implement these two features in a customizable way.
Upper Panel
About half of the upper panel is actually new this time. The "White Space" and "Number/# of Pools In Use" are unchanged, except they apply to this sheet.

The checkbox for "Do Pool Tinkering" enables/disables the Pool Tinkering portion of this sheet, while the "Maximum Tiebreaker Points" input determines the random value added to tied pools to decide a victor. Larger numbers result in less chance of a secondary tie, but could result in overflow for certain pools.
Pool Tinkering
As stated above, the vanilla quiz favors pools with Sky-Exclusive Starters for the specified gender if they've played Time/Darkness. Through checking the $BIT_FUWARANTE_LOCAL flags from the "Question Loop Generator", we can mimic this effect.

On the far left, are the IDs of the two flags that should be checked (without modification, this could be 0 for "Time/Darkness", and 3/4 for "Male/Female"). Depending on if the 1st and 2nd flags are true (1), or false (0), the selected pools (as many as needed) will gain the specified number of points. In order to accommodate for the "Surprise Me!" gender option, 2 points are given for male, 2 for "not male", 2 for "female", and 2 for "not female", in order to influence every pool containing a sky-exclusive starter. (A similar process is done for the Time/Darkness exclusive starters I've added to my example quiz, if the player has NOT played time/darkness). Up to 10 slots are present for pool tinkering, though more could be added if there is a pressing need.
Aura Bow Generator
The Aura Bow Generator serves to emulate the cinematics of the vanilla aura bow portion of the quiz. In addition to simply detecting when and for how long the player is touching the Aura Bow, the actual bow color needs to be determined! For the vanilla quiz, the process is as follows:
- Use DS Favorite Color (75% Chance): If the DS Favorite Color is selected, the user's favorite color will match the color of the bow.
- Use DS Mac Address (25% Chance): If the Mac Address is selected, then
mac_address & 0xFdetermines the color of the bow.
This functionality can be replicated by QuizMenuTool, and the chances can even be altered!
Upper Panel
The Aura Bow Generator's Upper Panel is one of the largest of every tab, though many of these inputs are similar to prior tabs of the sheet. The top left input boxes are Special Process IDs for the 4 Special Processes needed to emulate the Aura Bow portion of the quiz, and the "White Space?" Checkbox is the same as always. The "Aura Bow Output" on the top right is the final script output for this tab, unnecessary outside of debug purposes.

Beginning with the bottom left of the panel, there are 4 map LEVEL names. "Bottom 1" is for the background while touching the Aura bow, Bottom Screen 2 is for the presentation of the colored Aura Bow, and the Bottom/Top Screen 3 is the backgrounds that the script should end with, when transitioning to the starter reveal. Finally, on the bottom right of the upper panel is the "Touch Screen Aura Bow Object Name". Per the name, this is the name or ID of the object that should be present on the bottom screen, that will animate when the player touches it. The last three digits of the object seem to vary depending on unknown factors, so be sure to verify that yours matches by inspecting this object in M00A01A with SkyTemple.

Aura Reading Panel
Beginning on the lower left of the tab, the Aura Reading Panel consists of 3 ExplorerScript code segments, which play before the blank aura bow fades in, after the aura bow fades in, and if the player lets go of the touch screen too quickly.

At the very bottom of this panel, there are inputs for dialogue in all 5 languages that will play during the aura reading process. Unlike most text in the quiz, this string must be translated here, as every localization takes a different amount of time to print the dialogue. The length of time the touch screen should have been held for is calculated for each [W:X] text tag, and compared against the actual length of time the touch screen was held. Customizing this text string is possible in the box, so these calculations must be done by the sheet. If your hack is for a US ROM, or will be english-only, disable the "Use EU Strings" Checkbox. "Expected Text Speed (# of chars per frame)" should be the speed your dialogue prints at in SkyTemple. This will ensure that the actual length of the text is properly accounted for in the calculation. "Touch Screen Frame Tolerance" is a grace period for letting go of the bow. This is necessary for certain emulators, damaged touch-screens, failure to account for the dialogue box opening/closing, etc. Feel free to adjust as desired, such that the quiz is possible to complete.
Bow Selection Panel
Finally, the Bow Selection Panel handles the actual selection and presentation of the Aura Bow.

The upper left of the panel is for assigning weights to the three methods for selecting a bow color: DS Favorite Color, DS MAC Address, or a custom block of code. Note that these weights must be integers or the sheet will generate invalid code. For convenience, the percent chance of each option is computed by the sheet, based on the weights and total weight. The ExplorerScript input for the custom bow selection is on the right of this panel, and on the bottom left is the flavor-text for each bow color.
Variable Cleanup & End-Cap Generator
This tab of the sheet aims to clean up the bevy of variables used by the quiz, and prep the game for actually running. Since QMT uses a majority of the script variables the game has to function, this tab resets them all back to what they should be at the beginning of a save file, now that the quiz no longer needs them. If some part of the quiz needs to be remembered, such as the color of the aura bow, whether the player has played Time/Darkness, or the winning Quiz personality pool, that needs to be preserved in this tab. In addition, this is the tab where the starters are officially initialized, which allows them to be nicknamed. Finally, the special process for actually assigning the starters, PROCESS_SPECIAL_INIT_MAIN_TEAM_AFTER_QUIZ, will wipe $CONFIG_COLOR_KIND clean, replacing it with what the real quiz determined your aura bow color to be. Because the real quiz never runs during QMT, this will always be zero. As a result, the aura bow color needs to be saved somewhere besides $CONFIG_COLOR_KIND, then returned afterwards.
Upper Panel
This tab ALSO has an upper panel! The number of pools to clear should ideally match the number of pools in use. "White Space" does the same thing it has up to this point, and the far right output cell is read elsewhere, and only exists for debug purposes.

In the center of the panel are three new checkboxes. "Name Partner?" and "Name Hero?" should be somewhat intuitive, they enable/disable the ExplorerScript inputs for naming the hero and partner respectively, which will be elaborated on below. Finally, "Set $VERSION to 1?" sets the $VERSION script variable to 1 at the very end of the script. Without ASM modification, saving the game with this variable as anything besides 1 results in a "corrupt" save file. In the absence of a strong reason otherwise, this box should remain checked.
Hero Name, Partner Name, & Closing Remarks
These ExplorerScript Inputs are for... the code used for nicknaming the partner and hero respectively, as well as the last few lines of text before the quiz truly ends.

Note that MENU_PARTNER_NAME will not function without the dedicated SkyPatch, in the QMT github repo (linked at the top). Additionally, the menus themselves will close any active text-box the instant they are done printing, which is why the hero monologue ends with a [K]. A message_Close(); would also suffice. Finally, the closing remarks should actually fade out the BGM and screen as desired. Feel free to optimize the fades, there is probably a more efficient way to achieve the right effect.
Script Variable Preservation Panel
The Script Variable Preservation Panel serves to determine what information should be preserved after the quiz. By default, only the variables storing the personality pool counts are actually being erased, though certain configurations may require some variables to be kept, and others to be wiped in addition.

Beginning at the top, is the "Variable Erasure Blacklist". Based on other interactions with the sheet, the "Automatic Variables" will fill up automatically, but any script variables specified in this row will be kept as they are at the end of the quiz, and not erased. An example of a manual blacklist example might be $VERSION, which doesn't need a dedicated line of code for erasure if it will ALSO be set to 1 at the end. The next row, "Additional Variables to Erase", will be added to the list of erased variables if they are not already present. The $BIT_FUWARANTE_LOCAL variables should be erased in addition, as the Driftblim Gondola will interpret these variables as valid station passes to enter. Below that, is the "Variable Transfer Table". Prior to erasing anything, variables in the "Old Variable Name" column will be moved to the "New Variable Name". The old variable will be slated for erasure, while the new one will be spared. For convenience, the "Variable Meaning" Tab on the left will autofill one or both of these columns depending on the option you select:
| Variable Meaning | Old Variable Name | New Variable Name | Comments |
|---|---|---|---|
| Aura Bow Preserve | $CONFIG_COLOR_KIND
|
$LOCAL0
|
If this Variable Meaning is present, $CONFIG_COLOR_KIND will be restored in post. It's only purpose is to prevent the quiz from wiping the variable on running PROCESS_SPECIAL_INIT_MAIN_TEAM_AFTER_QUIZ.
|
| Winning Pool | $SCENARIO_SUB7
|
Any | This variable retains the winning Pool ID from the quiz itself. This could prove useful for dialogue, or perhaps some other purpose? |
| Winning Points | $SCENARIO_SUB6
|
Any | This variable retains the number of points the winning Pool ID had after the tie-breaking process. This could prove useful for dialogue, or perhaps some other purpose? |
| Fuwarante Bit X | $BIT_FUWARANTE_LOCAL[X]
|
Any | These correspond directly to the FUWARANTE blacklist, and in this example is used to pass forward the Time/Darkness question to $PLAY_OLD_GAME, the variable responsible for the recruitment rate buff for playing Time/Darkness.
|
| Direct Script Variable | Any | Any | This is an invitation to input whatever script variables are needed, and will adjust the coloration of the row to match. |
A full list of script variables with their appropriate descriptions will be provided in "Other Resources", and might prove useful for more advanced tinkering in this panel.
Full Script Translation
This tab of the sheet is dedicated to translating all lines of dialogue into Spanish, French, German, and Italian, for an EU ROM. If the hack this is for doesn't need translation, this tab can be completely skipped. One of the most essential features of a translated quiz is the ability to pre-translate the vanilla text strings from the original quiz.
Upper Panel
By default, the left-most checkbox of the upper panel will "activate" this sheet for translation. This may cause lag, and will cause more lag every time a change is made on one of the prior sheets, while enabled. Only begin translating once finished with the quiz, at least in the short term.

The "Auto-Translate Vanilla Strings" check-box will automatically search for and translate exact matches to vanilla Quiz strings. Additional translations can be added in "Vanilla Translation Strings" as needed. If no exact match is found, the translation will be left blank for manual translation. "Auto-Translate Pokemon" similarly will attempt to translate exact matches for dialogue specific to the final species. For example, the English string [R][CN]Will be a [CS:K]Magnemite[CR]![W:60] will be automatically translated to [R][CN]wird ein [CS:K]Magnetilo[CR]![W:60] (German), based on Magnemite's German name and the phrase "wird ein ___!". This will only occur if the checkbox is enabled, and only for Pokemon names present in "Vanilla Translation Strings". Finally, the "Trim [S:0] Before Translation" checkbox will remove all [S:0] text tags from the dialogue before searching for a match, ensuring that the various "Yes.", "No.". "Of Course!", and "Open it!" are not translated automatically, per their vanilla quiz questions. Regardless of whether this checkbox is enabled, the final script output will not contain the [S:0] tags.
String Translation Panel
The string translation panel, on the right of this tab, is where text string translation will actually occur.

On the left, are English lines of text extracted from other tabs of the sheet. each column corresponds to an EU language (Spanish, French, German, Italian). At the top of each column, is a count of how many untranslated lines of dialogue are left for that language, as well as a checkbox to enable/disable each language. In the above screenshot, French dialogue will not be added to the final script, because the checkbox is enabled. In the rows themselves, are pink cells (vanilla translated text), green cells (empty), and blue cells (manual translation). Simply review each pink cell, and manually translate the English for that row for green cells so they turn blue. If a pink cell needs editing, simply copy the cell, and Paste Values it on top of itself, and it will turn blue, which is safe to edit.
Vanilla Translation Strings
This tab of the sheet is used to store vanilla strings from the base game, and official Pokemon translations. These can be amended and edited as desired, to include custom strings for auto-translation, or new Pokemon name translations.

This area above contains all relevant vanilla strings, which can be added to or amended as desired, in the green cells in these 5 columns. If a need arises to make changes to the quiz after translation, it is best to move all manually translated lines to this tab, before making any changes. Additionally, the lookup table for Pokemon species names can be modified:

On the far right of the tab, are a list of every Pokemon through Scarlet & Violet, and the French/German translations for each species (Spanish and Italian use English species names). These can also be amended or added to as desired.
Full Script Compression
Last but not least, is the Full Script Compression Tab. This tab compiles all of the information from the other tabs, and compresses it into a copy/pastable batch of scripts for SkyTemple.
Upper Panel
There are a handful of settings in this upper panel. "White Space" is as it has been for every prior tab, but that's the only returning input.

"Use Full MegaScript" will compile the entire quiz into one script. This is only possible for English-only quizzes, and is only advised for quizzes with few questions and fewer starter choices. "Use Translated Scripts?" will use the outputs from Full Script Translation, which will be empty if the sheet is not active. Disable this checkbox for English-only quizzes. "Generate Unionall CORO" will create the unionall code needed to run the quiz, for a copy and paste replacement for the existing CORO EVENT_M00A_01 coroutine. The "Script File LEVEL Name" should reflect the location of the map LEVEL "folder" that the script file will actually be under. The "Script File SCRIPT Name" should become the name of the acting script itself, and should be 8 alphanumerical characters or fewer (not case-sensitive). Finally, the "Sector Param." is the sector parameter of the supervision_ExecuteActingSub(); Opcode. Generally this should be zero, though none of these scripts internally utilize the sector parameter, should it be of interest for customization.
SkyTemple Script Outputs
This portion of the sheet consists of outputs to SkyTemple. Unlike most output cells thus far, these are actually intended for use!

The intended places for each of these outputs will be described in "Importing The Scripts To SkyTemple", but when copying a script, be sure to copy all cells in the box with text.
Importing The Scripts To SkyTemple
Now for the fun part! Actually applying everything to SkyTemple, and seeing the quiz actually play out. This section will briefly cover installation of SkyPatches and Special Processes, though more generalized guides for these things are or will be available. First though, prior installation of StarterMenuTool will change some of these steps.
Converting From StarterMenuTool
There are very few differences between starting fresh and converting from StarterMenuTool. The differences are as follows:
- FixPartnerNameMenu is Applied: Since the SkyPatch is already applied, it does not need to be applied again. It can be reapplied without issue, though it already exists in the ROM.
- Existing Special Processes: Older versions of
starter_setterandset_frame_colorwere added via StarterMenuTool. These may function as intended for QMT, especiallyset_frame_colorwhich has seen zero change between the two tools, but it is recommended to update them by replacing them, or to use new slots for the QMT SPs. - Existing Acting Script: StarterMenuTool takes the same approach as QMT in creating a new acting scene for the quiz itself. This existing script can be repurposed into one of the QMT acting scripts, though with SkyTemple alone it cannot be renamed, meaning the script name it will be used for in the Full Script Compression Upper Panel must be renamed.
- Edit to Vanilla Quiz: StarterMenuTool modifies the original quiz script m00a01a.ssb. While these changes have no net impact on QMT, it would impact the debug mode, as the code to create a team from the default starters has been removed. If this functionality needs to be restored, simply add the following line after "if ( debug ) {" in m00a01a.ssb:
switch ( ProcessSpecial(PROCESS_SPECIAL_INIT_MAIN_TEAM_AFTER_QUIZ, 0, 0) ) { }
- Existing Unionall Edit: StarterMenuTool also requires the modification of
coro EVENT_M00A_01. QuizMenuTool will require this coroutine to be edited to run m00a01a in debug mode, and the QMT scripts otherwise.
Installing the SkyPatches
In order for QuizMenuTool to function, the following SkyPatches must be applied.
- FixPartnerNameMenu: Gives
MENU_PARTNER_NAMEthe ability to actually nickname the partner. Requires ExtraSpace as a pre-requisite. - ExtractSPCode: Enables the use of custom Special Processes used heavily by QMT.
Installing FixPartnerNameMenu is relatively simple. After downloading the file from the github repo, navigate to Patches -> ASM in SkyTemple. Then, click the "Open Patch Directory" button.

Finally, drag FixPartnerName.skypatch into the folder, and close it. The patch will now be in the "Others" Tab, ready for installation. If ExtraSpace is not installed, SkyTemple will prompt the installation of both patches sequentially. This is good, do that.
Next, is the installation of ExtractSPCode. Once again, navigate to Patches->ASM, and select the "Utility" tab. Install ExtractSPCode, and any necessary pre-requisites (there shouldn't be any, except maybe ExtraSpace).

Applying The Special Processes
Now for installing the Special Processes themselves. If the hack already has custom Special Processes it wishes to keep, or the IDs of the special processes in the sheet have been changed, apply the SPs as desired, but ensure the sheet has accurate IDs (NOT Effects), so it can call them. For simplicity, these are the default locations of each SP:
| Spreadsheet Tab | Spreadsheet Input Name | SP File Name | ID | Effect |
|---|---|---|---|---|
| Starter Selection Generator | starter_setter SP ID | starter_setter.asm | 64 | 61 |
| Starter Selection Generator | set_frame_color SP ID | set_frame_color.asm | 65 | 62 |
| Aura Bow Generator | CheckTSPress SP ID | CheckTSPress.asm | 66 | 63 |
| Aura Bow Generator | ReturnTSPFrames SP ID | ReturnTSPFrames.asm | 67 | 64 |
| Aura Bow Generator | MoveText2TopScreen SP ID | MoveText2TopScreen.asm | 68 | 65 |
| Starter Selection Generator | Set_Demo_Character SP ID | Set_Demo_Character.asm | 69 | 66 |
| Aura Bow Generator | get_favorite_config_color SP ID | get_favorite_config_color.asm | 70 | 67 |
Ensure that you download the correct set of special processes for your version of the ROM (US or EU). Next, navigate to Patches->ASM->Special Processes, and click the "Add Special Process" button until enough IDs are in the list for each new Special Process.

The list should look like it does in the image when done. With that completed, navigate to the "Effects Code" tab. Click the "+" Button to create a new effect. Then, click the "Import Code" button at the bottom to select the special process to be imported to this effect.

In the above image, Special Process starter_setter.asm is being imported to Effect 61, which corresponds to ID 64. Similarly, set_frame_color.asm should be imported to Effect 62 (ID 65), CheckTSPress.asm should be imported to Effect 63, etc.
Once all the necessary Special Processes have been imported to their effects, the last thing that needs to be done is assigning the effects to their IDs. Navigating back to the "Special Process Effects" tab, assign each effect to the correct ID, as shown below:

With that, SP importing is complete, and all that remains is to save the ROM.
Creating QMT Script Files
Next, is the process of actually creating the QMT script files. For simplicity, this guide will demonstrate the process on LEVEL_S02P01A, the same location in the script files as the original quiz. If you plan on putting the QMT script files elsewhere, ensure this is properly accounted for in Full Script Compression. Navigate to Script Scenes->S02P01A. If you are using a MegaScript, create ONE new acting scene. Otherwise, create four of them, each with the name in FullScriptCompression.

The newly created scenes should appear in the Acting (ssa) folder. Navigate to the first one created, and double-click on "[script-name].ssb".

From there, simply paste from the respective part of the sheet, and attempt to save the script.

Repeat the process of pasting in the remaining scripts. Finally, the script that contains the aura bow segment of the quiz (script #2 or the megascript) needs additional work done to the .ssa file. Navigate to S02P01A->M00A01A, and click the Export Button (square with an up arrow in it).

Then just import this file into the script containing the Aura Bow segment, as shown below:

After that, save the ROM. The quiz is nearly ready, all that's left is setting up unionall...
Editing Unionall
Unionall is a big file, but there's only a very specific part that needs to be edited. Open Unionall by using the search bar in the Script Engine Debugger, then do CTRL + F (Command + F for Mac, you should know your equivalent if you use Linux) to find coroutine inside unionall.

Once you find it, select the entire coroutine, and replace it with the unionall final output. the result should look something like this:

With that, save unionall, and the quiz is ready for testing!
Troubleshooting
if you run into any of these issues, or the fix doesn't work, reach out to happylappy for questions in the SkyTemple discord!
The Game Crashed before the first script loaded!
Do your script names and locations match between unionall (or the sheet if it's making the unionall coro), and your script file names? If not, that would cause a crash.
The Game Crashed When a SP tried to run!
Have you used the correct SP IDs and regions? Might be worth importing them again, just in case.
The Game Crashed/Glitched out between scripts!
That is... concerning. See, script files are capable of overwriting other things in RAM if they're too big (which is why QMT usually splits into 4 separate scripts). Quizzes with an obscene number of questions or starters may still overwrite something important in RAM anyway, which would need to be handled on a case-by-case basis.
One of my scripts won't save!
That's concerning, but could be the result of leaving a question or starter unfinished? Depends heavily on the error message.
Other Resources
QMT Script Variable Map
Below is a table of every script variable used by QuizMenuTool, and what their use-case is for each script. Any variable absent from the table is unused by QMT directly. Variable usage can perhaps be optimized somewhat, but this map functions properly.
| Script Variable Name | Index | Script #1 | Script #2 | Script #3 | Script #4 |
|---|---|---|---|---|---|
| $SCENARIO_SUB1 | 0 | Backup of Pre-Quiz $PLAYER_KIND | Winning # of Points Backup | ||
| $SCENARIO_SUB2 | 0 | Backup of 0th index of Pre-Quiz $PLAYER_KIND_BACKUP | Winning Pool ID Backup | ||
| $SCENARIO_SUB3 | 0 | Backup of Pre-Quiz $ATTENDANT1_KIND | - | # of times hero gen. failed | - |
| $SCENARIO_SUB4 | 0 | Backup of 0th index of Pre-Quiz $ATTENDANT1_KIND_BACKUP | - | - | - |
| $BIT_FUWARANTE_LOCAL | All | FUWARANTE blacklist flags | |||
| $LOCAL0 | - | Max # of points. | Winning # of Points / (Aura Bow Color Backup) | ||
| $LOCAL1 | - | # Questions Asked / Winning Pool ID | Winning Pool ID | ||
| $SCENARIO_TALK_BIT_FLAG | Varies | Question Has Been Asked? | |||
| $SCENARIO_MAIN | 0 | # of tied pools (-1 if not checking ties) | |||
| $SCENARIO_SIDE | 0 | # of pts to add to tied pool | |||
| $RECYCLE_COUNT | - | Post-Tie Max # of Pts. | |||
| $CONFIG_COLOR_KIND | - | - | Aura Bow Color | ||
| $HERO_TALK_KIND | - | - | - | Hero Talk Group | |
| $PARTNER_TALK_KIND | - | - | - | - | Partner Talk Group |
| $VERSION | - | Pool 0 Pts. | Reset to 1 | ||
| $CRYSTAL_COLOR_01 | - | Pool 1 Pts. | Reset to 0 | ||
| $CRYSTAL_COLOR_02 | - | Pool 2 Pts. | Reset to 0 | ||
| $CRYSTAL_COLOR_03 | - | Pool 3 Pts. | Reset to 0 | ||
| $COMPULSORY_SAVE_POINT | - | Pool 4 Pts. | Reset to 0 | ||
| $COMPULSORY_SAVE_POINT_SIDE | - | Pool 5 Pts. | Reset to 0 | ||
| $SCENARIO_SELECT_BACKUP | 0 | Pool 6 Pts. | Reset to 0 | ||
| $GROUND_ENTER | - | Pool 7 Pts. | Reset to 0 | ||
| $GROUND_ENTER_LINK | - | Pool 8 Pts. | Reset to 0 | ||
| $GROUND_GETOUT | - | Pool 9 Pts. | Reset to 0 | ||
| $GROUND_MAP | - | Pool 10 Pts. | Reset to 0 | ||
| $GROUND_PLACE | - | Pool 11 Pts. | Reset to 0 | ||
| $GROUND_ENTER_BACKUP | 0 | Pool 12 Pts. | Reset to 0 | ||
| $GROUND_ENTER_LINK_BACKUP | 0 | Pool 13 Pts. | Reset to 0 | ||
| $GROUND_GETOUT_BACKUP | 0 | Pool 14 Pts. | Reset to 0 | ||
| $GROUND_MAP_BACKUP | 0 | Pool 15 Pts. | Reset to 0 | ||
| $GROUND_PLACE_BACKUP | 0 | Pool 16 Pts. | Reset to 0 | ||
| $DUNGEON_SELECT | - | Pool 17 Pts. | Reset to 0 | ||
| $DUNGEON_ENTER | - | Pool 18 Pts. | Reset to 0 | ||
| $DUNGEON_ENTER_MODE | - | Pool 19 Pts. | Reset to 0 | ||
| $DUNGEON_ENTER_INDEX | - | Pool 20 Pts. | Reset to 0 | ||
| $DUNGEON_RESULT | - | Pool 21 Pts. | Reset to 0 | ||
| $GROUND_START_MODE | - | Pool 22 Pts. | Reset to 0 | ||
| $DUNGEON_ENTER_BACKUP | 0 | Pool 23 Pts. | Reset to 0 | ||
| $DUNGEON_ENTER_MODE_BACKUP | 0 | Pool 24 Pts. | Reset to 0 | ||
| $DUNGEON_ENTER_INDEX_BACKUP | 0 | Pool 25 Pts. | Reset to 0 | ||
| $DUNGEON_RESULT_BACKUP | 0 | Pool 26 Pts. | Reset to 0 | ||
| $GROUND_START_MODE_BACKUP | 0 | Pool 27 Pts. | Reset to 0 | ||
| $REQUEST_CLEAR_COUNT | - | Pool 28 Pts. | Reset to 0 | ||
| $PLAYER_KIND | - | Pool 29 Pts. | Reset to Pre-Quiz | ||
| $ATTENDANT1_KIND | - | Pool 30 Pts. | Reset to Pre-Quiz | ||
| $ATTENDANT2_KIND | - | Pool 31 Pts. | Reset to 0 | ||
| $PLAYER_KIND_BACKUP | 0 | Pool 32 Pts. | Reset to Pre-Quiz | ||
| $ATTENDANT1_KIND_BACKUP | 0 | Pool 33 Pts. | Reset to Pre-Quiz | ||
| $ATTENDANT2_KIND_BACKUP | 0 | Pool 34 Pts. | Reset to 0 | ||
| $HERO_FIRST_KIND | - | Pool 35 Pts. | Reset to 0 | ||
| $PARTNER_FIRST_KIND | - | Pool 36 Pts. | Reset to 0 | ||
| $RANDOM_REQUEST_NPC03_KIND | - | Pool 37 Pts. | Reset to 0 | ||
| $WORLD_MAP_LEVEL | - | Pool 38 Pts. | Reset to 0 | ||
| $EVENT_LOCAL | - | Pool 39 Pts. | Reset to 0 | ||
| $DUNGEON_EVENT_LOCAL | - | Pool 40 Pts. | Reset to 0 | ||
| $LOTTERY_RESULT | - | Pool 41 Pts. | Reset to 0 | ||
| $ITEM_BACKUP | 0 | Pool 42 Pts. | Reset to 0 | ||
| $ITEM_BACKUP_KUREKURE | 0 | Pool 43 Pts. | Reset to 0 | ||
| $ITEM_BACKUP_TAKE | 0 | Pool 44 Pts. | Reset to 0 | ||
| $ITEM_BACKUP_GET | 0 | Pool 45 Pts. | Reset to 0 | ||
| $REQUEST_THANKS_RESULT_KIND | - | Pool 46 Pts. | Reset to 0 | ||
| $REQUEST_THANKS_RESULT_VARIATION | - | Pool 47 Pts. | Reset to 0 | ||
| $SUB30_SPOT_LEVEL | - | Pool 48 Pts. | Reset to 0 | ||
| $TEAM_RANK_EVENT_LEVEL | - | Pool 49 Pts. | Reset to 0 | ||
| $PLAY_OLD_GAME | - | Pool 50 Pts. | Reset to 0 | ||