AdventureEditor: added editors

This commit is contained in:
Grimm
2022-06-10 23:25:45 +02:00
parent d2338261fd
commit cdd72d138b
15 changed files with 699 additions and 135 deletions

View File

@@ -17,7 +17,7 @@
</repository> </repository>
</repositories> </repositories>
<build> <build>
<sourceDirectory>src</sourceDirectory> <sourceDirectory>src/main/java</sourceDirectory>
<resources> <resources>
<resource> <resource>
<directory>${project.basedir}</directory> <directory>${project.basedir}</directory>

View File

@@ -0,0 +1,122 @@
package forge.adventure.editor;
import forge.adventure.data.BiomeData;
import javax.swing.*;
import java.awt.*;
import java.util.Arrays;
public class BiomeEdit extends JComponent {
BiomeData currentData;
public JSpinner startPointX= new JSpinner(new SpinnerNumberModel(0.0f, 0.f, 1f, 0.1f));
public JSpinner startPointY= new JSpinner(new SpinnerNumberModel(0.0f, 0.f, 1f, 0.1f));
public JSpinner noiseWeight= new JSpinner(new SpinnerNumberModel(0.0f, 0.f, 1f, 0.1f));
public JSpinner distWeight= new JSpinner(new SpinnerNumberModel(0.0f, 0.f, 1f, 0.1f));
public JTextField name=new JTextField();
public FilePicker tilesetAtlas=new FilePicker(new String[]{"atlas"});
public JTextField tilesetName=new JTextField();
public JSpinner width= new JSpinner(new SpinnerNumberModel(0.0f, 0.f, 1f, 0.1f));
public JSpinner height= new JSpinner(new SpinnerNumberModel(0.0f, 0.f, 1f, 0.1f));
public JTextField color=new JTextField();
public TextListEdit spriteNames =new TextListEdit();
public TextListEdit enemies =new TextListEdit();
public TextListEdit pointsOfInterest =new TextListEdit();
public TerrainsEditor terrain =new TerrainsEditor();
private boolean updating=false;
public BiomeEdit()
{
JComponent center=new JComponent() { };
center.setLayout(new GridLayout(14,2));
center.add(new JLabel("startPointX:")); center.add(startPointX);
center.add(new JLabel("startPointY:")); center.add(startPointY);
center.add(new JLabel("noiseWeight:")); center.add(noiseWeight);
center.add(new JLabel("distWeight:")); center.add(distWeight);
center.add(new JLabel("name:")); center.add(name);
center.add(new JLabel("tilesetAtlas:")); center.add(tilesetAtlas);
center.add(new JLabel("tilesetName:")); center.add(tilesetName);
center.add(new JLabel("width:")); center.add(width);
center.add(new JLabel("height:")); center.add(height);
center.add(new JLabel("spriteNames:")); center.add(spriteNames);
center.add(new JLabel("enemies:")); center.add(enemies);
center.add(new JLabel("pointsOfInterest:")); center.add(pointsOfInterest);
center.add(new JLabel("color:")); center.add(color);
center.add(new JLabel("terrain:")); center.add(terrain);
BorderLayout layout=new BorderLayout();
setLayout(layout);
add(center,BorderLayout.PAGE_START);
add(terrain,BorderLayout.CENTER);
name.getDocument().addDocumentListener(new DocumentChangeListener(() -> BiomeEdit.this.updateTerrain()));
tilesetName.getDocument().addDocumentListener(new DocumentChangeListener(() -> BiomeEdit.this.updateTerrain()));
color.getDocument().addDocumentListener(new DocumentChangeListener(() -> BiomeEdit.this.updateTerrain()));
spriteNames.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(() -> BiomeEdit.this.updateTerrain()));
enemies.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(() -> BiomeEdit.this.updateTerrain()));
terrain.addChangeListener(e -> BiomeEdit.this.updateTerrain());
startPointX.addChangeListener(e -> BiomeEdit.this.updateTerrain());
startPointY.addChangeListener(e -> BiomeEdit.this.updateTerrain());
noiseWeight.addChangeListener(e -> BiomeEdit.this.updateTerrain());
distWeight.addChangeListener(e -> BiomeEdit.this.updateTerrain());
tilesetAtlas.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(() -> BiomeEdit.this.updateTerrain()));
width.addChangeListener(e -> BiomeEdit.this.updateTerrain());
height.addChangeListener(e -> BiomeEdit.this.updateTerrain());
refresh();
}
private void updateTerrain() {
if(currentData==null||updating)
return;
currentData.startPointX = (Float) startPointX.getValue();
currentData.startPointY = (Float) startPointY.getValue();
currentData.noiseWeight = (Float) noiseWeight.getValue();
currentData.distWeight = (Float)distWeight.getValue();
currentData.name = name.getText();
currentData.tilesetAtlas = tilesetAtlas.edit.getText();
currentData.tilesetName = tilesetName.getName();
currentData.terrain = terrain.getBiomeTerrainData();
currentData.width = (Float) width.getValue();
currentData.height = (Float) height.getValue();
currentData.color = color.getText();
currentData.spriteNames = spriteNames.getList();
currentData.enemies = Arrays.asList(enemies.getList());
currentData.pointsOfInterest = Arrays.asList(pointsOfInterest.getList());
}
public void setCurrentBiome(BiomeData data)
{
currentData=data;
refresh();
}
private void refresh() {
setEnabled(currentData!=null);
if(currentData==null)
{
return;
}
updating=true;
startPointX.setValue(currentData.startPointX);
startPointY.setValue(currentData.startPointY);
noiseWeight.setValue(currentData.noiseWeight);
distWeight.setValue(currentData.distWeight);
name.setText(currentData.name);
tilesetAtlas.edit.setText( currentData.tilesetAtlas);
tilesetName.setText(currentData.tilesetName);
terrain.setTerrains(currentData.terrain);
width.setValue(currentData.width);
height.setValue(currentData.height);
color.setText(currentData.color);
spriteNames.setText(currentData.spriteNames);
enemies.setText(currentData.enemies);
color.setText(currentData.color);
pointsOfInterest.setText(currentData.pointsOfInterest);
updating=false;
}
}

