mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 12:18:00 +00:00
307 lines
10 KiB
Java
307 lines
10 KiB
Java
package forge.adventure.scene;
|
|
|
|
import com.badlogic.gdx.Input;
|
|
import com.badlogic.gdx.graphics.Color;
|
|
import com.badlogic.gdx.graphics.Texture;
|
|
import com.badlogic.gdx.scenes.scene2d.InputEvent;
|
|
import com.badlogic.gdx.scenes.scene2d.ui.Dialog;
|
|
import com.badlogic.gdx.scenes.scene2d.ui.Image;
|
|
import com.badlogic.gdx.scenes.scene2d.ui.Label;
|
|
import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane;
|
|
import com.badlogic.gdx.scenes.scene2d.ui.Table;
|
|
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
|
|
import com.badlogic.gdx.scenes.scene2d.ui.TextField;
|
|
import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
|
|
import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable;
|
|
import com.badlogic.gdx.utils.Align;
|
|
import com.badlogic.gdx.utils.GdxRuntimeException;
|
|
import com.badlogic.gdx.utils.IntMap;
|
|
import forge.Forge;
|
|
import forge.adventure.util.Controls;
|
|
import forge.adventure.world.WorldSave;
|
|
import forge.adventure.world.WorldSaveHeader;
|
|
import forge.screens.TransitionScreen;
|
|
|
|
import java.io.File;
|
|
import java.io.FileInputStream;
|
|
import java.io.IOException;
|
|
import java.io.ObjectInputStream;
|
|
import java.util.zip.InflaterInputStream;
|
|
|
|
/**
|
|
* Scene to load and save the game.
|
|
*/
|
|
public class SaveLoadScene extends UIScene {
|
|
private final IntMap<TextButton> buttons = new IntMap<>();
|
|
IntMap<WorldSaveHeader> previews = new IntMap<>();
|
|
Color defColor;
|
|
Table layout;
|
|
boolean save = true;
|
|
Dialog dialog;
|
|
TextField textInput;
|
|
Label header;
|
|
int currentSlot = -3, lastSelectedSlot = 0;
|
|
Image previewImage;
|
|
Image previewBorder;
|
|
TextButton saveLoadButton, back;
|
|
TextButton quickSave;
|
|
TextButton autoSave;
|
|
|
|
public SaveLoadScene() {
|
|
super(Forge.isLandscapeMode() ? "ui/save_load_mobile.json" : "ui/save_load.json");
|
|
}
|
|
|
|
|
|
private TextButton addSaveSlot(String name, int i) {
|
|
layout.add(Controls.newLabel(name)).align(Align.left).pad(4, 10, 4, 15);
|
|
TextButton button = Controls.newTextButton("...");
|
|
button.addListener(new ClickListener() {
|
|
@Override
|
|
public void clicked(InputEvent event, float x, float y) {
|
|
try {
|
|
if (!button.isDisabled())
|
|
select(i);
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
});
|
|
layout.add(button).align(Align.left).expandX();
|
|
buttons.put(i, button);
|
|
layout.row();
|
|
return button;
|
|
|
|
}
|
|
|
|
public void back() {
|
|
Forge.switchToLast();
|
|
}
|
|
|
|
public boolean select(int slot) {
|
|
currentSlot = slot;
|
|
if (slot > 0)
|
|
lastSelectedSlot = slot;
|
|
if (previews.containsKey(slot)) {
|
|
WorldSaveHeader header = previews.get(slot);
|
|
if (header.preview != null) {
|
|
previewImage.setDrawable(new TextureRegionDrawable(new Texture(header.preview)));
|
|
previewImage.layout();
|
|
previewImage.setVisible(true);
|
|
}
|
|
} else {
|
|
if (previewImage != null)
|
|
previewImage.setVisible(false);
|
|
}
|
|
for (IntMap.Entry<TextButton> butt : new IntMap.Entries<TextButton>(buttons)) {
|
|
butt.value.setColor(defColor);
|
|
}
|
|
if (buttons.containsKey(slot)) {
|
|
TextButton button = buttons.get(slot);
|
|
button.setColor(Color.RED);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public void loadSave() {
|
|
if (save) {
|
|
if (currentSlot > 0) {
|
|
//prevent NPE, allowed saveslot is 1 to 10..
|
|
textInput.setText(buttons.get(currentSlot).getText().toString());
|
|
dialog.show(stage);
|
|
stage.setKeyboardFocus(textInput);
|
|
}
|
|
} else {
|
|
if (WorldSave.load(currentSlot)) {
|
|
Forge.setTransitionScreen(new TransitionScreen(new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
Forge.switchScene(SceneType.GameScene.instance);
|
|
}
|
|
}, null, false, true));
|
|
} else {
|
|
Forge.clearTransitionScreen();
|
|
}
|
|
}
|
|
}
|
|
|
|
public boolean saveAbort() {
|
|
|
|
dialog.hide();
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public boolean keyPressed(int keycode) {
|
|
if (keycode == Input.Keys.ESCAPE || keycode == Input.Keys.BACK) {
|
|
back();
|
|
}
|
|
return true;
|
|
}
|
|
|
|
public void save() {
|
|
dialog.hide();
|
|
if (WorldSave.getCurrentSave().save(textInput.getText(), currentSlot)) {
|
|
updateFiles();
|
|
Forge.switchScene(SceneType.GameScene.instance);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
private void updateFiles() {
|
|
|
|
File f = new File(WorldSave.getSaveDir());
|
|
f.mkdirs();
|
|
File[] names = f.listFiles();
|
|
if (names == null)
|
|
throw new RuntimeException("Can not find save directory");
|
|
previews.clear();
|
|
for (File name : names) {
|
|
if (WorldSave.isSafeFile(name.getName())) {
|
|
try {
|
|
|
|
try (FileInputStream fos = new FileInputStream(name.getAbsolutePath());
|
|
InflaterInputStream inf = new InflaterInputStream(fos);
|
|
ObjectInputStream oos = new ObjectInputStream(inf)) {
|
|
|
|
|
|
int slot = WorldSave.filenameToSlot(name.getName());
|
|
WorldSaveHeader header = (WorldSaveHeader) oos.readObject();
|
|
buttons.get(slot).setText(header.name);
|
|
previews.put(slot, header);
|
|
}
|
|
|
|
} catch (ClassNotFoundException | IOException | GdxRuntimeException e) {
|
|
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
public void setSaveGame(boolean save) {
|
|
if (save) {
|
|
header.setText("Save game");
|
|
saveLoadButton.setText("Save");
|
|
} else {
|
|
header.setText("Load game");
|
|
saveLoadButton.setText("Load");
|
|
}
|
|
autoSave.setDisabled(save);
|
|
quickSave.setDisabled(save);
|
|
this.save = save;
|
|
}
|
|
|
|
@Override
|
|
public void enter() {
|
|
if (lastSelectedSlot > 0)
|
|
select(lastSelectedSlot);
|
|
else
|
|
select(-3);
|
|
updateFiles();
|
|
super.enter();
|
|
}
|
|
|
|
@Override
|
|
public void resLoaded() {
|
|
super.resLoaded();
|
|
layout = new Table();
|
|
layout.setFillParent(true);
|
|
stage.addActor(layout);
|
|
dialog = Controls.newDialog("Save");
|
|
textInput = Controls.newTextField("");
|
|
if (!Forge.isLandscapeMode()) {
|
|
dialog.getButtonTable().add(Controls.newLabel("Name your new save file.")).colspan(2).pad(2, 15, 2, 15);
|
|
dialog.getButtonTable().row();
|
|
dialog.getButtonTable().add(Controls.newLabel("Name:")).align(Align.left).pad(2, 15, 2, 2);
|
|
dialog.getButtonTable().add(textInput).fillX().expandX().padRight(15);
|
|
dialog.getButtonTable().row();
|
|
dialog.getButtonTable().add(Controls.newTextButton("Save", new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
SaveLoadScene.this.save();
|
|
}
|
|
})).align(Align.left).padLeft(15);
|
|
dialog.getButtonTable().add(Controls.newTextButton("Abort", new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
SaveLoadScene.this.saveAbort();
|
|
}
|
|
})).align(Align.right).padRight(15);
|
|
} else {
|
|
dialog.getButtonTable().add(Controls.newLabel("Name your new save file.")).colspan(2);
|
|
dialog.getButtonTable().row();
|
|
dialog.getButtonTable().add(Controls.newLabel("Name:")).align(Align.left);
|
|
dialog.getButtonTable().add(textInput).fillX().expandX();
|
|
dialog.getButtonTable().row();
|
|
dialog.getButtonTable().add(Controls.newTextButton("Save", new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
SaveLoadScene.this.save();
|
|
}
|
|
})).align(Align.left);
|
|
dialog.getButtonTable().add(Controls.newTextButton("Abort", new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
SaveLoadScene.this.saveAbort();
|
|
}
|
|
})).align(Align.right);
|
|
}
|
|
previewImage = ui.findActor("preview");
|
|
previewBorder = ui.findActor("preview_border");
|
|
header = Controls.newLabel("Save");
|
|
header.setHeight(header.getHeight() * 2);
|
|
header.setAlignment(Align.center);
|
|
layout.add(header).pad(2).colspan(4).align(Align.center).expand();
|
|
layout.row();
|
|
autoSave = addSaveSlot("Auto save", WorldSave.AUTO_SAVE_SLOT);
|
|
quickSave = addSaveSlot("Quick save", WorldSave.QUICK_SAVE_SLOT);
|
|
for (int i = 1; i < 11; i++)
|
|
addSaveSlot("Slot:" + i, i);
|
|
|
|
saveLoadButton = ui.findActor("save");
|
|
ui.onButtonPress("save", new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
SaveLoadScene.this.loadSave();
|
|
}
|
|
});
|
|
back = ui.findActor("return");
|
|
ui.onButtonPress("return", new Runnable() {
|
|
@Override
|
|
public void run() {
|
|
SaveLoadScene.this.back();
|
|
}
|
|
});
|
|
|
|
defColor = saveLoadButton.getColor();
|
|
|
|
ScrollPane scrollPane = ui.findActor("saveSlots");
|
|
scrollPane.setActor(layout);
|
|
if (!Forge.isLandscapeMode()) {
|
|
float w = Scene.GetIntendedWidth();
|
|
float sW = w - 20;
|
|
float oX = w/2 - sW/2;
|
|
float h = Scene.GetIntendedHeight();
|
|
float sH = (h - 10)/12;
|
|
scrollPane.setWidth(sW);
|
|
scrollPane.setHeight(sH*11);
|
|
scrollPane.setX(oX);
|
|
previewImage.setScale(1, 1.2f);
|
|
previewImage.setX(scrollPane.getRight()-105);
|
|
previewImage.setY(scrollPane.getTop()-71);
|
|
float bW = w - 165;
|
|
float bX = w/2 - bW/2;
|
|
back.setWidth(bW/2);
|
|
back.setHeight(20);
|
|
back.setX(bX);
|
|
saveLoadButton.setWidth(bW/2);
|
|
saveLoadButton.setHeight(20);
|
|
saveLoadButton.setX(back.getRight());
|
|
}
|
|
}
|
|
}
|