Add encounter form locking
Some checks failed
Build / dist (push) Has been cancelled

This commit is contained in:
kuroppoi 2025-04-07 17:13:34 +02:00
parent 840d5e956a
commit 2385398b4b
4 changed files with 111 additions and 21 deletions

View File

@ -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<Integer> getMoveOptions(GameVersion gameVersion, PkmnSpecies species, PkmnGender gender) {
public static List<PkmnForm> 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<Integer> 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()

View File

@ -10,10 +10,21 @@ import entralinked.model.pkmn.PkmnGender;
public record Encounter(
@JsonProperty(required = true) int species,
@JsonProperty(required = true) List<Integer> 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;
}
}

View File

@ -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) {

View File

@ -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
},
{