ROM data has min:24, max:22 (24-22) instead of (22-24).
In-game test shows all Psyduck are level 22 (max), and 24 (min) is not considered since it is greater than the max.
Co-Authored-By: Lusamine <30205550+Lusamine@users.noreply.github.com>
* Update CHT translations of SV for PKHeX
Update Traditional Chinese translations of SV for PKHeX.
* Remove useless blank line
Remove useless blank line.
* Minor tweak for GUI translations
Minor tweak for GUI translations.
* Minor tweak for GUI translations
Minor tweak for GUI translations.
Adds support for Scarlet & Violet.
Co-Authored-By: SciresM <8676005+SciresM@users.noreply.github.com>
Co-Authored-By: Matt <17801814+sora10pls@users.noreply.github.com>
Co-Authored-By: Lusamine <30205550+Lusamine@users.noreply.github.com>
Correct a linguistic error in CHT translation based on feedback.
Correct abilities error in CHT translation
Add missing CHT translation text for Pokémon type.
Fix 3DS region display bug in zh-HK traditional Chinese. Corresponding 3DSLocale text was omitted in previous commits.
Improve some expressions in zh-HK README + traditional Chinese GUI.
Add zh-HK README translation for README. It was wrote in Traditional Chinese Hong Kong style.
Add Traditional Chinese translation resource and make PKHeX support for tradition Chinese.
Didn't trust the existing manual transcribing, and both Bulbapedia and Serebii contain errors that don't match the original raw data. So, let's rip the raw data ourselves and use our own parse pickle (just raw bytes) instead of 162 manual entries.
For ripping logic, see: 203874da12
Partial match if language cannot access walker course
Re-do language override for EncounterStatic->pkm:
- Override gen1/2 event OT/language only if requested language is not possible
- Override walker OT/language if requested language is not possible (->japanese)
Closes#3594
This was implemented because Niantic messed up some GBL encounters in the past, but it was fixed quick enough for it to not matter for legality, so no encounters actually use this PogoType.
Also rename GBLDay => GBLD to match other PogoTypes for consistency across enum names.
Script run 4y ago used the wrong size to jump between entries (used B2W2's), and ended up copying bytes to empty spots that were NOT abilities.
f8a1d26694
Used the original dump and re-ran the script from 9f4b18119e
* Rewrite ribbon verification
* Explicitly verifies all ribbons instead of chained iterators.
* Verifies using only the stack, using `struct` and `Span<T>`. No allocation on heap, or `IEnumerable` iterators.
* Verifies all egg ribbons using a separate method, explicitly implemented. No reflection overhead.
* Separates each ribbon interface to separate `static` classes. Easier to identify code needing change on new game update.
* Extracted logic for specific ribbons. Can easily revise complicated ribbon's acquisition rules.
* Simplifies GiveAll/RemoveAll legal ribbon mutations. No reflection overhead, and no allocation.
* Can be expanded in the future if we need to track conditions for ribbon acquisition (was Sinnoh Champ received in BDSP or Gen4?)
End result is a more performant implementation and easier to maintain & reuse logic.
Rewrites a good amount of legality APIs pertaining to:
* Legal moves that can be learned
* Evolution chains & cross-generation paths
* Memory validation with forgotten moves
In generation 8, there are 3 separate contexts an entity can exist in: SW/SH, BD/SP, and LA. Not every entity can cross between them, and not every entity from generation 7 can exist in generation 8 (Gogoat, etc). By creating class models representing the restrictions to cross each boundary, we are able to better track and validate data.
The old implementation of validating moves was greedy: it would iterate for all generations and evolutions, and build a full list of every move that can be learned, storing it on the heap. Now, we check one game group at a time to see if the entity can learn a move that hasn't yet been validated. End result is an algorithm that requires 0 allocation, and a smaller/quicker search space.
The old implementation of storing move parses was inefficient; for each move that was parsed, a new object is created and adjusted depending on the parse. Now, move parse results are `struct` and store the move parse contiguously in memory. End result is faster parsing and 0 memory allocation.
* `PersonalTable` objects have been improved with new API methods to check if a species+form can exist in the game.
* `IEncounterTemplate` objects have been improved to indicate the `EntityContext` they originate in (similar to `Generation`).
* Some APIs have been extended to accept `Span<T>` instead of Array/IEnumerable
* Added Gen2 italian items text
* Italian translation text_ItemsG2_it.txt
* Translated MessageStrings_it.txt and improved some other italian messages/strings for better comprehension.
* Some tweaks
* Revises legality checks to account for traveling between the three game islands (PLA/BDSP/SWSH)
* Adds conversion mechanisms between the three formats, as well as flexible conversion options to backfill missing data (thanks GameFreak/ILCA for opting for lossy conversion instead of updating the games).
* Adds API abstractions for HOME data storage format (EKH/PKH format 1, aka EH1/PH1).
* Revises some APIs for better usage:
- `PKM` now exposes a `Context` to indicate the isolation context for legality purposes.
- Some method signatures have changed to accept `Context` or `GameVersion` instead of a vague `int` for Generation.
- Evolution History is now tracked in the Legality parse for specific contexts, rather than only per generation.
* Draft checks for encounter slot mastery
* Check encounter mastery flags
* Add moves for LA static encounters that don't follow learnset
* Add moves on crossover LA static encounters
* add alpha moveset population method
Now generates and applies moves as the game does
Updates some handling of other methods to use Span
* Show better message for bad mastery init flags
* Insert descending if candidates have same level
Level 78 Yanmega:
- [01] [10] Quick Attack
- [06] [15] Gust
- [11] [20] Silver Wind
- [18] [28] Hypnosis
- [25] [35] Air Slash
- [34] [45] Ancient Power
- [43] [54] Crunch
- [43] [54] Bug Buzz
Yields:
AlphaMove
Crunch*
Bug Buzz*
Ancient Power
* Descending order due to iteration
Co-authored-by: Lusamine <30205550+Lusamine@users.noreply.github.com>
Change the data structure so that different locations are tied to the table, rather than separate usages of the table.
This de-bloats from 344KB->85KB and has less runtime memory consumption.
Update 22.02.04
Individual commits from this PR are not cherry-pickable in a vacuum; these were manually re-committed from a staging repo in order to group together changes for general public viewing. There were over 250 commits on the private development repo for this update.
For roamers, go back to Lake Valor/Fullmoon Island, and re-interact with Mesprit/Cresselia so that the game can generate a new one.
Also add Rotom rebattle event flag, and fix consistency with flag labels.
Of all the available Pokémon in BDSP, the following cannot have these corresponding Egg Moves:
Snorlax: Power-Up Punch
Taillow: Boomburst
Chatot: Boomburst
Revert this commit when HOME is available for BDSP
Keep the old localizations around for displaying gen6 format memories in their original localization.
I didn't rename the files so the git diff was clean for showing the re-localized lines.
Closes#3302
Removes a lot of the offset-by-1 indexing, notably in the `GameStrings.GetLocationName` method which shifted everything 1. BDSP files we dumped don't replicate this off by 1, and I don't see a reason to maintain this off-by-1 for prior games since it's unnecessary quirks to maintain.
Zero indexed ftw.
Some very minor changes made between SWSH and BDSP.
In BDSP (English), the Seal Case and Seal Bag are now localized to Sticker Case and Sticker Bag respectively, but because those items are unobtainable in BDSP, keep the older strings for Gen4's sake.
StreamingAssets\AssetAssistant\FureaiHiroba\fureai\masterdata\PoffinResult.json indicates which text line is used for a given MstID
Change Taste to Smooth to match community's naming
The RAM is pretty dirty for unallocated poffins; slots that have never been filled will have junk with whatever the unallocated pointer was looking at.
An empty poffin slot is just marked as FF, ignores the stats for that slot. Not sure on the naming, but Matt had a single Level 60 poffin -> must be Mild? Thus, all the names are -1 from the textfile array...
Also removes sysflag 1294; the game has a flag reserved for a third captured species in the Soul Room after Latias and Latios but it's never set in scripts... third Lati DLC confirmed??????
These aren't referenced for the spiritomb encounter; according to the scripts, there's a hardcoded function which reads a byte[] and counts the number of nonzero entries.
The UgSaveData structure stores `byte[] TalkedNPCsID`, as described above.
Big thanks to @SciresM @sora10pls @Lusamine @architdate @ReignOfComputer for testing and contributing code / test cases. Can't add co-authors from the PR menu :(
Builds will fail because azure pipelines not yet updated with net6.
* Add metadata flagging for values
Allows users to set a minimum importance for the list displayed.
Could probably make this checkboxes within the flags UI.
* Add setting to filter out gen8 block names
Allows users to filter out unwanted low-value property names.
Co-authored-by: Kurt <kaphotics@gmail.com>
#3260 part 1
I searched for more instances of the phantom character, and found the one instance in gen7 zh flags :D
Co-Authored-By: FeralFalcon <33670476+FeralFalcon@users.noreply.github.com>
Invert check for crossover to disallow hidden (there are more symbol
tables). Galar Mine No. 2 has hidden fishing slots as well as curry.
HiddenMain3 SlotType was never used so it was removed.
Updates pkl to remove HiddenMain3.
* Add weather types by location
Creates a dictionary of possible weather types for each SWSH location.
Unlisted locations may only have Normal weather or do not have any
encounter slots.
* Prune unused weather from static encounters
Some encounters were too permissive with weather, e.g. Sandstorm in
Fields of Honor and Challenge Beach; Snowstorm at Dyna Tree Hill.
A few crossover areas that would have limited the possible weathers were
marked with a "(c)". An example is Nidorina from Giant's Bed crossing
to Frostpoint Field, where Raining and Thunderstorm do not occur.
This additionally organizes encounters by location.
* Move location-weather dictionary to EncounterArea8
* Verify weather marks on encounterslot/static encounters
* Adds some static encounters available through weather bleed
Weathers aren't normally available, but these static encounters are
close enough to the boundary that the weather in an adjacent area can be
used to spawn them.
- Frostpoint Field Snorlax with Raining/Thunderstorm from Giant's Bed
- Snowslide Slope Amaura with Raining/Thunderstorm from Giant's Bed
- Frigid Sea Carracosta with Intense_Sun from Three-Point Pass
- Frigid Sea Magmortar with Intense_Sun from Three-Point Pass
- Ballimere Lake Corviknight with Snowstorm from Giant's Bed
- Ballimere Lake Cryogonal with Snowstorm from Giant's Bed
- Ballimere Lake Tyrunt with all weather from Giant's Bed
- Lakeside Cave Ferrothorn with all weather from Ballimere Lake
- Tunnel to the Top Golbat with all weather from Path to the Peak
* Defer weather marks if incompatible, enforce encounterslot weather
This uses the area weather to check fishing slots and tentatively adds
some tables for weather bleed encounterslots.
* Warm-Up Tunnel gets weather bleed from Training Lowlands
* Update for base PKHeX
* Handle weather bleed for SWSH encounter slots
Co-authored-by: Skadiv <62726360+Skadiv@users.noreply.github.com>
* Minor clean
Having duplicate weather marks is illegal, so just auto-partial match them instead of checking the other marks.
* Rearrange slot weather check logic
* Claim reserved byte in SWSH pkl
* No need for two variable names now
* Valid weather marks on tree/fishing should return with main weather
* Fix tree/fishing deferral and add another surf slot weather bleed
* Disallow tree/fishing encounters from using bleed tables
None are currently known at this time, and only hidden grass encounters
have a weather bleed table
* Condense bleed expression, combine tree/fish flag check
* Move weather-bleed check into EncounterArea8
Makes the dictionaries private instead of internal.
Co-authored-by: Skadiv <62726360+Skadiv@users.noreply.github.com>
* Edit: The Spanish texts in the Resources folder have been updated.
* Edit: The translation of some files was updated and new translations into Spanish were made.
Farewell secret base descriptions. Not like the localized names would be too useful, but git history can keep em around if we ever need to reference them again (pls no)
Farfetch’d uses the non-vertical apostrophe, still.
Showdown is consistent with their usage (in/outputting ’), but we'll keep the '->’ for that sanitization just in case other services/users enter the wrong char.
Closes#3185
Mostly because of Gen3 save editing bugfixes, forcing a new version.
Last version added the PID checks for Gen8; this one adds move ordering checks for eggs. More fun :)
Strip out unused lines [~ XX]; behaviorially equivalent to empty strings.
Mutate original met list rather than making a copy and moving any changes into it (saves extra allocations)
Change initial loop start to pre-skip iterations not meeting criteria
Manually mark duplicate lines (only 2 exist); no more linq/searching.
Wipe merged location sub-names prior to merging (bounds check optimization, maybe? already accessed, setting should be fine).
Tests still pass :)
Check for negative met location IDs to return empty (fuzzing?)
Change "FRLG" -> "Kanto" as strings are reused
Used lines:
39c3968e5e/Gen1/DumpUtil.cs (L5)
table.Where(z => z != 0).Select(z => lines[z]).Distinct()
The only two that had FRLG are now showing "Kanto"
AltForm & Form & Forme => Form
GenNumber & Generation => Generation
Extract out SpeciesForm interface, and re-add IGeneration
For those using PKHeX as a dependency, this should be a pretty straightforward manual replacement... GenNumber and AltForm should be quick find-replace`s.
Adds Nickname checks, thanks @ShadowMario3 for grabbing these into separate text files from Bulbapedia.
I reordered all the encounters to match Bulbapedia; each level is denoted if different if it can be sourced from RBY.
Extract common abstract class for GO transferred encounters
Clamp minlevel instead of met level
Add optional parameter for GO IV randomization
Update go legality binaries with latest
PKHeX.Core now accepts generated pkl binaries from PoGoEncounterTool (PGET).
Refer to pporg's repo. This will be treated like event data; occasionally updated.
Rather than do backtracking logic to see if the slot can be yielded, don't acknowledge the slot exists if it can't be yielded.
See pk3DS commit where we check EscapeRate for the base wild slot prior to adding it to the exported slot list.
now matches all other personal table formats
var data = File.ReadAllBytes(path);
for (int i = 0; i < data.Length; i += PersonalInfoBW.SIZE)
{
if (data[i + 0x19] == 0) // Ability2
data[i + 0x19] = data[i + 0x18];
if (data[i + 0x1A] == 0) // AbilityH
data[i + 0x1A] = data[i + 0x18];
}
File.WriteAllBytes(path, data);
* Rework gen1 slot loading
Slot templates are precomputed from ROM data and just loaded straight in, with tight coupling to the encounter area (grouped by slot types).
* Revise fuzzy met check for underleveled wild evos
Example: Level 23 poliwhirl in RBY as a level 50 poliwhirl, will assume the chain is 25-50 for poliwhirl (as poliwag evolves at 25). Instead of revising the origin chain, just ignore the evo min level in the comparison.
Previous commit fixed it for gen1.
* Rework gen2-4 slot loading
Gen4 not finished, Type Encounter data and some edge encounters not recognizing yet...
* Add feebas slots for old/good encounters
* Begin moving properties
Great news! Gen5-7 need to be de-dumbed like Gen1-4.
Then I can remove the bang (!) on the Area accessor and ensure that it's never null!
* Split off XD pokespot slot encounter table type
* Set area in constructor
* Deduplicate g3 roaming encounters
* Deduplicate xd encounter locations (rebattle)
Only difference is met location; no need to create 500 extra encounter objects. A simple contains check is ok (rarely in gen3 format).
* Make all slots have a readonly reference to their parent area
* Minor clean
* Remove "Safari" slot type flag
Can be determined via other means (generation-location), allows us to reduce the size of SlotType member to a byte
Output of slot binaries didn't preserve the Safari flag anyway.
* Update SlotType.cs
* Handle type encounters correctly
* Merge safari area into regular xy area
* Merge dexnav accessor logic
* fix some logic so that tests pass again
rearrange g5 dw init to be done outside of static constructor (initializer instead)
PIDGenerator: friend safari slots now generate with required flawless IV count
* Add cianwood tentacool gift encounter
* Remove unnecessary abstractions
Fake area just returned a slot; since Slots have a non-null reference to the area, we can just return the slot and use the API to grab a list of possible slots for the chain.
Increase restrictiveness of location/type get-set operations
* Minor tweaks, pass parameters
DexNav observed state isn't necessary to use, only need to see if it's possible to dexnav. Now that we have metadata for slots, we can.
* Remove unused legality tables