add TextraTypist

for Font Effects, Styles, etc..
This commit is contained in:
Anthony Calosa
2022-08-17 13:32:17 +08:00
parent 03e2c8b572
commit 7170b2d282
4 changed files with 123 additions and 109 deletions

View File

@@ -45,6 +45,11 @@
<artifactId>forge-gui</artifactId> <artifactId>forge-gui</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<dependency>
<groupId>com.github.tommyettinger</groupId>
<artifactId>textratypist</artifactId>
<version>0.7.0</version>
</dependency>
<dependency> <dependency>
<groupId>com.badlogicgames.gdx</groupId> <groupId>com.badlogicgames.gdx</groupId>
<artifactId>gdx</artifactId> <artifactId>gdx</artifactId>

View File

@@ -21,9 +21,13 @@ import com.badlogic.gdx.scenes.scene2d.actions.Actions;
import com.badlogic.gdx.scenes.scene2d.ui.Dialog; import com.badlogic.gdx.scenes.scene2d.ui.Dialog;
import com.badlogic.gdx.scenes.scene2d.ui.Image; import com.badlogic.gdx.scenes.scene2d.ui.Image;
import com.badlogic.gdx.scenes.scene2d.ui.Label; import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.utils.Align; import com.badlogic.gdx.utils.Align;
import com.badlogic.gdx.utils.Array; import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.Scaling; import com.badlogic.gdx.utils.Scaling;
import com.github.tommyettinger.textra.TypingAdapter;
import com.github.tommyettinger.textra.TypingLabel;
import com.github.tommyettinger.textra.TypingListener;
import forge.Forge; import forge.Forge;
import forge.adventure.character.*; import forge.adventure.character.*;
import forge.adventure.data.*; import forge.adventure.data.*;
@@ -83,11 +87,14 @@ public class MapStage extends GameStage {
public boolean getDialogOnlyInput() { public boolean getDialogOnlyInput() {
return dialogOnlyInput; return dialogOnlyInput;
} }
public Dialog getDialog() { public Dialog getDialog() {
return dialog; return dialog;
} }
public boolean canEscape() { return (preventEscape ? true : false); } //Check if escape is possible. public boolean canEscape() {
return (preventEscape ? true : false);
} //Check if escape is possible.
public void clearIsInMap() { public void clearIsInMap() {
isInMap = false; isInMap = false;
@@ -95,7 +102,8 @@ public class MapStage extends GameStage {
preventEscape = false; preventEscape = false;
GameHUD.getInstance().showHideMap(true); GameHUD.getInstance().showHideMap(true);
} }
public void draw (Batch batch) {
public void draw(Batch batch) {
//Camera camera = getCamera() ; //Camera camera = getCamera() ;
//camera.update(); //camera.update();
//update camera after all layers got drawn //update camera after all layers got drawn
@@ -114,8 +122,8 @@ public class MapStage extends GameStage {
public static MapStage getInstance() { public static MapStage getInstance() {
return instance == null ? instance = new MapStage() : instance; return instance == null ? instance = new MapStage() : instance;
} }
public void resLoaded()
{ public void resLoaded() {
dialog = Controls.newDialog(""); dialog = Controls.newDialog("");
} }
@@ -195,18 +203,25 @@ public class MapStage extends GameStage {
} }
private void effectDialog(EffectData E){ private void effectDialog(EffectData E) {
dialog.getContentTable().clear();
dialog.getButtonTable().clear(); dialog.getButtonTable().clear();
String text = "Strange magical energies flow within this place...\nAll opponents get:\n"; dialog.getContentTable().clear();
text += E.getDescription(); TextButton ok = Controls.newTextButton("OK", this::hideDialog);
Label L = Controls.newLabel(text); ok.setVisible(false);
TypingLabel L = Controls.newTypingLabel("{GRADIENT=CYAN;WHITE;1;1}Strange magical energies flow within this place...{ENDGRADIENT}\nAll opponents get:\n" + E.getDescription());
L.setWrap(true); L.setWrap(true);
L.setTypingListener(new TypingAdapter() {
@Override
public void end() {
ok.setVisible(true);
}
});
dialog.getButtonTable().add(ok).width(250f);
dialog.getContentTable().add(L).width(250f); dialog.getContentTable().add(L).width(250f);
dialog.getButtonTable().add(Controls.newTextButton("OK", this::hideDialog)).width(250f);
dialog.setKeepWithinStage(true); dialog.setKeepWithinStage(true);
showDialog(); showDialog();
} }
public void showImageDialog(String message, Texture texture) { public void showImageDialog(String message, Texture texture) {
dialog.getContentTable().clear(); dialog.getContentTable().clear();
dialog.getButtonTable().clear(); dialog.getButtonTable().clear();
@@ -226,6 +241,7 @@ public class MapStage extends GameStage {
setDialogStage(GameHUD.getInstance()); setDialogStage(GameHUD.getInstance());
showDialog(); showDialog();
} }
public void showDeckAwardDialog(String message, Deck deck) { public void showDeckAwardDialog(String message, Deck deck) {
dialog.getContentTable().clear(); dialog.getContentTable().clear();
dialog.getButtonTable().clear(); dialog.getButtonTable().clear();
@@ -258,7 +274,7 @@ public class MapStage extends GameStage {
if (deckColor.hasWhite()) { if (deckColor.hasWhite()) {
Image pix = new Image(atlas.createSprite("pixW")); Image pix = new Image(atlas.createSprite("pixW"));
pix.setScaling(Scaling.fit); pix.setScaling(Scaling.fit);
pix.setSize(20,20); pix.setSize(20, 20);
pix.setPosition(0, 0); pix.setPosition(0, 0);
group.addActor(pix); group.addActor(pix);
mul++; mul++;
@@ -266,43 +282,44 @@ public class MapStage extends GameStage {
if (deckColor.hasBlue()) { if (deckColor.hasBlue()) {
Image pix = new Image(atlas.createSprite("pixU")); Image pix = new Image(atlas.createSprite("pixU"));
pix.setScaling(Scaling.fit); pix.setScaling(Scaling.fit);
pix.setSize(20,20); pix.setSize(20, 20);
pix.setPosition(20*mul, 0); pix.setPosition(20 * mul, 0);
mul++; mul++;
group.addActor(pix); group.addActor(pix);
} }
if (deckColor.hasBlack()) { if (deckColor.hasBlack()) {
Image pix = new Image(atlas.createSprite("pixB")); Image pix = new Image(atlas.createSprite("pixB"));
pix.setScaling(Scaling.fit); pix.setScaling(Scaling.fit);
pix.setSize(20,20); pix.setSize(20, 20);
pix.setPosition(20*mul, 0); pix.setPosition(20 * mul, 0);
mul++; mul++;
group.addActor(pix); group.addActor(pix);
} }
if (deckColor.hasRed()) { if (deckColor.hasRed()) {
Image pix = new Image(atlas.createSprite("pixR")); Image pix = new Image(atlas.createSprite("pixR"));
pix.setScaling(Scaling.fit); pix.setScaling(Scaling.fit);
pix.setSize(20,20); pix.setSize(20, 20);
pix.setPosition(20*mul, 0); pix.setPosition(20 * mul, 0);
mul++; mul++;
group.addActor(pix); group.addActor(pix);
} }
if (deckColor.hasGreen()) { if (deckColor.hasGreen()) {
Image pix = new Image(atlas.createSprite("pixG")); Image pix = new Image(atlas.createSprite("pixG"));
pix.setScaling(Scaling.fit); pix.setScaling(Scaling.fit);
pix.setSize(20,20); pix.setSize(20, 20);
pix.setPosition(20*mul, 0); pix.setPosition(20 * mul, 0);
mul++; mul++;
group.addActor(pix); group.addActor(pix);
} }
group.setHeight(20); group.setHeight(20);
group.setWidth(20*mul); group.setWidth(20 * mul);
dialog.getContentTable().add(group).align(Align.center); dialog.getContentTable().add(group).align(Align.center);
dialog.getContentTable().add().row(); dialog.getContentTable().add().row();
} }
} }
Label L = Controls.newLabel(message); TypingLabel L = Controls.newTypingLabel(message);
L.setWrap(true); L.setWrap(true);
L.skipToTheEnd();
dialog.getContentTable().add(L).width(240); dialog.getContentTable().add(L).width(240);
dialog.getButtonTable().add(Controls.newTextButton("OK", this::hideDialog)).width(240); dialog.getButtonTable().add(Controls.newTextButton("OK", this::hideDialog)).width(240);
dialog.setKeepWithinStage(true); dialog.setKeepWithinStage(true);
@@ -331,13 +348,13 @@ public class MapStage extends GameStage {
//Load dungeon effects. //Load dungeon effects.
MapProperties MP = map.getProperties(); MapProperties MP = map.getProperties();
if( MP.get("dungeonEffect") != null && !MP.get("dungeonEffect").toString().isEmpty()){ if (MP.get("dungeonEffect") != null && !MP.get("dungeonEffect").toString().isEmpty()) {
effect = JSONStringLoader.parse(EffectData.class, map.getProperties().get("dungeonEffect").toString(), ""); effect = JSONStringLoader.parse(EffectData.class, map.getProperties().get("dungeonEffect").toString(), "");
effectDialog(effect); effectDialog(effect);
} }
if (MP.get("preventEscape") != null) preventEscape = (boolean)MP.get("preventEscape"); if (MP.get("preventEscape") != null) preventEscape = (boolean) MP.get("preventEscape");
if (MP.get("music") != null && !MP.get("music").toString().isEmpty()){ if (MP.get("music") != null && !MP.get("music").toString().isEmpty()) {
//TODO: Add a way to play a music file directly without using a playlist. //TODO: Add a way to play a music file directly without using a playlist.
} }
@@ -353,7 +370,7 @@ public class MapStage extends GameStage {
loadObjects(layer, sourceMap); loadObjects(layer, sourceMap);
} }
} }
if(spriteLayer == null) System.err.print("Warning: No spriteLayer present in map.\n"); if (spriteLayer == null) System.err.print("Warning: No spriteLayer present in map.\n");
} }
@@ -381,9 +398,9 @@ public class MapStage extends GameStage {
boolean spawnEasy = prop.get("spawn.Easy", Boolean.class); boolean spawnEasy = prop.get("spawn.Easy", Boolean.class);
boolean spawnNorm = prop.get("spawn.Normal", Boolean.class); boolean spawnNorm = prop.get("spawn.Normal", Boolean.class);
boolean spawnHard = prop.get("spawn.Hard", Boolean.class); boolean spawnHard = prop.get("spawn.Hard", Boolean.class);
if(DF.spawnRank == 2 && !spawnHard) return false; if (DF.spawnRank == 2 && !spawnHard) return false;
if(DF.spawnRank == 1 && !spawnNorm) return false; if (DF.spawnRank == 1 && !spawnNorm) return false;
if(DF.spawnRank == 0 && !spawnEasy) return false; if (DF.spawnRank == 0 && !spawnEasy) return false;
return true; return true;
} }
@@ -408,46 +425,48 @@ public class MapStage extends GameStage {
addMapActor(obj, entry); addMapActor(obj, entry);
break; break;
case "reward": case "reward":
if(!canSpawn(prop)) break; if (!canSpawn(prop)) break;
Object R = prop.get("reward"); Object R = prop.get("reward");
if(R != null && !R.toString().isEmpty()) { if (R != null && !R.toString().isEmpty()) {
Object S = prop.get("sprite"); Object S = prop.get("sprite");
String Sp; Sp = "sprites/treasure.atlas"; String Sp;
if(S != null && !S.toString().isEmpty()) Sp = S.toString(); Sp = "sprites/treasure.atlas";
else System.err.printf("No sprite defined for reward (ID:%s), defaulting to \"sprites/treasure.atlas\"", id); if (S != null && !S.toString().isEmpty()) Sp = S.toString();
else
System.err.printf("No sprite defined for reward (ID:%s), defaulting to \"sprites/treasure.atlas\"", id);
RewardSprite RW = new RewardSprite(id, R.toString(), Sp); RewardSprite RW = new RewardSprite(id, R.toString(), Sp);
RW.hidden = hidden; RW.hidden = hidden;
addMapActor(obj, RW); addMapActor(obj, RW);
} }
break; break;
case "enemy": case "enemy":
if(!canSpawn(prop)) break; if (!canSpawn(prop)) break;
Object E = prop.get("enemy"); Object E = prop.get("enemy");
if(E != null && !E.toString().isEmpty()) { if (E != null && !E.toString().isEmpty()) {
EnemyData EN = WorldData.getEnemy(E.toString()); EnemyData EN = WorldData.getEnemy(E.toString());
if(EN == null){ if (EN == null) {
System.err.printf("Enemy \"%s\" not found.", E.toString()); System.err.printf("Enemy \"%s\" not found.", E.toString());
break; break;
} }
EnemySprite mob = new EnemySprite(id, EN); EnemySprite mob = new EnemySprite(id, EN);
Object D = prop.get("dialog"); //Check if the enemy has a dialogue attached to it. Object D = prop.get("dialog"); //Check if the enemy has a dialogue attached to it.
if(D != null && !D.toString().isEmpty()) { if (D != null && !D.toString().isEmpty()) {
mob.dialog = new MapDialog(D.toString(), this, mob.getId()); mob.dialog = new MapDialog(D.toString(), this, mob.getId());
} }
D = prop.get("defeatDialog"); //Check if the enemy has a defeat dialogue attached to it. D = prop.get("defeatDialog"); //Check if the enemy has a defeat dialogue attached to it.
if(D != null && !D.toString().isEmpty()) { if (D != null && !D.toString().isEmpty()) {
mob.defeatDialog = new MapDialog(D.toString(), this, mob.getId()); mob.defeatDialog = new MapDialog(D.toString(), this, mob.getId());
} }
D = prop.get("name"); //Check for name override. D = prop.get("name"); //Check for name override.
if(D != null && !D.toString().isEmpty()) { if (D != null && !D.toString().isEmpty()) {
mob.nameOverride = D.toString(); mob.nameOverride = D.toString();
} }
D = prop.get("effect"); //Check for special effects. D = prop.get("effect"); //Check for special effects.
if(D != null && !D.toString().isEmpty()) { if (D != null && !D.toString().isEmpty()) {
mob.effect = JSONStringLoader.parse(EffectData.class, D.toString(), ""); mob.effect = JSONStringLoader.parse(EffectData.class, D.toString(), "");
} }
D = prop.get("reward"); //Check for additional rewards. D = prop.get("reward"); //Check for additional rewards.
if(D != null && !D.toString().isEmpty()) { if (D != null && !D.toString().isEmpty()) {
mob.rewards = JSONStringLoader.parse(RewardData[].class, D.toString(), "[]"); mob.rewards = JSONStringLoader.parse(RewardData[].class, D.toString(), "[]");
} }
mob.hidden = hidden; //Evil. mob.hidden = hidden; //Evil.
@@ -462,29 +481,16 @@ public class MapStage extends GameStage {
//TODO: Ability to move them (using a sequence such as "UULU" for up, up, left, up). //TODO: Ability to move them (using a sequence such as "UULU" for up, up, left, up).
break; break;
case "inn": case "inn":
addMapActor(obj, new OnCollide(new Runnable() { addMapActor(obj, new OnCollide(() -> Forge.switchScene(SceneType.InnScene.instance)));
@Override
public void run() {
Forge.switchScene(SceneType.InnScene.instance);
}
}));
break; break;
case "spellsmith": case "spellsmith":
addMapActor(obj, new OnCollide(new Runnable() { addMapActor(obj, new OnCollide(() -> Forge.switchScene(SceneType.SpellSmithScene.instance)));
@Override
public void run() { Forge.switchScene(SceneType.SpellSmithScene.instance); }
}));
break; break;
case "exit": case "exit":
addMapActor(obj, new OnCollide(new Runnable() { addMapActor(obj, new OnCollide(() -> MapStage.this.exit()));
@Override
public void run() {
MapStage.this.exit();
}
}));
break; break;
case "dialog": case "dialog":
if(obj instanceof TiledMapTileMapObject) { if (obj instanceof TiledMapTileMapObject) {
TiledMapTileMapObject tiledObj = (TiledMapTileMapObject) obj; TiledMapTileMapObject tiledObj = (TiledMapTileMapObject) obj;
DialogActor dialog = new DialogActor(this, id, prop.get("dialog").toString(), tiledObj.getTextureRegion()); DialogActor dialog = new DialogActor(this, id, prop.get("dialog").toString(), tiledObj.getTextureRegion());
addMapActor(obj, dialog); addMapActor(obj, dialog);
@@ -492,7 +498,7 @@ public class MapStage extends GameStage {
break; break;
case "shop": case "shop":
String shopList = prop.get("shopList").toString(); String shopList = prop.get("shopList").toString();
shopList=shopList.replaceAll("\\s",""); shopList = shopList.replaceAll("\\s", "");
Array<String> possibleShops = new Array<>(shopList.split(",")); Array<String> possibleShops = new Array<>(shopList.split(","));
Array<ShopData> shops; Array<ShopData> shops;
if (possibleShops.size == 0 || shopList.equals("")) if (possibleShops.size == 0 || shopList.equals(""))
@@ -505,7 +511,7 @@ public class MapStage extends GameStage {
} }
} }
} }
if(shops.size == 0) continue; if (shops.size == 0) continue;
ShopData data = shops.get(WorldSave.getCurrentSave().getWorld().getRandom().nextInt(shops.size)); ShopData data = shops.get(WorldSave.getCurrentSave().getWorld().getRandom().nextInt(shops.size));
Array<Reward> ret = new Array<>(); Array<Reward> ret = new Array<>();
@@ -547,25 +553,17 @@ public class MapStage extends GameStage {
if (playerWins) { if (playerWins) {
player.setAnimation(CharacterSprite.AnimationTypes.Attack); player.setAnimation(CharacterSprite.AnimationTypes.Attack);
currentMob.setAnimation(CharacterSprite.AnimationTypes.Death); currentMob.setAnimation(CharacterSprite.AnimationTypes.Death);
startPause(0.3f, new Runnable() { startPause(0.3f, () -> MapStage.this.getReward());
@Override
public void run() {
MapStage.this.getReward();
}
});
} else { } else {
player.setAnimation(CharacterSprite.AnimationTypes.Hit); player.setAnimation(CharacterSprite.AnimationTypes.Hit);
currentMob.setAnimation(CharacterSprite.AnimationTypes.Attack); currentMob.setAnimation(CharacterSprite.AnimationTypes.Attack);
startPause(0.3f, new Runnable() { startPause(0.3f, () -> {
@Override
public void run() {
player.setAnimation(CharacterSprite.AnimationTypes.Idle); player.setAnimation(CharacterSprite.AnimationTypes.Idle);
currentMob.setAnimation(CharacterSprite.AnimationTypes.Idle); currentMob.setAnimation(CharacterSprite.AnimationTypes.Idle);
player.setPosition(oldPosition4); player.setPosition(oldPosition4);
Current.player().defeated(); Current.player().defeated();
MapStage.this.stop(); MapStage.this.stop();
currentMob = null; currentMob = null;
}
}); });
} }
@@ -573,7 +571,7 @@ public class MapStage extends GameStage {
public boolean deleteObject(int id) { public boolean deleteObject(int id) {
changes.deleteObject(id); changes.deleteObject(id);
for (int i=0;i< actors.size;i++) { for (int i = 0; i < actors.size; i++) {
if (actors.get(i).getObjectId() == id && id > 0) { if (actors.get(i).getObjectId() == id && id > 0) {
actors.get(i).remove(); actors.get(i).remove();
actors.removeIndex(i); actors.removeIndex(i);
@@ -583,18 +581,18 @@ public class MapStage extends GameStage {
return false; return false;
} }
public boolean lookForID(int id){ //Search actor by ID. public boolean lookForID(int id) { //Search actor by ID.
for(MapActor A : new Array.ArrayIterator<>(actors)){ for (MapActor A : new Array.ArrayIterator<>(actors)) {
if(A.getId() == id) if (A.getId() == id)
return true; return true;
} }
return false; return false;
} }
public EnemySprite getEnemyByID(int id) { //Search actor by ID, enemies only. public EnemySprite getEnemyByID(int id) { //Search actor by ID, enemies only.
for(MapActor A : new Array.ArrayIterator<>(actors)){ for (MapActor A : new Array.ArrayIterator<>(actors)) {
if(A instanceof EnemySprite && A.getId() == id) if (A instanceof EnemySprite && A.getId() == id)
return ((EnemySprite) A); return ((EnemySprite) A);
} }
return null; return null;
@@ -604,7 +602,7 @@ public class MapStage extends GameStage {
isLoadingMatch = false; isLoadingMatch = false;
((RewardScene) SceneType.RewardScene.instance).loadRewards(currentMob.getRewards(), RewardScene.Type.Loot, null); ((RewardScene) SceneType.RewardScene.instance).loadRewards(currentMob.getRewards(), RewardScene.Type.Loot, null);
Forge.switchScene(SceneType.RewardScene.instance); Forge.switchScene(SceneType.RewardScene.instance);
if(currentMob.defeatDialog == null) { if (currentMob.defeatDialog == null) {
currentMob.remove(); currentMob.remove();
actors.removeValue(currentMob, true); actors.removeValue(currentMob, true);
changes.deleteObject(currentMob.getId()); changes.deleteObject(currentMob.getId());
@@ -615,14 +613,15 @@ public class MapStage extends GameStage {
} }
currentMob = null; currentMob = null;
} }
public void removeAllEnemies() { public void removeAllEnemies() {
Array<Integer> idsToRemove=new Array<>(); Array<Integer> idsToRemove = new Array<>();
for (MapActor actor : new Array.ArrayIterator<>(actors)) { for (MapActor actor : new Array.ArrayIterator<>(actors)) {
if (actor instanceof EnemySprite) { if (actor instanceof EnemySprite) {
idsToRemove.add(actor.getObjectId()); idsToRemove.add(actor.getObjectId());
} }
} }
for(Integer i:idsToRemove) deleteObject(i); for (Integer i : idsToRemove) deleteObject(i);
} }
@Override @Override
@@ -637,7 +636,7 @@ public class MapStage extends GameStage {
EnemySprite mob = (EnemySprite) actor; EnemySprite mob = (EnemySprite) actor;
currentMob = mob; currentMob = mob;
resetPosition(); resetPosition();
if(mob.dialog != null && mob.dialog.canShow()){ //This enemy has something to say. Display a dialog like if it was a DialogActor but only if dialogue is possible. if (mob.dialog != null && mob.dialog.canShow()) { //This enemy has something to say. Display a dialog like if it was a DialogActor but only if dialogue is possible.
mob.dialog.activate(); mob.dialog.activate();
} else { //Duel the enemy. } else { //Duel the enemy.
beginDuel(mob); beginDuel(mob);
@@ -645,16 +644,13 @@ public class MapStage extends GameStage {
break; break;
} else if (actor instanceof RewardSprite) { } else if (actor instanceof RewardSprite) {
Gdx.input.vibrate(50); Gdx.input.vibrate(50);
startPause(0.1f, new Runnable() { startPause(0.1f, () -> { //Switch to item pickup scene.
@Override
public void run() { //Switch to item pickup scene.
RewardSprite RS = (RewardSprite) actor; RewardSprite RS = (RewardSprite) actor;
((RewardScene) SceneType.RewardScene.instance).loadRewards(RS.getRewards(), RewardScene.Type.Loot, null); ((RewardScene) SceneType.RewardScene.instance).loadRewards(RS.getRewards(), RewardScene.Type.Loot, null);
RS.remove(); RS.remove();
actors.removeValue(RS, true); actors.removeValue(RS, true);
changes.deleteObject(RS.getId()); changes.deleteObject(RS.getId());
Forge.switchScene(SceneType.RewardScene.instance); Forge.switchScene(SceneType.RewardScene.instance);
}
}); });
break; break;
} }
@@ -662,8 +658,8 @@ public class MapStage extends GameStage {
} }
} }
public void beginDuel(EnemySprite mob){ public void beginDuel(EnemySprite mob) {
if(mob == null) return; if (mob == null) return;
currentMob = mob; currentMob = mob;
player.setAnimation(CharacterSprite.AnimationTypes.Attack); player.setAnimation(CharacterSprite.AnimationTypes.Attack);
mob.setAnimation(CharacterSprite.AnimationTypes.Attack); mob.setAnimation(CharacterSprite.AnimationTypes.Attack);
@@ -680,7 +676,7 @@ public class MapStage extends GameStage {
duelScene.initDuels(player, mob); duelScene.initDuels(player, mob);
Forge.clearTransitionScreen(); Forge.clearTransitionScreen();
startPause(0.3f, () -> { startPause(0.3f, () -> {
if(isInMap && effect != null) duelScene.setDungeonEffect(effect); if (isInMap && effect != null) duelScene.setDungeonEffect(effect);
Forge.switchScene(SceneType.DuelScene.instance); Forge.switchScene(SceneType.DuelScene.instance);
}); });
}, Forge.takeScreenshot(), true, false)); }, Forge.takeScreenshot(), true, false));
@@ -700,15 +696,16 @@ public class MapStage extends GameStage {
public void showDialog() { public void showDialog() {
dialog.show(dialogStage, Actions.show()); dialog.show(dialogStage, Actions.show());
dialog.setPosition((dialogStage.getWidth() - dialog.getWidth()) / 2, (dialogStage.getHeight() - dialog.getHeight()) / 2); dialog.setPosition((dialogStage.getWidth() - dialog.getWidth()) / 2, (dialogStage.getHeight() - dialog.getHeight()) / 2);
dialogOnlyInput=true; dialogOnlyInput = true;
} }
public void hideDialog() { public void hideDialog() {
dialog.hide(Actions.sequence(Actions.sizeTo(dialog.getOriginX(), dialog.getOriginY(), 0.3f), Actions.hide())); dialog.hide(Actions.sequence(Actions.sizeTo(dialog.getOriginX(), dialog.getOriginY(), 0.3f), Actions.hide()));
dialogOnlyInput=false; dialogOnlyInput = false;
} }
public void setDialogStage(Stage dialogStage) { public void setDialogStage(Stage dialogStage) {
this.dialogStage=dialogStage; this.dialogStage = dialogStage;
} }
public void resetPosition() { public void resetPosition() {
@@ -716,22 +713,28 @@ public class MapStage extends GameStage {
stop(); stop();
} }
public void setQuestFlag(String key, int value){ changes.getMapFlags().put(key, (byte) value); } public void setQuestFlag(String key, int value) {
public void advanceQuestFlag(String key){ changes.getMapFlags().put(key, (byte) value);
}
public void advanceQuestFlag(String key) {
Map<String, Byte> C = changes.getMapFlags(); Map<String, Byte> C = changes.getMapFlags();
if(C.get(key) != null){ if (C.get(key) != null) {
C.put(key, (byte) (C.get(key) + 1)); C.put(key, (byte) (C.get(key) + 1));
} else { } else {
C.put(key, (byte) 1); C.put(key, (byte) 1);
} }
} }
public boolean checkQuestFlag(String key){
public boolean checkQuestFlag(String key) {
return changes.getMapFlags().get(key) != null; return changes.getMapFlags().get(key) != null;
} }
public int getQuestFlag(String key){
public int getQuestFlag(String key) {
return (int) changes.getMapFlags().getOrDefault(key, (byte) 0); return (int) changes.getMapFlags().getOrDefault(key, (byte) 0);
} }
public void resetQuestFlags(){
public void resetQuestFlags() {
changes.getMapFlags().clear(); changes.getMapFlags().clear();
} }
} }

View File

@@ -281,7 +281,7 @@ public class WorldStage extends GameStage implements SaveFileContent {
} }
setBounds(WorldSave.getCurrentSave().getWorld().getWidthInPixels(), WorldSave.getCurrentSave().getWorld().getHeightInPixels()); setBounds(WorldSave.getCurrentSave().getWorld().getWidthInPixels(), WorldSave.getCurrentSave().getWorld().getHeightInPixels());
if (WorldSave.getCurrentSave().getPlayer().hasAnnounceFantasy()) { if (WorldSave.getCurrentSave().getPlayer().hasAnnounceFantasy()) {
MapStage.getInstance().showDeckAwardDialog("Chaos Mode!\n"+ WorldSave.getCurrentSave().getPlayer().getName()+ "'s Deck: "+ MapStage.getInstance().showDeckAwardDialog("{BLINK=WHITE;RED}Chaos Mode!{ENDBLINK}\n"+ WorldSave.getCurrentSave().getPlayer().getName()+ "'s Deck: "+
WorldSave.getCurrentSave().getPlayer().getSelectedDeck().getName()+ WorldSave.getCurrentSave().getPlayer().getSelectedDeck().getName()+
"\nEnemy will use Preconstructed or Random Generated Decks. Genetic AI Decks will be available to some enemies on Hard difficulty.", WorldSave.getCurrentSave().getPlayer().getSelectedDeck()); "\nEnemy will use Preconstructed or Random Generated Decks. Genetic AI Decks will be available to some enemies on Hard difficulty.", WorldSave.getCurrentSave().getPlayer().getSelectedDeck());
WorldSave.getCurrentSave().getPlayer().clearAnnounceFantasy(); WorldSave.getCurrentSave().getPlayer().clearAnnounceFantasy();

View File

@@ -11,6 +11,7 @@ import com.badlogic.gdx.scenes.scene2d.ui.*;
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; 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.Align; import com.badlogic.gdx.utils.Align;
import com.github.tommyettinger.textra.TypingLabel;
import forge.Forge; import forge.Forge;
import java.util.function.Function; import java.util.function.Function;
@@ -155,6 +156,11 @@ public class Controls {
return ret; return ret;
} }
public static TypingLabel newTypingLabel(String name) {
TypingLabel ret = new TypingLabel(name, GetSkin());
return ret;
}
public static Dialog newDialog(String title) { public static Dialog newDialog(String title) {
Dialog ret = new Dialog(title, GetSkin()); Dialog ret = new Dialog(title, GetSkin());
ret.setMovable(false); ret.setMovable(false);