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.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(){

View File

@@ -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));
}

View File

@@ -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;
}

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.
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;
}
}

View File

@@ -291,9 +291,11 @@ public class AdventurePlayer implements Serializable, SaveFileContent {
if(data.containsKey("quests")){
quests.clear();
Object[] q = (Object[]) data.readObject("quests");
for (Object itsReallyAQuest: q)
if (q != null) {
for (Object itsReallyAQuest : q)
quests.add((AdventureQuestData) itsReallyAQuest);
}
}
for(int i=0;i<NUMBER_OF_DECKS;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);
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.
if (dialogObject != null && !dialogObject.toString().isEmpty()) {
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.adventure.character.CharacterSprite;
import forge.adventure.character.EnemySprite;
import forge.adventure.data.AdventureQuestData;
import forge.adventure.data.BiomeData;
import forge.adventure.data.EnemyData;
import forge.adventure.data.WorldData;
import forge.adventure.data.*;
import forge.adventure.scene.DuelScene;
import forge.adventure.scene.RewardScene;
import forge.adventure.scene.Scene;
@@ -29,10 +26,7 @@ import forge.sound.SoundSystem;
import forge.util.MyRandom;
import org.apache.commons.lang3.tuple.Pair;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import java.util.*;
/**
@@ -236,10 +230,6 @@ public class WorldStage extends GameStage implements SaveFileContent {
}
private void handleMonsterSpawn(float delta) {
for (Actor sprite : foregroundSprites.getChildren()) {
if (AdventureQuestController.instance().getQuestSprites().remove(sprite)) {
}
}
for (EnemySprite questSprite : AdventureQuestController.instance().getQuestSprites()) {
if (!foregroundSprites.getChildren().contains(questSprite, true)) {
spawnQuestSprite(questSprite,2.5f);
@@ -371,10 +361,14 @@ public class WorldStage extends GameStage implements SaveFileContent {
List<String> names = (List<String>) data.readObject("names");
List<Float> x = (List<Float>) data.readObject("x");
List<Float> y = (List<Float>) data.readObject("y");
List<UUID> questStageIDs = (List<UUID>) 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<String> names = new ArrayList<>();
List<Float> x = new ArrayList<>();
List<Float> y = new ArrayList<>();
List<UUID> questStageIDs = new ArrayList<>();
for (Pair<Float, EnemySprite> 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;
}

View File

@@ -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<PointOfInterest>
@@ -217,6 +225,7 @@ public class AdventureQuestController implements Serializable {
}
public void updateQuestsWin(EnemySprite defeated, ArrayList<EnemySprite> 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

View File

@@ -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<ChangeListener> dialogCompleteList = new ArrayList<>();
protected List<ChangeListener> 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);
}
}
}