Adventure quest fixes

This commit is contained in:
jjayers99
2023-04-11 09:37:52 -04:00
parent b38e66c02c
commit 4c53b419bc
9 changed files with 68 additions and 55 deletions

View File

@@ -2,6 +2,8 @@ package forge.adventure.character;
import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.TextureRegion; 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.data.AdventureQuestData;
import forge.adventure.stage.MapStage; import forge.adventure.stage.MapStage;
import forge.adventure.util.Current; import forge.adventure.util.Current;
@@ -35,7 +37,13 @@ public class DialogActor extends CharacterSprite {
dialog = new MapDialog(data.offerDialog, stage, id); dialog = new MapDialog(data.offerDialog, stage, id);
this.textureRegion = null; this.textureRegion = null;
this.questData = data; 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(){ public void acceptQuest(){

View File

@@ -14,11 +14,9 @@ import forge.adventure.data.EffectData;
import forge.adventure.data.EnemyData; import forge.adventure.data.EnemyData;
import forge.adventure.data.RewardData; import forge.adventure.data.RewardData;
import forge.adventure.player.AdventurePlayer; import forge.adventure.player.AdventurePlayer;
import forge.adventure.pointofintrest.PointOfInterestChanges;
import forge.adventure.util.Current; import forge.adventure.util.Current;
import forge.adventure.util.MapDialog; import forge.adventure.util.MapDialog;
import forge.adventure.util.Reward; import forge.adventure.util.Reward;
import forge.adventure.world.WorldSave;
import forge.card.CardRarity; import forge.card.CardRarity;
import forge.deck.Deck; import forge.deck.Deck;
import forge.item.PaperCard; import forge.item.PaperCard;
@@ -27,6 +25,7 @@ import forge.util.MyRandom;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@@ -56,8 +55,7 @@ public class EnemySprite extends CharacterSprite {
public float threatRange = 0.0f; public float threatRange = 0.0f;
public float fleeRange = 0.0f; public float fleeRange = 0.0f;
public boolean ignoreDungeonEffect = false; public boolean ignoreDungeonEffect = false;
private PointOfInterestChanges changes; public UUID questStageID;
public float spawnDelay;
public EnemySprite(EnemyData enemyData) { public EnemySprite(EnemyData enemyData) {
this(0,enemyData); this(0,enemyData);
@@ -68,12 +66,6 @@ public class EnemySprite extends CharacterSprite {
data = enemyData; data = enemyData;
} }
public EnemySprite(int id, EnemyData enemyData, PointOfInterestChanges changes) {
super(id,enemyData.sprite);
data = enemyData;
this.changes = changes;
}
public void parseWaypoints(String waypoints){ public void parseWaypoints(String waypoints){
String[] wp = waypoints.replaceAll("\\s", "").split(","); String[] wp = waypoints.replaceAll("\\s", "").split(",");
for (String s : wp) { for (String s : wp) {
@@ -238,10 +230,6 @@ public class EnemySprite extends CharacterSprite {
Deck enemyDeck = Current.latestDeck(); Deck enemyDeck = Current.latestDeck();
/*// By popular demand, remove basic lands from the reward pool. /*// 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));*/ 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) { for (RewardData rdata : data.rewards) {
ret.addAll(rdata.generate(false, enemyDeck == null ? null : enemyDeck.getMain().toFlatList(),true )); 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. if(rewards != null) { //Collect additional rewards.
for(RewardData rdata: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. //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)); ret.addAll(rdata.generate(false,(Current.latestDeck() != null ? Current.latestDeck().getMain().toFlatList() : null), true));
} }

View File

@@ -309,7 +309,9 @@ public class AdventureQuestData implements Serializable {
if (stage.objective == AdventureQuestController.ObjectiveTypes.Hunt){ if (stage.objective == AdventureQuestController.ObjectiveTypes.Hunt){
EnemyData toUse = generateTargetEnemyData(stage); EnemyData toUse = generateTargetEnemyData(stage);
toUse.lifetime = stage.count1; toUse.lifetime = stage.count1;
return new EnemySprite(toUse); EnemySprite toReturn = new EnemySprite(toUse);
toReturn.questStageID = stage.questStageID;
return toReturn;
} }
return null; return null;
} }

View File

@@ -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. 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; private transient boolean inTargetLocation = false;
public UUID questStageID = UUID.randomUUID();
public void checkPrerequisites() { public void checkPrerequisites() {
//Todo - implement //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; inTargetLocation = false;
return; return;
} }
@@ -303,5 +305,6 @@ public class AdventureQuestStage implements Serializable {
this.POITags = other.POITags; this.POITags = other.POITags;
this.targetEnemyData = other.targetEnemyData; this.targetEnemyData = other.targetEnemyData;
this.deliveryItem = other.deliveryItem; this.deliveryItem = other.deliveryItem;
this.questStageID = other.questStageID;
} }
} }

View File

@@ -291,9 +291,11 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
if(data.containsKey("quests")){ if(data.containsKey("quests")){
quests.clear(); quests.clear();
Object[] q = (Object[]) data.readObject("quests"); Object[] q = (Object[]) data.readObject("quests");
for (Object itsReallyAQuest: q) if (q != null) {
for (Object itsReallyAQuest : q)
quests.add((AdventureQuestData) itsReallyAQuest); quests.add((AdventureQuestData) itsReallyAQuest);
} }
}
for(int i=0;i<NUMBER_OF_DECKS;i++) { for(int i=0;i<NUMBER_OF_DECKS;i++) {
if(!data.containsKey("deck_name_" + i)) { if(!data.containsKey("deck_name_" + i)) {

View File

@@ -551,7 +551,7 @@ public class MapStage extends GameStage {
System.err.printf("Enemy \"%s\" not found.", enemy); System.err.printf("Enemy \"%s\" not found.", enemy);
break; break;
} }
EnemySprite mob = new EnemySprite(id, EN, changes); EnemySprite mob = new EnemySprite(id, EN);
Object dialogObject = prop.get("dialog"); //Check if the enemy has a dialogue attached to it. Object dialogObject = prop.get("dialog"); //Check if the enemy has a dialogue attached to it.
if (dialogObject != null && !dialogObject.toString().isEmpty()) { if (dialogObject != null && !dialogObject.toString().isEmpty()) {
mob.dialog = new MapDialog(dialogObject.toString(), this, mob.getId()); mob.dialog = new MapDialog(dialogObject.toString(), this, mob.getId());

View File

@@ -11,10 +11,7 @@ import com.badlogic.gdx.utils.viewport.Viewport;
import forge.Forge; import forge.Forge;
import forge.adventure.character.CharacterSprite; import forge.adventure.character.CharacterSprite;
import forge.adventure.character.EnemySprite; import forge.adventure.character.EnemySprite;
import forge.adventure.data.AdventureQuestData; import forge.adventure.data.*;
import forge.adventure.data.BiomeData;
import forge.adventure.data.EnemyData;
import forge.adventure.data.WorldData;
import forge.adventure.scene.DuelScene; import forge.adventure.scene.DuelScene;
import forge.adventure.scene.RewardScene; import forge.adventure.scene.RewardScene;
import forge.adventure.scene.Scene; import forge.adventure.scene.Scene;
@@ -29,10 +26,7 @@ import forge.sound.SoundSystem;
import forge.util.MyRandom; import forge.util.MyRandom;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import java.util.ArrayList; import java.util.*;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
/** /**
@@ -236,10 +230,6 @@ public class WorldStage extends GameStage implements SaveFileContent {
} }
private void handleMonsterSpawn(float delta) { private void handleMonsterSpawn(float delta) {
for (Actor sprite : foregroundSprites.getChildren()) {
if (AdventureQuestController.instance().getQuestSprites().remove(sprite)) {
}
}
for (EnemySprite questSprite : AdventureQuestController.instance().getQuestSprites()) { for (EnemySprite questSprite : AdventureQuestController.instance().getQuestSprites()) {
if (!foregroundSprites.getChildren().contains(questSprite, true)) { if (!foregroundSprites.getChildren().contains(questSprite, true)) {
spawnQuestSprite(questSprite,2.5f); spawnQuestSprite(questSprite,2.5f);
@@ -371,10 +361,14 @@ public class WorldStage extends GameStage implements SaveFileContent {
List<String> names = (List<String>) data.readObject("names"); List<String> names = (List<String>) data.readObject("names");
List<Float> x = (List<Float>) data.readObject("x"); List<Float> x = (List<Float>) data.readObject("x");
List<Float> y = (List<Float>) data.readObject("y"); List<Float> y = (List<Float>) data.readObject("y");
List<UUID> questStageIDs = (List<UUID>) data.readObject("questStageIDs");
for (int i = 0; i < timeouts.size(); i++) { for (int i = 0; i < timeouts.size(); i++) {
EnemySprite sprite = new EnemySprite(WorldData.getEnemy(names.get(i))); EnemySprite sprite = new EnemySprite(WorldData.getEnemy(names.get(i)));
sprite.setX(x.get(i)); sprite.setX(x.get(i));
sprite.setY(y.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)); enemies.add(Pair.of(timeouts.get(i), sprite));
foregroundSprites.addActor(sprite); foregroundSprites.addActor(sprite);
} }
@@ -399,16 +393,19 @@ public class WorldStage extends GameStage implements SaveFileContent {
List<String> names = new ArrayList<>(); List<String> names = new ArrayList<>();
List<Float> x = new ArrayList<>(); List<Float> x = new ArrayList<>();
List<Float> y = new ArrayList<>(); List<Float> y = new ArrayList<>();
List<UUID> questStageIDs = new ArrayList<>();
for (Pair<Float, EnemySprite> enemy : enemies) { for (Pair<Float, EnemySprite> enemy : enemies) {
timeouts.add(enemy.getKey()); timeouts.add(enemy.getKey());
names.add(enemy.getValue().getData().name); names.add(enemy.getValue().getData().name);
x.add(enemy.getValue().getX()); x.add(enemy.getValue().getX());
y.add(enemy.getValue().getY()); y.add(enemy.getValue().getY());
questStageIDs.add(enemy.getValue().questStageID);
} }
data.storeObject("timeouts", timeouts); data.storeObject("timeouts", timeouts);
data.storeObject("names", names); data.storeObject("names", names);
data.storeObject("x", x); data.storeObject("x", x);
data.storeObject("y", y); data.storeObject("y", y);
data.storeObject("questStageIDs", questStageIDs);
data.store("globalTimer", globalTimer); data.store("globalTimer", globalTimer);
return data; return data;
} }

View File

@@ -2,6 +2,8 @@ package forge.adventure.util;
import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.math.Vector2; 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.Array;
import com.badlogic.gdx.utils.Json; import com.badlogic.gdx.utils.Json;
import forge.adventure.character.EnemySprite; import forge.adventure.character.EnemySprite;
@@ -134,7 +136,13 @@ public class AdventureQuestController implements Serializable {
MapDialog dialog = new MapDialog(dialogQueue.remove(), stage, -1); MapDialog dialog = new MapDialog(dialogQueue.remove(), stage, -1);
stage.showDialog(); stage.showDialog();
dialog.activate(); 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<PointOfInterest> public static class DistanceSort implements Comparator<PointOfInterest>
@@ -217,6 +225,7 @@ public class AdventureQuestController implements Serializable {
} }
public void updateQuestsWin(EnemySprite defeated, ArrayList<EnemySprite> enemies){ public void updateQuestsWin(EnemySprite defeated, ArrayList<EnemySprite> enemies){
enemySpriteList.remove(defeated);
boolean allEnemiesCleared = true; boolean allEnemiesCleared = true;
if (enemies != null) { if (enemies != null) {
//battle was won in a dungeon, check for "clear" objectives //battle was won in a dungeon, check for "clear" objectives
@@ -241,12 +250,14 @@ public class AdventureQuestController implements Serializable {
} }
public void updateQuestsLose(EnemySprite defeatedBy){ public void updateQuestsLose(EnemySprite defeatedBy){
enemySpriteList.remove(defeatedBy);
for(AdventureQuestData currentQuest : Current.player().getQuests()) { for(AdventureQuestData currentQuest : Current.player().getQuests()) {
currentQuest.updateLose(defeatedBy); currentQuest.updateLose(defeatedBy);
} }
} }
public void updateDespawn(EnemySprite despawned){ public void updateDespawn(EnemySprite despawned){
enemySpriteList.remove(despawned);
for(AdventureQuestData currentQuest: Current.player().getQuests()) { for(AdventureQuestData currentQuest: Current.player().getQuests()) {
currentQuest.updateDespawn(despawned); currentQuest.updateDespawn(despawned);
} }
@@ -273,6 +284,15 @@ public class AdventureQuestController implements Serializable {
return enemySpriteList; 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() String randomItemName()
{ //todo: expand and include in fetch/delivery quests { //todo: expand and include in fetch/delivery quests

View File

@@ -5,6 +5,7 @@ import com.badlogic.gdx.audio.Music;
import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.InputEvent;
import com.badlogic.gdx.scenes.scene2d.ui.Dialog; 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.scenes.scene2d.utils.ClickListener;
import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.Timer; import com.badlogic.gdx.utils.Timer;
@@ -27,9 +28,8 @@ import forge.model.FModel;
import forge.util.Localizer; import forge.util.Localizer;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import javax.swing.event.ChangeEvent; import java.util.ArrayList;
import javax.swing.event.ChangeListener; import java.util.List;
import javax.swing.event.EventListenerList;
/** /**
* MapDialog * MapDialog
@@ -211,31 +211,29 @@ public class MapDialog {
} }
} }
protected EventListenerList dialogCompleteList = new EventListenerList(); protected List<ChangeListener> dialogCompleteList = new ArrayList<>();
protected EventListenerList questAcceptedList = new EventListenerList(); protected List<ChangeListener> questAcceptedList = new ArrayList<>();
public void addDialogCompleteListener(ChangeListener listener) { public void addDialogCompleteListener(ChangeListener listener) {
dialogCompleteList.add(ChangeListener.class, listener); dialogCompleteList.add(listener);
} }
public void addQuestAcceptedListener(ChangeListener listener){ public void addQuestAcceptedListener(ChangeListener listener){
questAcceptedList.add(ChangeListener.class, listener); questAcceptedList.add(listener);
} }
private void emitDialogFinished(){ private void emitDialogFinished(){
ChangeListener[] listeners = dialogCompleteList.getListeners(ChangeListener.class); if (dialogCompleteList != null && dialogCompleteList.size() > 0) {
if (listeners != null && listeners.length > 0) { ChangeListener.ChangeEvent evt = new ChangeListener.ChangeEvent();
ChangeEvent evt = new ChangeEvent(this); for (ChangeListener listener : dialogCompleteList) {
for (ChangeListener listener : listeners) { listener.changed(evt, null);
listener.stateChanged(evt);
} }
} }
} }
private void emitQuestAccepted(){ private void emitQuestAccepted(){
ChangeListener[] listeners = questAcceptedList.getListeners(ChangeListener.class); if (questAcceptedList != null && questAcceptedList.size() > 0) {
if (listeners != null && listeners.length > 0) { ChangeListener.ChangeEvent evt = new ChangeListener.ChangeEvent();
ChangeEvent evt = new ChangeEvent(this); for (ChangeListener listener : questAcceptedList) {
for (ChangeListener listener : listeners) { listener.changed(evt, null);
listener.stateChanged(evt);
} }
} }
} }