Gen1/2 INT: 20 slots => 4 wide x 5 high
Gen7lgpe: 25 slots => 5x5
otherwise: 6x5
(maintain 5 rows)
Database(s): 6x11
Could probably wrap the initialization logic (grabbing savefile, etc)
but works for now
This is all in prep for box sprite resizing (56x68 as evident by lgpe
sprites); figured I'd add some display flexibility to handle prior games
with non-30/box layouts.
shave off a couple pixels for popup box view to make the edges of the
box directly at the edge (-2 bot, -1 right side)
* Move pkhex.drawing calls out of form constructors
designer doesn't like it; if Main can't be designed then there's some
call that it can't process for whatever reason
* Add netcore3 targeting
Closes#2198 by adding a netcore3 build option
Closes#2391 by retaining designer functionality and net46 builds
With the approaching games, PKM sprites are a different size from the 3DS era (as already hinted by LGPE, which has 56x68). It'll be a little easier to manage with this portion of the library walled off from the rest of the codebase.
Eventually the net46 target will use fody or something to merge in these extra dependency dll's automatically to not disturb the usual exe/dll experience.
Futureproof with transfer considerations
This is just a guess; gen7 didn't update the medal count and if we
assume pk8 overhauls the structure for a new console, they'll drop old
data.
With c#8 later next week, will move SuperTrainingMedalCount() to a
default interface method ez.
Extract Species Name logic to SpeciesName
Extract Language logic to Language
Remove FormConverter wrapper for string[] fetch
Rearrange some logic to more appropriate locations, update access
modifiers / types
Move some pkm array methods to arrayutil, make generic
PKX.GetVCLanguage was a dupe of _K12.GuessedLanguage() so just expose
the method
PKX is now back to pkm data manip only
dual bounds check -> single check via uint cast
pkx: keep array reference for reuse in next check
format return to second line to stick out more; lines of code are cheap
:)
Increase abstraction for arbitrary slot get/set operations, and fracture
SAV4 behavior for each game type.
Adds: Undo/Redo of party slot changes
Fixes: Fixed Gen5 daycare slot 2 reading, and EXP reading
Fixes: Some slot color glitchiness
Fixed: Box layout editor now hides the flag label if no flags are
present
Fixed: Gen7 box flags are now shown (unknown purpose lol)
Changed: savefile objects are generally smaller (removed a few shared
offset fields)
A little bit cleaner when the logic is separated
Keep an abstraction of BoxEdit to cache the current box contents.
Already fetched to show sprites; any future fetches (for preview text /
hover sprite) can reuse the already fetched pkm data.
Should probably rewrite this stuff completely, but effort better spent
elsewhere
Remove some unnecessary properties from SaveFile
Enumerate checksum flag results for GC memcard checking
Remove unnecessary checks on savefile type
Add some documentation
Decapitalize some method parameters
c345688f6d
base(x) -> base(x - y) resulted in incorrect offsets for LGPE. Great.
Just make PokeDexLanguageFlags a shift offset instead of absolute;
update all usages.
Closes#2348
GameInfo has been the storage for the current Game Language environment
When using GameInfo, only one environment is tracked at a time, which is
initialized by the PKM editor (items, moves). Rework things to allow
multiple filtered sources to exist, and keep the filtering logic in
PKHeX.Core for reuse in other programs... ;)
create custom comparer to do the work
reorder some parameters
simplify gb hm set (All and FindIndex is duplicate work)
only usages of linq remaining are for the bulk action Where filtering
(ok)
Don't care about operating system; use the AddFontFile method instead.
Add fallback for font load failure.
This should be easier to maintain in the future, if multiple char->glyph
mappings are to be supported (gen6 is already different from gen7 with
some swapped glyphs).
#2305
Catches the following as SaveFiles:
"srm", // RetroArch save files
"fla", // flashcard
"SaveRAM", // BizHawk
and whatever else is added by the init
Extract magic pixel shifting numbers for layering imgs -- SWSH will
likely use the large boxsprites, as hinted by LGPE's upsizing.
Remove new[] color array creation, just pass byte values
break up glowedges into steps
FileInfo inherits from FileSystemInfo, which initializes a bunch of
strings that we don't need
this isn't a great optimization, just a fun exercise finding a quicker
approach to get these values
remove Identifier param. 99% of the time, identifier is not provided,
resulting in a useless call
end result:
provide 'create new' and 'create from' constructors
use 'u' to denote uint values, so that less IL ops are required
~(21->17) in the case of IVs
no functional change, just a fun exercise looking at generated IL and
finding ways to use less ops
no functional change, just rewrite some logic for better flow
fix subform popup count restriction (OwnedForms requires forms to be
added/removed manually; it doesn't automatically update)
sanitize box names when dumping boxes with separate folders (and bad box
names)
Remove a bunch of duplicate accessing
use dictionary to fetch grid rather than searching control names
break up larger methods to reduce complexity
probably going to rewrite the giveAll/removeAll actions to do work
within the pouch, then reload the UI with the final pouch
hide setters for LegalInfo outside assembly (shouldn't overwrite the
stored values)
update GenNumber to Gen* if appropriate; GenNumber checks for first Gen*
to match, is a little more explicit and quicker than calling twice when
checking a range
kinda slow, if a save has 900 mons, it has to check 900*900 which is
O(n^2), takes a few seconds
as opposed to just doing a hashset checking contains, would be O(n)
gotta do some fun stuff to make it faster
relocate program language enum
test that test case is proper
move getcompatible & gettemplate to core
remove catch rate changing for pk1 (catchrate editor now used instead)
replace Friendship control click to match shortcut description (used to
do nothing)
Remove some duplicate translation strings
fix gameselect string formatting
apparently systemsounds changed in a recent win10 update, Question is
now silent?? Exclamation is now the same as Asterisk (same as Beep?) Use
hand instead of Exclamation.
only use asterisk for notifications
old overridden behavior didn't display the font cleanly
use TextRenderer instead with formatting, and squish things down to
regular size (-2px).
lightened the green color in a previous commit
since redrawing is good now, can maybe expand upon coloring (move type
shown on left side as a color?)
be explicit that the string is empty rather than possibly missing
disallow encrypted export for BK4 (they're not encrypted), removes type
check
simplify replaceall in showdownset (don't call ReplaceAll 4x, just get
valid chars and rebuild)
simplify get ribbon sprite name (precompute ToLower and appended values
bad logic causes the relearnmoves to get reset when first one is
applied, just revert to the old way instead of wrapping FieldsLoading
around this (repopulating legality would have to be manually called
after)
Reuse some code in netutil for fetching stream (provide useragent for
all uses)
make sav4ranch use dynamicly read offsets to handle both variants
(quicker) #2248
sav1: assign personal table based on (detected/provided) version
catchrate editor: allow to use savefile personal
remove gb era prompt whenever gb/blank loaded; have it as a setting (can
be overridden for VC now). keep allowgbera as autodetect
personaltable: track format for debugging purposes/info
update translations
showdownset: contains char instead of string
gameinfo: static readonly array instead of redefining new on update
legality: order of operation / value reuse / simplification / comments
pkx: compare char instead of single character string
header/footer: move assignment into method as an out instead of ref
Provide gen1/2 gb only version origin fetch for personal/moves ty
shadowmario (i assume this fixes things)
make listbox use ingame font for special characters
2f6e30bb3c (r31924945)
ty @pmarkive
Closes#2242 , adds OT font without cloning
add font to secret base editor, fix ability combobox binding --
apparently nobody has used this editor since it was changed back in July
lol
kinda have to restrict these to 'valid' choices; should be enough of a
selection->result to be adequate for changing version
restart the program after changing the setting; won't take effect until
rebooted.
rearrange pkm version groups for clear break between
twins/siblings/family
clear pokelist for sav7b on non-exportable saves (prevents b1s1 from
showing markings)
rename horohoro (pgo) to non romaji lol, hide daycare/party tabs on
nonexportable save
remove some unnecessary operations
rewrite getallcontrolsoftype to remove ToList() and make generic
remove silly idle loop, call close manually
remove initialization check for generating sprite; now only calls at max
2x when starting up = not necessary to bypass with a special variable
Closes#2227 , validation failed to recognize this item since it wasn't
a ComboItem
only happens if a gen1/2 save is provided as the most recent/startup
save.
holding ctrl-shift-alt bypasses pkmeditor restrictions, which normally
blocks exporting a pkm with 0 species.
fix catch error string (underlines the space, lol), use escape ampersand
Found while explaining #2227
can restore behavior by adding it as a custom user path; cgse isn't very
prevalent nowadays
now the only registry key checks are for checking net framework version
Add version specific search or all compatible
Add encounter type checkboxes (others are ignored)
Only return distinct encounters (by reference)
Refresh Checksum from generated iencounterable->pk before converting (to
eventually be fixed in iencounterable rewrite maybe)
Closes#2219
Make extrabytes a pkm property (don't mutate array pls)
reconfigure startup loading to only initialize after initial load of sav
& pkm (using blanks if not provided)
* Put assembly version in window title
* Treat version.txt as a Version
* Cache current version
* Don't use resources anymore for version
* Re-add version.txt, for backwards compatibility
* Set old version.txt's build action to None
* Use GitHub API for version checking
remove lockedslots, store & save all teamslots for sav7
differentiate locked slots from overwrite protected slots by emitting an
enum containing info about the slot
locked = can't be replaced, period.
starter/battleteam = can't be pasted over by bulk-pastes
can eventually show more specific sprite layers to denote party
indexes/team#/starter
Starter Pikachu & Eevee have different growth rates than their base
forms (seriously WHY?)
remove old api surface in PKX as a breaking change as adding the
parameter is necessary.
Closes#2109
Program boots -> load extra locations rather than constantly fetching.
These files won't change location or presence (not an external drive).
just store the locations instead of constantly fetching, we already call
detect once when loading the form anyway.
extract final pkm manipulation logic from pkm editor
add xmldoc to boxmanipulator, add utility class for enum->manip fetching
fix xmldoc referencing removed enum member
relocate boxmanip overview logic to utility class
move SAVPaths file pointer to Main for reuse #2109 , will add to
autodetect in a later commit
open/save dialog with extra extensions: ignore ones already present
click ball sprite/label to cycle through legal balls
hold alt to use old behavior (set to pokeball)
hold shift to cycle through legal balls randomly (default behavior goes
poke->color->poke)
want to randomize setting balls? use the ApplyBallLegalRandom method at
the end :)
can't really get too fancy as only one color is stored in the personal
data, pkm aren't one single color.
move encountertype datasource providing to core
fix rerolling EC not updating characteristic
remove some repeat logic calls
relocate geolocation name fetch to separate class, add tests to ensure
functionality, add languageID->country/region fetch method
hides pid & ec in pkmeditor, gamesync & securevalue in saveditor
easier to share screenshots/stream without leaking identifying
information
fix auto-centering of pkmeditor subwindows when a savefile is detected
on program load(tab_otmisc isn't initialized and reads an incorrect
width)
egg sprites can be a little difficult to see what's underneath (glance
value)
make the new egg sprite method the new default; adds setting to revert
to old behavior
adds translation text for the mega rayq control from #2098
would reset the battle box sprites legality to not shown; also, the
prior fix for #2069 did not work for reloaded save files since
GetSlotFiller was called instead.
use trainerstat editor control in gen6 editor
fill in some details from the disassembly via setrecord usages
still slightly fuzzy on some:
fureai (based on usum idb name, similar logic)
soaring sky counts
looks like there's some other usages of the fields which were outside
the stat range, throwing an exception when loading to NumericUpDown,
added bypass logic
Thanks Holla!
Yay sneaky smart solutions!
Instead of refilling the combobox when the legal move list changes, wait
until the full list is required then repopulate the individual combobox
can't even notice the lag besides the individual tab load. yess
cache a hashset to determine if the legally allowed moves are the same.
reuse cache in paint method
previously, was noticeable if you load the Moves tab then check
legality; the legality message was delayed by a couple hundred
milliseconds due to repopulating 4 comboboxes (Combobox.NativeAdd
hotspot triggered by RefreshItems, which happens when we set the
datasource). By skipping unnecessary repopulations, gui lag is lessened.
would be preferred if I can just reorder the list inside, but noo.
Don't autosize columns on each row addition
About 15 rows appear; resize on row 0, 7, and 14, and once more when
finished.
was O(n), now is O(min(n,3)+1)
Don't unlock/lock the GlowBase bitmap repeatedly; store the bytes
separately for frame generating. Fixes any memory access exceptions
(unlock->unlock due to program lag).
Do more preprocessing of egg glow sprites for cleaner appearance (now
glow inside sprite)
extract glow method for easier reuse
use some close synonyms (Reiniciar -> Borrar)
omit some words (potential / training) to keep layout compact
capitalize Equipado to match main window
Closes#2080
Sprite creation uses slot>=0 for determining if it's in a box or not;
kinda should redo the logic but there's no upside to passing 0-6 to the
sprite generator for these.
Closes#2069 thanks @iiippppk !
Autodetect location not stored in a button path will show up as "???";
check the typical homebrew autodetect paths, then display the parent
folder
eg, Path.Combine(root, "3ds", "Checkpoint", "saves");
shave off "saves" to return X:\3ds\Checkpoint
add range checks to label translation
Folderlist stores savefile objects, can open A, edit A, open B, open A,
and all edits from prior are still there. Just re-open the save file
from disk. The folderlist already checks if the path exists prior to
calling it to reopen.
original file path is not saved with the two listed properties, add
FileFolder and relcoate existing FilePath functions to that field
move some GetVariantSAV usages to the string method instead of byte[]
max IVs use flawless method directly with 6 IVs specified
move color blend/stat calc to ImageUtil
move potential string to commonedits
expose color properties for pkmeditor
don't constantly create/dispose brushes for drawing legal moves
reduce pk3/ck3/xk3 logic, share AbilityBit property within _K3, and when
loading, type check (favored over hardcoding individual load cases)
pull some non-gui code from PKMEditor to core/etc for general data
fetching
all usages besides fetching a 32bit random value should use rand.next
remove unnecessary do-while loop for calculating random EVs (always
returns 510 in total)
push unsaved IVTotal/EVTotal stuff from prior commit
rework exposed types for evo chain
initial trim now uses much less linq
can probably redo the get initial chain to provide a species to break
on...
continued simplification
core.cs is pretty much the following:
misc one-off junk
moveset fetch
encounter table fetch
evo chain fetch
might eventually move things around a bit further for cleanliness so
that misc meta junk is the only thing that remains in core.
Rework box fetch in SaveFile to be a little more flexible, can now fetch
a single box
Hold control to... export all boxes :)
I wonder if there's a decorator that showdown skips when importing lines
that can help differentiate the boxes since there's the potential for
hundreds output (ie comments in a showdown set?) doubt it.
update handling that checked for this case to instead check for
equivalence to ability1 instead of 0
was generating a PGF with ability[1] = 0, which is not correct. Just fix
the binaries to behave and get rid of all the workarounds since future
tables don't have missing values.
Closes#2004
no changes had been submitted since originally committed on 3/5/2015; 3y
of inactivity.
users can always place "lang_en" to replace the english translation with
their own GUI strings; not worth maintaining non-series language
support.
nickname reset clears except for encountertrades (some have fixed
nicknames).
remove untraded check for HT memory verification, has to be traded if it
has a HT memory.
clamp species list based on savefile
fix form control index set
remove slot from list (avoid duplicates, there's 530 slots and both
games have more than that available).
Closes#1974
search caused cross thread exception due to ConfigurAwait not returning
context
finish await -> update controls with after restoring context.
don't rebox results 2x lmao; keep results as list due to other Remove
operations being present in other events.
Closes#1964 ; any redirected load request has its own 'fail to load'
message.
(dragdrop a save file on a box slot; message is no longer presented that
'could not set to this slot').
Move TID/SID load to after version set (special handling for pk1/pk2
which don't store version, just call manually).
Update TID/SID on every gameversion change anyway
Rename LoadOTID to LoadOT since it does not deal with ID.
Closes#1962
retain save provider
add optional visibility toggle criteria (not present => always visible)
now hides sort/mod/delete if the criteria is not applicable to the
current format
Is there a reason for having GSC newTrack as USUM? This causes `origintrack = newTrack;` not to happen and thus controls don't switch from G2->G7 correctly.
savexts.txt if you wanna update it without recompiling
Keep in mind these are just aliases for raw data. No conversion is done,
it only allows the file to be filtered to.
Closes#1955#1856#1455
move distinct filter to reflectutil as it is spitting out
inherited(overriden) property names after the current class' property
name.
remove original (default) memory strings; had removed Items.Clear()
earlier (why would I need to clear if there was nothing there?) but
there was something there needing to be cleared. Remove the useless
initialization to fix that :)
Thanks Davil!
https://projectpokemon.org/home/forums/topic/45321-distsupertrain/
remove todo comment
fix exception when refreshing slot coloring
update box when saveslot index changed, not validated.
update boxviewers when saveslot changes
amount of pkm obj classes is pretty high, move the static utility
classes to another folder
breaks usage of pkm.ShowdownText; removes a dependency from PKM.
previous hurdle a year ago was propertyinfo fetching not looking at the
base class's properties; dig deeper for all properties to mimic existing
code for netframework
end result is batch editing now possible without gui
ilmerging assemblies somehow ignores the loadFromRemoteSources app
setting, so allow the compiler (user) to specify that the main app
should ignore those security checks.
1123c24b0c
had addressed the loading, however, it did not address the saving
update pkx to not create a new array every time IsPKM is called
(possibly a lot)
reference PKHeX.Core, main window loads assemblies & initializes
providing an ISaveProvider and the menustrip control (to insert controls
into)
pretty rough but should allow for inserting external control buttons &
allowing it to edit the UI a little
example: https://github.com/kwsch/PKHeXPluginExample
feedback is appreciated
using keyboard instead of mouse can change box without moving mouse
outside the slot picturebox
trigger an update when the box is changed, but only if the updating
parent has the hovered child (ie a boxviewer changing box while hovering
the main window won't re-cry the main window slot since it wasn't
updated)
Closes#1940
add some gender threshold properties to personalinfo
* Fix minlevel of Pangoro/Tyrantrum/Aurorus in gen6
30: level + dark type in the party
32: level + day
33: level + night
34: level + female
Note Meowstic isn't affected due to another entry of level + male (23)
* Minor text usage fix
* Fix xorPID flipping in TransferEC check
Years ago a branch was made to play a pkm's cry when its sprite was
hovered over, to assist users who are less fortunate in the ocular
department. Since a pkm's sprite is not text, playing the pkm's cry
helps the user identify what is in each data slot.
To enable the feature, put a folder named "sounds" in the same folder as
the executable; name all pkmcry files after the species national dex
number (no padding zeros), with an extension .wav
Closes#1933
if not allowed to be genderless, flag as invalid gender
only permit valid genders after genderless is ruled out
(both done by checking the low bit)
Store 4g giratina held item for enc->pkm legality
revise usages of GetSaneGender
Rearrange some logic
Better handle impossible version encounters (gen4)
gen 1-5 done, stuck on 659 - bunnelby egg...?
Hold control when you move your mouse to enter the slot's control area
(ie put your mouse on the sprite while holding control); the program
will display a ShowdownSet summary of the contents so you don't have to
load to tabs.
Holding Control is required for now (can always recompile to have it
always on); can be a nuisance for those not wanting to view details
since it overlays a big window (obscuring).
Closes#1925
Adds IV count sorting
Adds Itemless & Illegal deleting
Adds Max level modding, item clearing. Handle egg cases sensitively.
remove final sortby for reversal case as the incremental integer
prevents further ordering.
Any suggestions? Keep in mind that some modifications can be done by the
Batch Editor scripts; smart deletions & sorts are highest value
additions ;)
hold control when triggering the sort
sneaky linq to reverse a sort by:
* re-doing the initial sort, then
* reversing the sorted pkm data by using a throwaway increment
* re-doing the final sort
Nest item choices into separated groups (based on their overall
function).
Adds 3 more deletion options: eggs, untrained, or not-matching-savefile.
Adds 1 more modification option: Max Friendship of current handler
updating HP causes SPD to be updated, which is based on SPA; since SPA
is yet to be updated, we trigger constant updates on an SPA > 15 until
we crash.
just use the SPD IV which is already capped by the pkmdata
(this shouldn't refresh fields anyway when loading... whatever).
Closes#1914
Closes#1912 , genderless ~= fixed gender I guess; shouldn't get these
gender-errors unless it's manually tampered data/ShowdownSet
remove unnecessary code in:
* PKMEditor (>=255 is already covered by == 255 and the fact that gt is
always <= 255)
* VerifyGender (3 <= x <= 5) check is already early-returned via
PIDGender check above
Update IsGenderValid knowing that VC mons have a gennumber <= 2
right click the box tab
* no longer silly key-combos to initiate a clear/sort
* provides multiple sorting options
Advanced sorting includes:
* Recieved Date
* Friendship usage (using it raises friendship, more used pkm will be
sorted to the top)
* Ownership (current SAV's first, then by other OTs)
Closes#1895 , re-verified with pkm provided in #1805
there's no shedinja gift, always is an evolution
seal some forms to remove virt call in constructor warning
may want to make the export location smarter so that they dump back to
the compiled resource location, meh
assume that english is already loaded; restore english before next so
that new languages use english as the base language for untranslated
strings
all common strings in forms used by multiple generations
would rather rework the individual generation strings to be unnecessary
with better interaction instead (if possible), as translating hundreds
of limited exposure strings is a drag.
Similar to LegalityCheckStrings
no resource files yet, will generate those tomorrow(?)
some strings are not translatable (useless gen6 passerby export text),
not really worth
party stats set when setting a slot to a save file
simplify set/delete slotchange duplicate logic
suggest better met locations beyond VC transfers
hatching a gen6 egg applies memories automatically
#1864
need to hook into main window & delete old logic; when the logic flow
returns after closing the form, all the propagated settings will need to
be copied (ie where the setting is actually used).
translateinterface will translate the control text to a longform
descriptor per the current language.
instead of:
controls on form->dict of names, look up line to find control
now:
dict of names->look up control to find name
faster overall, simpler, and updates the dictionary with new control
entries. browse thru forms that call translateinterface with one
language (english), then updateall(en) and dump to get the updated
translation files.
#1864
Added translation strings for Apply Showdown Markings in CHS, French,
and Korean. International schools ftw.
Additionally, Portuguese was not accessible as it is Index 9 ("zh2",
which I assume is CHT, is at 8), so I've just hardcoded this bit since I
don't know if anything else relies on lang_val.
gen1 & gen2 types aren't laid out contiguously (yay bird type and extra
types)
fix gen2 type accessors looking at the wrong byte
type sprites now load correctly, and 3rd ability no longer throws an
error (forced to None).
invalid/unknown usages were incorrectly interchangable; dex-sets were
looking at Unknown which was impossible for some cases.
only use GameVersion.Unknown as a temp placeholder for later resolution
by the user.
WinForms->Core logic absorbing (CommonEdits)
loading ShowdownSet now applies properties to PKM instead of PKMEditor
Contest/IVs for Static/Trades are no longer set by default (less object
allocations), and are now checked by the encounter generator