diff --git a/forge-gui-mobile/src/forge/adventure/character/DialogActor.java b/forge-gui-mobile/src/forge/adventure/character/DialogActor.java index e8d9d12599b..1254b619f12 100644 --- a/forge-gui-mobile/src/forge/adventure/character/DialogActor.java +++ b/forge-gui-mobile/src/forge/adventure/character/DialogActor.java @@ -2,6 +2,8 @@ package forge.adventure.character; import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; import forge.adventure.data.AdventureQuestData; import forge.adventure.stage.MapStage; import forge.adventure.util.Current; @@ -35,7 +37,13 @@ public class DialogActor extends CharacterSprite { dialog = new MapDialog(data.offerDialog, stage, id); this.textureRegion = null; this.questData = data; - dialog.addQuestAcceptedListener(e -> acceptQuest()); + ChangeListener listen = new ChangeListener() { + @Override + public void changed(ChangeEvent changeEvent, Actor actor) { + acceptQuest(); + } + }; + dialog.addQuestAcceptedListener(listen); } public void acceptQuest(){ diff --git a/forge-gui-mobile/src/forge/adventure/character/EnemySprite.java b/forge-gui-mobile/src/forge/adventure/character/EnemySprite.java index 18c87eb65f3..4543839880e 100644 --- a/forge-gui-mobile/src/forge/adventure/character/EnemySprite.java +++ b/forge-gui-mobile/src/forge/adventure/character/EnemySprite.java @@ -14,11 +14,9 @@ import forge.adventure.data.EffectData; import forge.adventure.data.EnemyData; import forge.adventure.data.RewardData; import forge.adventure.player.AdventurePlayer; -import forge.adventure.pointofintrest.PointOfInterestChanges; import forge.adventure.util.Current; import forge.adventure.util.MapDialog; import forge.adventure.util.Reward; -import forge.adventure.world.WorldSave; import forge.card.CardRarity; import forge.deck.Deck; import forge.item.PaperCard; @@ -27,6 +25,7 @@ import forge.util.MyRandom; import java.util.LinkedList; import java.util.List; +import java.util.UUID; import java.util.stream.Collectors; /** @@ -56,8 +55,7 @@ public class EnemySprite extends CharacterSprite { public float threatRange = 0.0f; public float fleeRange = 0.0f; public boolean ignoreDungeonEffect = false; - private PointOfInterestChanges changes; - public float spawnDelay; + public UUID questStageID; public EnemySprite(EnemyData enemyData) { this(0,enemyData); @@ -68,12 +66,6 @@ public class EnemySprite extends CharacterSprite { data = enemyData; } - public EnemySprite(int id, EnemyData enemyData, PointOfInterestChanges changes) { - super(id,enemyData.sprite); - data = enemyData; - this.changes = changes; - } - public void parseWaypoints(String waypoints){ String[] wp = waypoints.replaceAll("\\s", "").split(","); for (String s : wp) { @@ -238,10 +230,6 @@ public class EnemySprite extends CharacterSprite { Deck enemyDeck = Current.latestDeck(); /*// By popular demand, remove basic lands from the reward pool. CardPool deckNoBasicLands = enemyDeck.getMain().getFilteredPool(Predicates.compose(Predicates.not(CardRulesPredicates.Presets.IS_BASIC_LAND), PaperCard.FN_GET_RULES));*/ - if (changes!=null){ - long shopSeed = changes.getShopSeed(objectId); - WorldSave.getCurrentSave().getWorld().getRandom().setSeed(shopSeed); - } for (RewardData rdata : data.rewards) { ret.addAll(rdata.generate(false, enemyDeck == null ? null : enemyDeck.getMain().toFlatList(),true )); @@ -250,11 +238,6 @@ public class EnemySprite extends CharacterSprite { if(rewards != null) { //Collect additional rewards. for(RewardData rdata:rewards) { //Do not filter in case we want to FORCE basic lands. If it ever becomes a problem just repeat the same as above. - if (changes != null) - { - long shopSeed = changes.getShopSeed(objectId); - WorldSave.getCurrentSave().getWorld().getRandom().setSeed(shopSeed); - } ret.addAll(rdata.generate(false,(Current.latestDeck() != null ? Current.latestDeck().getMain().toFlatList() : null), true)); } diff --git a/forge-gui-mobile/src/forge/adventure/data/AdventureQuestData.java b/forge-gui-mobile/src/forge/adventure/data/AdventureQuestData.java index 6f02e142e46..3756b758099 100644 --- a/forge-gui-mobile/src/forge/adventure/data/AdventureQuestData.java +++ b/forge-gui-mobile/src/forge/adventure/data/AdventureQuestData.java @@ -309,7 +309,9 @@ public class AdventureQuestData implements Serializable { if (stage.objective == AdventureQuestController.ObjectiveTypes.Hunt){ EnemyData toUse = generateTargetEnemyData(stage); toUse.lifetime = stage.count1; - return new EnemySprite(toUse); + EnemySprite toReturn = new EnemySprite(toUse); + toReturn.questStageID = stage.questStageID; + return toReturn; } return null; } diff --git a/forge-gui-mobile/src/forge/adventure/data/AdventureQuestStage.java b/forge-gui-mobile/src/forge/adventure/data/AdventureQuestStage.java index 275c78180a7..d582be52f29 100644 --- a/forge-gui-mobile/src/forge/adventure/data/AdventureQuestStage.java +++ b/forge-gui-mobile/src/forge/adventure/data/AdventureQuestStage.java @@ -45,6 +45,8 @@ public class AdventureQuestStage implements Serializable { public String POIToken; //If defined, ignore tags input and use the target POI from a different stage's objective instead. private transient boolean inTargetLocation = false; + public UUID questStageID = UUID.randomUUID(); + public void checkPrerequisites() { //Todo - implement } @@ -226,7 +228,7 @@ public class AdventureQuestStage implements Serializable { } } } - else if (!targetPOI.equals(entered)){ + else if (!targetPOI.getPosition().equals(entered.getPosition())){ inTargetLocation = false; return; } @@ -303,5 +305,6 @@ public class AdventureQuestStage implements Serializable { this.POITags = other.POITags; this.targetEnemyData = other.targetEnemyData; this.deliveryItem = other.deliveryItem; + this.questStageID = other.questStageID; } } diff --git a/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java index f4a454551ee..59064e3587c 100644 --- a/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java +++ b/forge-gui-mobile/src/forge/adventure/player/AdventurePlayer.java @@ -291,8 +291,10 @@ public class AdventurePlayer implements Serializable, SaveFileContent { if(data.containsKey("quests")){ quests.clear(); Object[] q = (Object[]) data.readObject("quests"); - for (Object itsReallyAQuest: q) - quests.add((AdventureQuestData) itsReallyAQuest); + if (q != null) { + for (Object itsReallyAQuest : q) + quests.add((AdventureQuestData) itsReallyAQuest); + } } for(int i=0;i names = (List) data.readObject("names"); List x = (List) data.readObject("x"); List y = (List) data.readObject("y"); + List questStageIDs = (List) data.readObject("questStageIDs"); for (int i = 0; i < timeouts.size(); i++) { EnemySprite sprite = new EnemySprite(WorldData.getEnemy(names.get(i))); sprite.setX(x.get(i)); sprite.setY(y.get(i)); + sprite.questStageID = questStageIDs.get(i); + if (sprite.questStageID != null) + AdventureQuestController.instance().rematchQuestSprite(sprite); enemies.add(Pair.of(timeouts.get(i), sprite)); foregroundSprites.addActor(sprite); } @@ -399,16 +393,19 @@ public class WorldStage extends GameStage implements SaveFileContent { List names = new ArrayList<>(); List x = new ArrayList<>(); List y = new ArrayList<>(); + List questStageIDs = new ArrayList<>(); for (Pair enemy : enemies) { timeouts.add(enemy.getKey()); names.add(enemy.getValue().getData().name); x.add(enemy.getValue().getX()); y.add(enemy.getValue().getY()); + questStageIDs.add(enemy.getValue().questStageID); } data.storeObject("timeouts", timeouts); data.storeObject("names", names); data.storeObject("x", x); data.storeObject("y", y); + data.storeObject("questStageIDs", questStageIDs); data.store("globalTimer", globalTimer); return data; } diff --git a/forge-gui-mobile/src/forge/adventure/util/AdventureQuestController.java b/forge-gui-mobile/src/forge/adventure/util/AdventureQuestController.java index 7d127dece2a..9784a5ca73f 100644 --- a/forge-gui-mobile/src/forge/adventure/util/AdventureQuestController.java +++ b/forge-gui-mobile/src/forge/adventure/util/AdventureQuestController.java @@ -2,6 +2,8 @@ package forge.adventure.util; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.math.Vector2; +import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Json; import forge.adventure.character.EnemySprite; @@ -134,7 +136,13 @@ public class AdventureQuestController implements Serializable { MapDialog dialog = new MapDialog(dialogQueue.remove(), stage, -1); stage.showDialog(); dialog.activate(); - dialog.addDialogCompleteListener(e -> displayNextDialog(stage)); + ChangeListener listen = new ChangeListener() { + @Override + public void changed(ChangeEvent changeEvent, Actor actor) { + displayNextDialog(stage); + } + }; + dialog.addDialogCompleteListener(listen); } public static class DistanceSort implements Comparator @@ -217,6 +225,7 @@ public class AdventureQuestController implements Serializable { } public void updateQuestsWin(EnemySprite defeated, ArrayList enemies){ + enemySpriteList.remove(defeated); boolean allEnemiesCleared = true; if (enemies != null) { //battle was won in a dungeon, check for "clear" objectives @@ -241,12 +250,14 @@ public class AdventureQuestController implements Serializable { } public void updateQuestsLose(EnemySprite defeatedBy){ + enemySpriteList.remove(defeatedBy); for(AdventureQuestData currentQuest : Current.player().getQuests()) { currentQuest.updateLose(defeatedBy); } } public void updateDespawn(EnemySprite despawned){ + enemySpriteList.remove(despawned); for(AdventureQuestData currentQuest: Current.player().getQuests()) { currentQuest.updateDespawn(despawned); } @@ -273,6 +284,15 @@ public class AdventureQuestController implements Serializable { return enemySpriteList; } + public void rematchQuestSprite(EnemySprite sprite){ + for (AdventureQuestData q : Current.player().getQuests()){ + for (AdventureQuestStage s : q.stages){ + if (sprite.questStageID != null && sprite.questStageID.equals(s.questStageID)){ + s.setTargetSprite(sprite); + } + } + } + } String randomItemName() { //todo: expand and include in fetch/delivery quests diff --git a/forge-gui-mobile/src/forge/adventure/util/MapDialog.java b/forge-gui-mobile/src/forge/adventure/util/MapDialog.java index a079188c080..5cc4b40a5ca 100644 --- a/forge-gui-mobile/src/forge/adventure/util/MapDialog.java +++ b/forge-gui-mobile/src/forge/adventure/util/MapDialog.java @@ -5,6 +5,7 @@ import com.badlogic.gdx.audio.Music; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.ui.Dialog; +import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Timer; @@ -27,9 +28,8 @@ import forge.model.FModel; import forge.util.Localizer; import org.apache.commons.lang3.tuple.Pair; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import javax.swing.event.EventListenerList; +import java.util.ArrayList; +import java.util.List; /** * MapDialog @@ -211,31 +211,29 @@ public class MapDialog { } } - protected EventListenerList dialogCompleteList = new EventListenerList(); - protected EventListenerList questAcceptedList = new EventListenerList(); + protected List dialogCompleteList = new ArrayList<>(); + protected List questAcceptedList = new ArrayList<>(); public void addDialogCompleteListener(ChangeListener listener) { - dialogCompleteList.add(ChangeListener.class, listener); + dialogCompleteList.add(listener); } public void addQuestAcceptedListener(ChangeListener listener){ - questAcceptedList.add(ChangeListener.class, listener); + questAcceptedList.add(listener); } private void emitDialogFinished(){ - ChangeListener[] listeners = dialogCompleteList.getListeners(ChangeListener.class); - if (listeners != null && listeners.length > 0) { - ChangeEvent evt = new ChangeEvent(this); - for (ChangeListener listener : listeners) { - listener.stateChanged(evt); + if (dialogCompleteList != null && dialogCompleteList.size() > 0) { + ChangeListener.ChangeEvent evt = new ChangeListener.ChangeEvent(); + for (ChangeListener listener : dialogCompleteList) { + listener.changed(evt, null); } } } private void emitQuestAccepted(){ - ChangeListener[] listeners = questAcceptedList.getListeners(ChangeListener.class); - if (listeners != null && listeners.length > 0) { - ChangeEvent evt = new ChangeEvent(this); - for (ChangeListener listener : listeners) { - listener.stateChanged(evt); + if (questAcceptedList != null && questAcceptedList.size() > 0) { + ChangeListener.ChangeEvent evt = new ChangeListener.ChangeEvent(); + for (ChangeListener listener : questAcceptedList) { + listener.changed(evt, null); } } }