mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 19:28:01 +00:00
Adventure quest fixes
This commit is contained in:
@@ -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(){
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user