View File

@@ -0,0 +1,14 @@
package forge.adventure.editor;
import forge.adventure.data.BiomeTerrainData;
import javax.swing.*;
import javax.swing.event.ChangeListener;
public class BiomeTerrainEdit extends JComponent {
public void setCurrentTerrain(BiomeTerrainData biomeTerrainData) {
}
public void addChangeListener(ChangeListener listener) {
}
}

View File

@@ -10,8 +10,6 @@ import java.awt.*;
*/ */
public class ItemEdit extends JComponent { public class ItemEdit extends JComponent {
ItemData currentData; ItemData currentData;
JTextField nameField=new JTextField(); JTextField nameField=new JTextField();
JTextField equipmentSlot=new JTextField(); JTextField equipmentSlot=new JTextField();
JTextField iconName=new JTextField(); JTextField iconName=new JTextField();
@@ -39,6 +37,7 @@ public class ItemEdit extends JComponent {
add(parameters); add(parameters);
add(effect); add(effect);
add(new Box.Filler(new Dimension(0,0),new Dimension(0,Integer.MAX_VALUE),new Dimension(0,Integer.MAX_VALUE)));
nameField.getDocument().addDocumentListener(new DocumentChangeListener(() -> ItemEdit.this.updateItem())); nameField.getDocument().addDocumentListener(new DocumentChangeListener(() -> ItemEdit.this.updateItem()));
equipmentSlot.getDocument().addDocumentListener(new DocumentChangeListener(() -> ItemEdit.this.updateItem())); equipmentSlot.getDocument().addDocumentListener(new DocumentChangeListener(() -> ItemEdit.this.updateItem()));

View File

@@ -0,0 +1,88 @@
package forge.adventure.editor;
import forge.adventure.data.PointOfInterestData;
import javax.swing.*;
import java.awt.*;
public class PointOfInterestEdit extends JComponent {
PointOfInterestData currentData;
JTextField name = new JTextField();
JTextField type = new JTextField();
JSpinner count = new JSpinner(new SpinnerNumberModel(0, 0, 1000, 1));
FilePicker spriteAtlas = new FilePicker(new String[]{"atlas"});
JTextField sprite = new JTextField();
FilePicker map = new FilePicker(new String[]{"tmx"});
JSpinner radiusFactor= new JSpinner(new SpinnerNumberModel(0.0f, 0.0f, 2.0f, 0.1f));
private boolean updating=false;
public PointOfInterestEdit()
{
setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));
JPanel parameters=new JPanel();
parameters.setBorder(BorderFactory.createTitledBorder("Parameter"));
parameters.setLayout(new GridLayout(7,2)) ;
parameters.add(new JLabel("Name:")); parameters.add(name);
parameters.add(new JLabel("Type:")); parameters.add(type);
parameters.add(new JLabel("Count:")); parameters.add(count);
parameters.add(new JLabel("Sprite atlas:")); parameters.add(spriteAtlas);
parameters.add(new JLabel("Sprite:")); parameters.add(sprite);
parameters.add(new JLabel("Map:")); parameters.add(map);
parameters.add(new JLabel("Radius factor:")); parameters.add(radiusFactor);
add(parameters);
add(new Box.Filler(new Dimension(0,0),new Dimension(0,Integer.MAX_VALUE),new Dimension(0,Integer.MAX_VALUE)));
name.getDocument().addDocumentListener(new DocumentChangeListener(() -> PointOfInterestEdit.this.updateItem()));
type.getDocument().addDocumentListener(new DocumentChangeListener(() -> PointOfInterestEdit.this.updateItem()));
count.addChangeListener(e -> PointOfInterestEdit.this.updateItem());
spriteAtlas.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(() -> PointOfInterestEdit.this.updateItem()));
sprite.getDocument().addDocumentListener(new DocumentChangeListener(() -> PointOfInterestEdit.this.updateItem()));
map.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(() -> PointOfInterestEdit.this.updateItem()));
radiusFactor.addChangeListener(e -> PointOfInterestEdit.this.updateItem());
refresh();
}
private void updateItem() {
if(currentData==null||updating)
return;
currentData.name=name.getText();
currentData.type= type.getText();
currentData.count= ((Integer) count.getValue()).intValue();
currentData.spriteAtlas=spriteAtlas.getEdit().getText();
currentData.sprite=sprite.getText();
currentData.map=map.getEdit().getText();
currentData.radiusFactor=((Float) radiusFactor.getValue()).floatValue();
}
public void setCurrent(PointOfInterestData data)
{
currentData=data;
refresh();
}
private void refresh() {
setEnabled(currentData!=null);
if(currentData==null)
{
return;
}
updating=true;
name.setText(currentData.name);
type.setText(currentData.type);
count.setValue(currentData.count);
spriteAtlas.getEdit().setText(currentData.spriteAtlas);
sprite.setText(currentData.sprite);
map.getEdit().setText(currentData.map);
radiusFactor.setValue(currentData.radiusFactor);
updating=false;
}
}

