diff --git a/src/main/java/entralinked/gui/data/DataManager.java b/src/main/java/entralinked/gui/data/DataManager.java index 3c15179..850ca63 100644 --- a/src/main/java/entralinked/gui/data/DataManager.java +++ b/src/main/java/entralinked/gui/data/DataManager.java @@ -10,6 +10,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; +import java.util.stream.Stream; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; @@ -162,9 +163,17 @@ public class DataManager { .collect(Collectors.toCollection(ArrayList::new)); } - public static List getMoveOptions(GameVersion gameVersion, PkmnSpecies species, PkmnGender gender) { + public static List getFormOptions(GameVersion gameVersion, PkmnSpecies species, PkmnGender gender) { return getEncounters(gameVersion).stream() - .filter(x -> x.species() == species.id() && (!x.isGenderLocked() || species.gender() == gender)) + .filter(x -> x.species() == species.id() && (!x.isGenderLocked() || x.gender() == gender)) + .flatMap(x -> species.hasForms() ? Stream.of(species.forms()).filter(form -> x.hasForm(form.id())) : Stream.empty()) + .distinct() + .collect(Collectors.toCollection(ArrayList::new)); + } + + public static List getMoveOptions(GameVersion gameVersion, PkmnSpecies species, PkmnGender gender, int form) { + return getEncounters(gameVersion).stream() + .filter(x -> x.species() == species.id() && (!x.isGenderLocked() || x.gender() == gender) && x.hasForm(form)) .map(Encounter::moves) .flatMap(List::stream) .distinct() diff --git a/src/main/java/entralinked/gui/data/Encounter.java b/src/main/java/entralinked/gui/data/Encounter.java index 04d6643..f0d6dd3 100644 --- a/src/main/java/entralinked/gui/data/Encounter.java +++ b/src/main/java/entralinked/gui/data/Encounter.java @@ -10,10 +10,21 @@ import entralinked.model.pkmn.PkmnGender; public record Encounter( @JsonProperty(required = true) int species, @JsonProperty(required = true) List moves, - PkmnGender gender, int versionMask) { + PkmnGender gender, int formMask, int versionMask) { @JsonIgnore public boolean isGenderLocked() { return gender != null; } + + @JsonIgnore + public boolean isFormLocked() { + return formMask != 0; + } + + @JsonIgnore + public boolean hasForm(int form) { + int bits = 1 << form; + return !isFormLocked() || (bits & formMask) == bits; + } } diff --git a/src/main/java/entralinked/gui/panels/EncounterEditorPanel.java b/src/main/java/entralinked/gui/panels/EncounterEditorPanel.java index 34115ae..bdb5515 100644 --- a/src/main/java/entralinked/gui/panels/EncounterEditorPanel.java +++ b/src/main/java/entralinked/gui/panels/EncounterEditorPanel.java @@ -62,14 +62,28 @@ public class EncounterEditorPanel extends TableEditorPanel { table.enableOption(row, MOVE_COLUMN); table.enableOption(row, FORM_COLUMN); table.enableOption(row, ANIMATION_COLUMN); - PkmnSpecies species = (PkmnSpecies)newValue; - updateGenderOptions(row, species); - updateFormOptions(row, species); - updateMoveOptions(row, species); + updateGenderOptions(row); + updateFormOptions(row); + updateMoveOptions(row); optionLock = false; } else if(column == GENDER_COLUMN) { if(!isLegalMode()) { - return; // Gender only affects move options if legal mode is enabled + return; // Gender only affects form options if legal mode is enabled + } + + if(newValue == null) { + table.disableOption(row, FORM_COLUMN); + return; + } + + updateFormOptions(row); + + if(oldValue == null) { + table.enableOption(row, FORM_COLUMN); + } + } else if(column == FORM_COLUMN) { + if(!isLegalMode()) { + return; // Form only affects move options if legal mode is enabled } if(newValue == null) { @@ -77,7 +91,7 @@ public class EncounterEditorPanel extends TableEditorPanel { return; } - updateMoveOptions(row, getSpecies(row)); + updateMoveOptions(row); if(oldValue == null) { table.enableOption(row, MOVE_COLUMN); @@ -93,9 +107,9 @@ public class EncounterEditorPanel extends TableEditorPanel { if(species != null) { optionLock = true; - updateGenderOptions(i, species); - updateFormOptions(i, species); - updateMoveOptions(i, species); + updateGenderOptions(i); + updateFormOptions(i); + updateMoveOptions(i); optionLock = false; } } @@ -137,18 +151,21 @@ public class EncounterEditorPanel extends TableEditorPanel { (a, b) -> a.name().compareTo(b.name()), true); } - private void updateMoveOptions(int row, PkmnSpecies species) { - setOptions(row, MOVE_COLUMN, - isLegalMode() ? DataManager.getMoveOptions(gameVersion, species, getGender(row)) : DataManager.getMoveIds(), - (a, b) -> DataManager.getMoveName(a).compareTo(DataManager.getMoveName(b)), true); - } - - private void updateGenderOptions(int row, PkmnSpecies species) { + private void updateGenderOptions(int row) { + PkmnSpecies species = getSpecies(row); setOptions(row, GENDER_COLUMN, isLegalMode() ? DataManager.getGenderOptions(gameVersion, species) : species.getGenders()); } - private void updateFormOptions(int row, PkmnSpecies species) { - setOptions(row, FORM_COLUMN, species.hasForms() ? Arrays.asList(species.forms()) : Collections.emptyList()); + private void updateFormOptions(int row) { + PkmnSpecies species = getSpecies(row); + setOptions(row, FORM_COLUMN, species.hasForms() ? (isLegalMode() ? DataManager.getFormOptions(gameVersion, species, getGender(row)) + : Arrays.asList(species.forms())) : Collections.emptyList()); + } + + private void updateMoveOptions(int row) { + setOptions(row, MOVE_COLUMN, + isLegalMode() ? DataManager.getMoveOptions(gameVersion, getSpecies(row), getGender(row), getForm(row)) : DataManager.getMoveIds(), + (a, b) -> DataManager.getMoveName(a).compareTo(DataManager.getMoveName(b)), true); } public void loadProfile(Player player) { diff --git a/src/main/resources/data/legality.json b/src/main/resources/data/legality.json index 0d7280f..61b1049 100644 --- a/src/main/resources/data/legality.json +++ b/src/main/resources/data/legality.json @@ -1159,6 +1159,7 @@ 324, 351 ], + "formMask": 1, "versionMask": 3327 }, { @@ -1393,6 +1394,7 @@ 173, 450 ], + "formMask": 2, "versionMask": 4095 }, { @@ -2074,6 +2076,56 @@ 575 ] }, + "Pokémon Café Forest": { + "encounters": [ + { + "species": 61, + "moves": [ + 114, + 352 + ], + "versionMask": 4095 + }, + { + "species": 133, + "moves": [ + 129, + 204 + ], + "versionMask": 4095 + }, + { + "species": 235, + "moves": [ + 214, + 445 + ], + "versionMask": 4095 + }, + { + "species": 412, + "moves": [ + 173, + 450 + ], + "formMask": 1, + "versionMask": 4095 + } + ], + "items": [ + 30, + 31, + 32, + 33, + 50, + 82, + 83, + 84, + 134, + 157, + 221 + ] + }, "Global Link Promotions": { "encounters": [ { @@ -2327,6 +2379,7 @@ { "species": 493, "moves": [], + "formMask": 1, "versionMask": 3167 }, {