diff --git a/forge-adventure/pom.xml b/forge-adventure/pom.xml index d2bc0fcd175..4d81b150e02 100644 --- a/forge-adventure/pom.xml +++ b/forge-adventure/pom.xml @@ -17,7 +17,7 @@ - src + src/main/java ${project.basedir} diff --git a/forge-adventure/src/main/java/forge/adventure/editor/BiomeEdit.java b/forge-adventure/src/main/java/forge/adventure/editor/BiomeEdit.java new file mode 100644 index 00000000000..70c595437a9 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/editor/BiomeEdit.java @@ -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; + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/editor/BiomeTerrainEdit.java b/forge-adventure/src/main/java/forge/adventure/editor/BiomeTerrainEdit.java new file mode 100644 index 00000000000..24791aa585d --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/editor/BiomeTerrainEdit.java @@ -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) { + + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/editor/ItemEdit.java b/forge-adventure/src/main/java/forge/adventure/editor/ItemEdit.java index 248bd275914..26f9f30923d 100644 --- a/forge-adventure/src/main/java/forge/adventure/editor/ItemEdit.java +++ b/forge-adventure/src/main/java/forge/adventure/editor/ItemEdit.java @@ -10,8 +10,6 @@ import java.awt.*; */ public class ItemEdit extends JComponent { ItemData currentData; - - JTextField nameField=new JTextField(); JTextField equipmentSlot=new JTextField(); JTextField iconName=new JTextField(); @@ -39,6 +37,7 @@ public class ItemEdit extends JComponent { add(parameters); 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())); equipmentSlot.getDocument().addDocumentListener(new DocumentChangeListener(() -> ItemEdit.this.updateItem())); diff --git a/forge-adventure/src/main/java/forge/adventure/editor/PointOfInterestEdit.java b/forge-adventure/src/main/java/forge/adventure/editor/PointOfInterestEdit.java new file mode 100644 index 00000000000..045777feb94 --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/editor/PointOfInterestEdit.java @@ -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; + } +} diff --git a/forge-adventure/src/main/java/forge/adventure/editor/PointOfInterestEditor.java b/forge-adventure/src/main/java/forge/adventure/editor/PointOfInterestEditor.java index 83ff548e68e..4fa4b0e9209 100644 --- a/forge-adventure/src/main/java/forge/adventure/editor/PointOfInterestEditor.java +++ b/forge-adventure/src/main/java/forge/adventure/editor/PointOfInterestEditor.java @@ -1,6 +1,131 @@ 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 model = new DefaultListModel<>(); + JList list = new JList<>(model); + JToolBar toolBar = new JToolBar("toolbar"); + PointOfInterestEdit edit=new PointOfInterestEdit(); + static HashMap 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 allEnemies=new Array<>(); + for(int i=0;i 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 RewardEdit.this.updateReward())); + probability.addChangeListener(e -> RewardEdit.this.updateReward()); + count.addChangeListener(e -> 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())); + editions.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(() -> RewardEdit.this.updateReward())); + colors.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(() -> RewardEdit.this.updateReward())); + rarity.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(() -> 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())); + manaCosts.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(() -> RewardEdit.this.updateReward())); + keyWords.getEdit().getDocument().addDocumentListener(new DocumentChangeListener(() -> RewardEdit.this.updateReward())); + colorType.addActionListener((e -> RewardEdit.this.updateReward())); + cardText.getDocument().addDocumentListener(new DocumentChangeListener(() -> RewardEdit.this.updateReward())); } diff --git a/forge-adventure/src/main/java/forge/adventure/editor/RewardsEditor.java b/forge-adventure/src/main/java/forge/adventure/editor/RewardsEditor.java index a2d6cc0f617..786128f6bad 100644 --- a/forge-adventure/src/main/java/forge/adventure/editor/RewardsEditor.java +++ b/forge-adventure/src/main/java/forge/adventure/editor/RewardsEditor.java @@ -5,10 +5,7 @@ import forge.adventure.data.RewardData; import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; import java.awt.*; -import java.awt.event.ActionEvent; import java.awt.event.ActionListener; /** @@ -59,30 +56,10 @@ public class RewardsEditor extends JComponent{ { list.setCellRenderer(new RewardDataRenderer()); - list.addListSelectionListener(new ListSelectionListener() { - @Override - public void valueChanged(ListSelectionEvent e) { - RewardsEditor.this.updateEdit(); - } - }); - 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(); - } - }); + list.addListSelectionListener(e -> RewardsEditor.this.updateEdit()); + addButton("add", e -> RewardsEditor.this.addReward()); + addButton("remove", e -> RewardsEditor.this.remove()); + addButton("copy", e -> RewardsEditor.this.copy()); BorderLayout layout=new BorderLayout(); setLayout(layout); add(list, BorderLayout.LINE_START); diff --git a/forge-adventure/src/main/java/forge/adventure/editor/TerrainsEditor.java b/forge-adventure/src/main/java/forge/adventure/editor/TerrainsEditor.java new file mode 100644 index 00000000000..69a7578a13d --- /dev/null +++ b/forge-adventure/src/main/java/forge/adventure/editor/TerrainsEditor.java @@ -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 model = new DefaultListModel<>(); + JList 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 itemNames) { + if(itemNames==null) + edit.setText(""); + else + edit.setText(String.join(";",itemNames)); + } public void setText(String[] itemName) { if(itemName==null) edit.setText(""); diff --git a/forge-adventure/src/main/java/forge/adventure/editor/WorldEditor.java b/forge-adventure/src/main/java/forge/adventure/editor/WorldEditor.java index 221ac5d64ae..e1fde6621e9 100644 --- a/forge-adventure/src/main/java/forge/adventure/editor/WorldEditor.java +++ b/forge-adventure/src/main/java/forge/adventure/editor/WorldEditor.java @@ -1,6 +1,153 @@ 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 model = new DefaultListModel<>(); + JList list = new JList<>(model); + BiomeEdit edit=new BiomeEdit(); + JTabbedPane tabs =new JTabbedPane(); + static HashMap 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); + } + } + + } } diff --git a/forge-gui-mobile/src/forge/adventure/data/BiomeData.java b/forge-gui-mobile/src/forge/adventure/data/BiomeData.java index 51176c3a8b4..3aa7fb92d8f 100644 --- a/forge-gui-mobile/src/forge/adventure/data/BiomeData.java +++ b/forge-gui-mobile/src/forge/adventure/data/BiomeData.java @@ -15,7 +15,6 @@ import java.util.Random; * contains the information for the biomes */ public class BiomeData implements Serializable { - private final Random rand = MyRandom.getRandom(); public float startPointX; public float startPointY; public float noiseWeight; @@ -35,6 +34,7 @@ public class BiomeData implements Serializable { private ArrayList enemyList; private ArrayList pointOfInterestList; + private final Random rand = MyRandom.getRandom(); public Color GetColor() { return Color.valueOf(color); } diff --git a/forge-gui-mobile/src/forge/adventure/data/BiomeTerrainData.java b/forge-gui-mobile/src/forge/adventure/data/BiomeTerrainData.java index 1ccaee59ce8..19c6b39f72b 100644 --- a/forge-gui-mobile/src/forge/adventure/data/BiomeTerrainData.java +++ b/forge-gui-mobile/src/forge/adventure/data/BiomeTerrainData.java @@ -16,4 +16,16 @@ public class BiomeTerrainData { // factor for the noise resolution public float resolution; + public BiomeTerrainData() + { + + } + public BiomeTerrainData(BiomeTerrainData other) + { + spriteName=other.spriteName; + min=other.min; + max=other.max; + resolution=other.resolution; + } + } diff --git a/forge-gui-mobile/src/forge/adventure/data/PointOfInterestData.java b/forge-gui-mobile/src/forge/adventure/data/PointOfInterestData.java index 06e285a9d86..f2921e8d32a 100644 --- a/forge-gui-mobile/src/forge/adventure/data/PointOfInterestData.java +++ b/forge-gui-mobile/src/forge/adventure/data/PointOfInterestData.java @@ -42,4 +42,18 @@ public class PointOfInterestData { } 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; + } } diff --git a/forge-gui-mobile/src/forge/adventure/data/WorldData.java b/forge-gui-mobile/src/forge/adventure/data/WorldData.java index 908c857fdba..d5be45f2bc8 100644 --- a/forge-gui-mobile/src/forge/adventure/data/WorldData.java +++ b/forge-gui-mobile/src/forge/adventure/data/WorldData.java @@ -17,19 +17,22 @@ import java.util.List; */ public class WorldData implements Serializable { - static Array allEnemies; public int width; public int height; public float playerStartPosX; public float playerStartPosY; public float noiseZoomBiome; public int tileSize; - public List biomesNames; public BiomeData roadTileset; public String biomesSprites; public float maxRoadDistance; + public List biomesNames; + + private BiomeSprites sprites; private List biomes; + + private static Array allEnemies; private static Array shopList;