View File

@@ -1,6 +1,131 @@
package forge.adventure.editor; package forge.adventure.editor;
import java.awt.*; import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.Json;
import com.badlogic.gdx.utils.JsonWriter;
import forge.adventure.data.PointOfInterestData;
import forge.adventure.util.Config;
import forge.adventure.util.Paths;
public class PointOfInterestEditor extends Component { import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionListener;
import java.util.HashMap;
public class PointOfInterestEditor extends JComponent {
DefaultListModel<PointOfInterestData> model = new DefaultListModel<>();
JList<PointOfInterestData> list = new JList<>(model);
JToolBar toolBar = new JToolBar("toolbar");
PointOfInterestEdit edit=new PointOfInterestEdit();
static HashMap<String,SwingAtlas> atlas=new HashMap<>();
public class PointOfInterestRenderer extends DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(
JList list, Object value, int index,
boolean isSelected, boolean cellHasFocus) {
JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if(!(value instanceof PointOfInterestData))
return label;
PointOfInterestData poi=(PointOfInterestData) value;
// Get the renderer component from parent class
label.setText(poi.name);
if(!atlas.containsKey(poi.spriteAtlas))
atlas.put(poi.spriteAtlas,new SwingAtlas(Config.instance().getFile(poi.spriteAtlas)));
SwingAtlas poiAtlas = atlas.get(poi.spriteAtlas);
if(poiAtlas.has(poi.sprite))
label.setIcon(poiAtlas.get(poi.sprite));
else
{
ImageIcon img=poiAtlas.getAny();
if(img!=null)
label.setIcon(img);
}
return label;
}
}
public void addButton(String name, ActionListener action)
{
JButton newButton=new JButton(name);
newButton.addActionListener(action);
toolBar.add(newButton);
}
public PointOfInterestEditor()
{
list.setCellRenderer(new PointOfInterestEditor.PointOfInterestRenderer());
list.addListSelectionListener(e -> PointOfInterestEditor.this.updateEdit());
addButton("add", e -> PointOfInterestEditor.this.addItem());
addButton("remove", e -> PointOfInterestEditor.this.remove());
addButton("copy", e -> PointOfInterestEditor.this.copy());
addButton("load", e -> PointOfInterestEditor.this.load());
addButton("save", e -> PointOfInterestEditor.this.save());
BorderLayout layout=new BorderLayout();
setLayout(layout);
add(new JScrollPane(list), BorderLayout.LINE_START);
add(toolBar, BorderLayout.PAGE_START);
add(edit,BorderLayout.CENTER);
load();
}
private void copy() {
int selected=list.getSelectedIndex();
if(selected<0)
return;
PointOfInterestData data=new PointOfInterestData(model.get(selected));
model.add(model.size(),data);
}
private void updateEdit() {
int selected=list.getSelectedIndex();
if(selected<0)
return;
edit.setCurrent(model.get(selected));
}
void save()
{
Array<PointOfInterestData> allEnemies=new Array<>();
for(int i=0;i<model.getSize();i++)
allEnemies.add(model.get(i));
Json json = new Json(JsonWriter.OutputType.json);
FileHandle handle = Config.instance().getFile(Paths.POINTS_OF_INTEREST);
handle.writeString(json.prettyPrint(json.toJson(allEnemies,Array.class, PointOfInterestData.class)),false);
}
void load()
{
model.clear();
Array<PointOfInterestData> allEnemies=new Array<>();
Json json = new Json();
FileHandle handle = Config.instance().getFile(Paths.POINTS_OF_INTEREST);
if (handle.exists())
{
Array readEnemies=json.fromJson(Array.class, PointOfInterestData.class, handle);
allEnemies = readEnemies;
}
for (int i=0;i<allEnemies.size;i++) {
model.add(i,allEnemies.get(i));
}
}
void addItem()
{
PointOfInterestData data=new PointOfInterestData();
data.name="PoI "+model.getSize();
model.add(model.size(),data);
}
void remove()
{
int selected=list.getSelectedIndex();
if(selected<0)
return;
model.remove(selected);
}
} }

View File

@@ -8,8 +8,6 @@ import javax.swing.*;
import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener; import javax.swing.event.ChangeListener;
import java.awt.*; import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays; import java.util.Arrays;
/** /**
@@ -58,102 +56,22 @@ public class RewardEdit extends JComponent {
add(new JLabel("cardText:")); add(cardText); add(new JLabel("cardText:")); add(cardText);
typeField.addActionListener((new ActionListener() { typeField.addActionListener((e -> RewardEdit.this.updateReward()));
@Override probability.addChangeListener(e -> RewardEdit.this.updateReward());
public void actionPerformed(ActionEvent e) { count.addChangeListener(e -> RewardEdit.this.updateReward());
RewardEdit.this.updateReward(); addMaxCount.addChangeListener(e -> RewardEdit.this.updateReward());
} cardName.getDocument().addDocumentListener(new DocumentChangeListener(() -> RewardEdit.this.updateReward()));
})); itemName.getDocument().addDocumentListener(new DocumentChangeListener(() -> RewardEdit.this.updateReward()));
probability.addChangeListener(new ChangeListener() { editions.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(() -> RewardEdit.this.updateReward()));
@Override colors.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(() -> RewardEdit.this.updateReward()));
public void stateChanged(ChangeEvent e) { rarity.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(() -> RewardEdit.this.updateReward()));
RewardEdit.this.updateReward(); subTypes.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(() -> RewardEdit.this.updateReward()));
} cardTypes.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(() -> RewardEdit.this.updateReward()));
}); superTypes.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(() -> RewardEdit.this.updateReward()));
count.addChangeListener(new ChangeListener() { manaCosts.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(() -> RewardEdit.this.updateReward()));
@Override keyWords.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(() -> RewardEdit.this.updateReward()));
public void stateChanged(ChangeEvent e) { colorType.addActionListener((e -> RewardEdit.this.updateReward()));
RewardEdit.this.updateReward(); cardText.getDocument().addDocumentListener(new DocumentChangeListener(() -> RewardEdit.this.updateReward()));
}
});
addMaxCount.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
RewardEdit.this.updateReward();
}
});
cardName.getDocument().addDocumentListener(new DocumentChangeListener(new Runnable() {
@Override
public void run() {
RewardEdit.this.updateReward();
}
}));
itemName.getDocument().addDocumentListener(new DocumentChangeListener(new Runnable() {
@Override
public void run() {
RewardEdit.this.updateReward();
}
}));
editions.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(new Runnable() {
@Override
public void run() {
RewardEdit.this.updateReward();
}
}));
colors.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(new Runnable() {
@Override
public void run() {
RewardEdit.this.updateReward();
}
}));
rarity.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(new Runnable() {
@Override
public void run() {
RewardEdit.this.updateReward();
}
}));
subTypes.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(new Runnable() {
@Override
public void run() {
RewardEdit.this.updateReward();
}
}));
cardTypes.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(new Runnable() {
@Override
public void run() {
RewardEdit.this.updateReward();
}
}));
superTypes.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(new Runnable() {
@Override
public void run() {
RewardEdit.this.updateReward();
}
}));
manaCosts.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(new Runnable() {
@Override
public void run() {
RewardEdit.this.updateReward();
}
}));
keyWords.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(new Runnable() {
@Override
public void run() {
RewardEdit.this.updateReward();
}
}));
colorType.addActionListener((new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
RewardEdit.this.updateReward();
}
}));
cardText.getDocument().addDocumentListener(new DocumentChangeListener(new Runnable() {
@Override
public void run() {
RewardEdit.this.updateReward();
}
}));
} }

View File

@@ -5,10 +5,7 @@ import forge.adventure.data.RewardData;
import javax.swing.*; import javax.swing.*;
import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener; import javax.swing.event.ChangeListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*; import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
/** /**
@@ -59,30 +56,10 @@ public class RewardsEditor extends JComponent{
{ {
list.setCellRenderer(new RewardDataRenderer()); list.setCellRenderer(new RewardDataRenderer());
list.addListSelectionListener(new ListSelectionListener() { list.addListSelectionListener(e -> RewardsEditor.this.updateEdit());
@Override addButton("add", e -> RewardsEditor.this.addReward());
public void valueChanged(ListSelectionEvent e) { addButton("remove", e -> RewardsEditor.this.remove());
RewardsEditor.this.updateEdit(); addButton("copy", e -> RewardsEditor.this.copy());
}
});
addButton("add", new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
RewardsEditor.this.addReward();
}
});
addButton("remove", new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
RewardsEditor.this.remove();
}
});
addButton("copy", new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
RewardsEditor.this.copy();
}
});
BorderLayout layout=new BorderLayout(); BorderLayout layout=new BorderLayout();
setLayout(layout); setLayout(layout);
add(list, BorderLayout.LINE_START); add(list, BorderLayout.LINE_START);

View File

@@ -0,0 +1,138 @@
package forge.adventure.editor;
import forge.adventure.data.BiomeTerrainData;
import forge.adventure.data.RewardData;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.ActionListener;
/**
* Editor class to edit configuration, maybe moved or removed
*/
public class TerrainsEditor extends JComponent{
DefaultListModel<BiomeTerrainData> model = new DefaultListModel<>();
JList<BiomeTerrainData> list = new JList<>(model);
JToolBar toolBar = new JToolBar("toolbar");
BiomeTerrainEdit edit=new BiomeTerrainEdit();
public class TerrainDataRenderer extends DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(
JList list, Object value, int index,
boolean isSelected, boolean cellHasFocus) {
JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if(!(value instanceof RewardData))
return label;
RewardData reward=(RewardData) value;
StringBuilder builder=new StringBuilder();
if(reward.type==null||reward.type.isEmpty())
builder.append("Terrain");
else
builder.append(reward.type);
builder.append(" ");
builder.append(reward.count);
if(reward.addMaxCount>0)
{
builder.append("-");
builder.append(reward.count+reward.addMaxCount);
}
label.setText(builder.toString());
return label;
}
}
public void addButton(String name, ActionListener action)
{
JButton newButton=new JButton(name);
newButton.addActionListener(action);
toolBar.add(newButton);
}
public TerrainsEditor()
{
list.setCellRenderer(new TerrainDataRenderer());
list.addListSelectionListener(e -> TerrainsEditor.this.updateEdit());
addButton("add", e -> TerrainsEditor.this.addReward());
addButton("remove", e -> TerrainsEditor.this.remove());
addButton("copy", e -> TerrainsEditor.this.copy());
BorderLayout layout=new BorderLayout();
setLayout(layout);
add(list, BorderLayout.LINE_START);
add(toolBar, BorderLayout.PAGE_START);
add(edit,BorderLayout.CENTER);
edit.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
emitChanged();
}
});
}
protected void emitChanged() {
ChangeListener[] listeners = listenerList.getListeners(ChangeListener.class);
if (listeners != null && listeners.length > 0) {
ChangeEvent evt = new ChangeEvent(this);
for (ChangeListener listener : listeners) {
listener.stateChanged(evt);
}
}
}
private void copy() {
int selected=list.getSelectedIndex();
if(selected<0)
return;
BiomeTerrainData data=new BiomeTerrainData(model.get(selected));
model.add(model.size(),data);
}
private void updateEdit() {
int selected=list.getSelectedIndex();
if(selected<0)
return;
edit.setCurrentTerrain(model.get(selected));
}
void addReward()
{
BiomeTerrainData data=new BiomeTerrainData();
model.add(model.size(),data);
}
void remove()
{
int selected=list.getSelectedIndex();
if(selected<0)
return;
model.remove(selected);
}
public void setTerrains(BiomeTerrainData[] terrain) {
model.clear();
if(terrain==null)
return;
for (int i=0;i<terrain.length;i++) {
model.add(i,terrain[i]);
}
}
public BiomeTerrainData[] getBiomeTerrainData() {
BiomeTerrainData[] rewards= new BiomeTerrainData[model.getSize()];
for(int i=0;i<model.getSize();i++)
{
rewards[i]=model.get(i);
}
return rewards;
}
public void addChangeListener(ChangeListener listener) {
listenerList.add(ChangeListener.class, listener);
}
}

View File

@@ -7,6 +7,7 @@ import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.List;
/** /**
* Editor class to edit configuration, maybe moved or removed * Editor class to edit configuration, maybe moved or removed
@@ -59,6 +60,12 @@ public class TextListEdit extends Box {
} }
} }
public void setText(List<String> itemNames) {
if(itemNames==null)
edit.setText("");
else
edit.setText(String.join(";",itemNames));
}
public void setText(String[] itemName) { public void setText(String[] itemName) {
if(itemName==null) if(itemName==null)
edit.setText(""); edit.setText("");

View File

@@ -1,6 +1,153 @@
package forge.adventure.editor; package forge.adventure.editor;
import java.awt.*; import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.Json;
import com.badlogic.gdx.utils.JsonWriter;
import forge.adventure.data.BiomeData;
import forge.adventure.data.WorldData;
import forge.adventure.util.Config;
import forge.adventure.util.Paths;
public class WorldEditor extends Component { import javax.swing.*;
import java.awt.*;
import java.util.HashMap;
public class WorldEditor extends JComponent {
WorldData currentData;
JSpinner width= new JSpinner(new SpinnerNumberModel(0, 0, 100000, 1));
JSpinner height= new JSpinner(new SpinnerNumberModel(0, 0, 100000, 1));
JSpinner playerStartPosX= new JSpinner(new SpinnerNumberModel(0, 0, 1, .1));
JSpinner playerStartPosY= new JSpinner(new SpinnerNumberModel(0, 0, 1, .1));
JSpinner noiseZoomBiome= new JSpinner(new SpinnerNumberModel(0, 0, 1000f, 1f));
JSpinner tileSize= new JSpinner(new SpinnerNumberModel(0, 0, 100000, 1));
JTextField biomesSprites = new JTextField();
JSpinner maxRoadDistance = new JSpinner(new SpinnerNumberModel(0, 0, 100000f, 1f));
TextListEdit biomesNames = new TextListEdit();
DefaultListModel<BiomeData> model = new DefaultListModel<>();
JList<BiomeData> list = new JList<>(model);
BiomeEdit edit=new BiomeEdit();
JTabbedPane tabs =new JTabbedPane();
static HashMap<String,SwingAtlas> atlas=new HashMap<>();
public class BiomeDataRenderer extends DefaultListCellRenderer {
@Override
public Component getListCellRendererComponent(
JList list, Object value, int index,
boolean isSelected, boolean cellHasFocus) {
JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
if(!(value instanceof BiomeData))
return label;
BiomeData biome=(BiomeData) value;
// Get the renderer component from parent class
label.setText(biome.name);
if(!atlas.containsKey(biome.tilesetAtlas))
atlas.put(biome.tilesetAtlas,new SwingAtlas(Config.instance().getFile(biome.tilesetAtlas)));
SwingAtlas poiAtlas = atlas.get(biome.tilesetAtlas);
if(poiAtlas.has(biome.tilesetName))
label.setIcon(poiAtlas.get(biome.tilesetName));
else
{
ImageIcon img=poiAtlas.getAny();
if(img!=null)
label.setIcon(img);
}
return label;
}
}
public WorldEditor() {
list.setCellRenderer(new BiomeDataRenderer());
BorderLayout layout = new BorderLayout();
setLayout(layout);
add(tabs);
JPanel worldPanel=new JPanel();
JPanel biomeData=new JPanel();
tabs.addTab("BiomeData", biomeData);
tabs.addTab("WorldData", worldPanel);
JPanel worldData=new JPanel();
worldData.setLayout(new GridLayout(9,2)) ;
worldData.add(new JLabel("width:")); worldData.add(width);
worldData.add(new JLabel("height:")); worldData.add(height);
worldData.add(new JLabel("playerStartPosX:")); worldData.add(playerStartPosX);
worldData.add(new JLabel("playerStartPosY:")); worldData.add(playerStartPosY);
worldData.add(new JLabel("noiseZoomBiome:")); worldData.add(noiseZoomBiome);
worldData.add(new JLabel("tileSize:")); worldData.add(tileSize);
worldData.add(new JLabel("biomesSprites:")); worldData.add(biomesSprites);
worldData.add(new JLabel("maxRoadDistance:")); worldData.add(maxRoadDistance);
worldData.add(new JLabel("biomesNames:")); worldData.add(biomesNames);
worldPanel.setLayout(new BoxLayout(worldPanel,BoxLayout.Y_AXIS));
worldPanel.add(worldData);
worldPanel.add(new Box.Filler(new Dimension(0,0),new Dimension(0,Integer.MAX_VALUE),new Dimension(0,Integer.MAX_VALUE)));
biomeData.setLayout(new GridLayout(1,2)) ;
biomeData.add(list); biomeData.add(edit);
load();
JToolBar toolBar = new JToolBar("toolbar");
add(toolBar, BorderLayout.PAGE_START);
JButton newButton=new JButton("save");
newButton.addActionListener(e -> WorldEditor.this.save());
toolBar.add(newButton);
newButton=new JButton("load");
newButton.addActionListener(e -> WorldEditor.this.load());
toolBar.add(newButton);
}
void save()
{
Json json = new Json(JsonWriter.OutputType.json);
FileHandle handle = Config.instance().getFile(Paths.WORLD);
handle.writeString(json.prettyPrint(json.toJson(currentData,Array.class, WorldData.class)),false);
}
void load()
{
model.clear();
Json json = new Json();
FileHandle handle = Config.instance().getFile(Paths.WORLD);
if (handle.exists())
{
currentData=json.fromJson(WorldData.class, WorldData.class, handle);
}
update();
}
private void update() {
width.setValue(currentData.width);
height.setValue(currentData.height);
playerStartPosX.setValue(currentData.playerStartPosX);
playerStartPosY.setValue(currentData.playerStartPosY);
noiseZoomBiome.setValue(currentData.noiseZoomBiome);
tileSize.setValue(currentData.tileSize);
biomesSprites.setText(currentData.biomesSprites);
maxRoadDistance.setValue(currentData.maxRoadDistance);
biomesNames.setText(currentData.biomesNames);
for(String path:currentData.biomesNames)
{
Json json = new Json();
FileHandle handle = Config.instance().getFile(path);
if (handle.exists())
{
BiomeData data=json.fromJson(BiomeData.class, BiomeData.class, handle);
model.addElement(data);
}
}
}
} }

View File

@@ -15,7 +15,6 @@ import java.util.Random;
* contains the information for the biomes * contains the information for the biomes
*/ */
public class BiomeData implements Serializable { public class BiomeData implements Serializable {
private final Random rand = MyRandom.getRandom();
public float startPointX; public float startPointX;
public float startPointY; public float startPointY;
public float noiseWeight; public float noiseWeight;
@@ -35,6 +34,7 @@ public class BiomeData implements Serializable {
private ArrayList<EnemyData> enemyList; private ArrayList<EnemyData> enemyList;
private ArrayList<PointOfInterestData> pointOfInterestList; private ArrayList<PointOfInterestData> pointOfInterestList;
private final Random rand = MyRandom.getRandom();
public Color GetColor() { public Color GetColor() {
return Color.valueOf(color); return Color.valueOf(color);
} }

View File

@@ -16,4 +16,16 @@ public class BiomeTerrainData {
// factor for the noise resolution // factor for the noise resolution
public float resolution; public float resolution;
public BiomeTerrainData()
{
}
public BiomeTerrainData(BiomeTerrainData other)
{
spriteName=other.spriteName;
min=other.min;
max=other.max;
resolution=other.resolution;
}
} }

View File

@@ -42,4 +42,18 @@ public class PointOfInterestData {
} }
return null; return null;
} }
public PointOfInterestData()
{
}
public PointOfInterestData(PointOfInterestData other)
{
name=other.name;
type=other.type;
count=other.count;
spriteAtlas=other.spriteAtlas;
sprite=other.sprite;
map=other.map;
radiusFactor=other.radiusFactor;
}
} }

View File

@@ -17,19 +17,22 @@ import java.util.List;
*/ */
public class WorldData implements Serializable { public class WorldData implements Serializable {
static Array<EnemyData> allEnemies;
public int width; public int width;
public int height; public int height;
public float playerStartPosX; public float playerStartPosX;
public float playerStartPosY; public float playerStartPosY;
public float noiseZoomBiome; public float noiseZoomBiome;
public int tileSize; public int tileSize;
public List<String> biomesNames;
public BiomeData roadTileset; public BiomeData roadTileset;
public String biomesSprites; public String biomesSprites;
public float maxRoadDistance; public float maxRoadDistance;
public List<String> biomesNames;
private BiomeSprites sprites; private BiomeSprites sprites;
private List<BiomeData> biomes; private List<BiomeData> biomes;
private static Array<EnemyData> allEnemies;
private static Array<ShopData> shopList; private static Array<ShopData> shopList;