diff --git a/hacked-libtiled/tiled/core/Tile.java b/hacked-libtiled/tiled/core/Tile.java index a335a2f..c44d325 100644 --- a/hacked-libtiled/tiled/core/Tile.java +++ b/hacked-libtiled/tiled/core/Tile.java @@ -29,6 +29,7 @@ package tiled.core; import java.awt.*; +import java.awt.image.BufferedImage; import java.util.Properties; /** @@ -36,7 +37,7 @@ import java.util.Properties; */ public class Tile { - private Image image; + private BufferedImage image; private int id = -1; private Properties properties; private TileSet tileset; @@ -76,7 +77,7 @@ public class Tile * * @param i the new image of the tile */ - public void setImage(Image i) { + public void setImage(BufferedImage i) { image = i; } @@ -133,7 +134,7 @@ public class Tile * * @return Image */ - public Image getImage() { + public BufferedImage getImage() { if (tileset != null && tileset.sheet != null) return tileset.sheet.getImage(getId()); return image; } diff --git a/hacked-libtiled/tiled/core/TileSet.java b/hacked-libtiled/tiled/core/TileSet.java index bd780ad..afd99af 100644 --- a/hacked-libtiled/tiled/core/TileSet.java +++ b/hacked-libtiled/tiled/core/TileSet.java @@ -161,7 +161,7 @@ public class TileSet implements Iterable tilesPerRow = basicTileCutter.getTilesPerRow(); } - Image tileImage = cutter.getNextTile(); + BufferedImage tileImage = cutter.getNextTile(); while (tileImage != null) { Tile tile = new Tile(); tile.setImage(tileImage); @@ -220,7 +220,7 @@ public class TileSet implements Iterable tileDimensions = new Rectangle(tileCutter.getTileDimensions()); int id = 0; - Image tileImage = tileCutter.getNextTile(); + BufferedImage tileImage = tileCutter.getNextTile(); while (tileImage != null) { Tile tile = getTile(id); tile.setImage(tileImage); diff --git a/hacked-libtiled/tiled/io/TMXMapReader.java b/hacked-libtiled/tiled/io/TMXMapReader.java index bd2334a..6777e8b 100644 --- a/hacked-libtiled/tiled/io/TMXMapReader.java +++ b/hacked-libtiled/tiled/io/TMXMapReader.java @@ -31,6 +31,7 @@ package tiled.io; import java.awt.Color; import java.awt.Image; import java.awt.Rectangle; +import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileNotFoundException; @@ -223,9 +224,9 @@ public class TMXMapReader return o; } - private Image unmarshalImage(Node t, String baseDir) throws IOException + private BufferedImage unmarshalImage(Node t, String baseDir) throws IOException { - Image img = null; + BufferedImage img = null; String source = getAttributeValue(t, "source"); @@ -253,7 +254,7 @@ public class TMXMapReader // size, somehow makes drawing of the tiles a lot // faster on various systems (seen on Linux, Windows // and MacOS X). - img = img.getScaledInstance( + img = (BufferedImage) img.getScaledInstance( img.getWidth(null), img.getHeight(null), Image.SCALE_FAST); } @@ -534,7 +535,7 @@ public class TMXMapReader Node child = children.item(i); if ("image".equalsIgnoreCase(child.getNodeName())) { int id = getAttribute(child, "id", -1); - Image img = unmarshalImage(child, baseDir); + BufferedImage img = unmarshalImage(child, baseDir); tile.setImage(img); } else if ("animation".equalsIgnoreCase(child.getNodeName())) { // TODO: fill this in once TMXMapWriter is complete diff --git a/hacked-libtiled/tiled/util/BasicTileCutter.java b/hacked-libtiled/tiled/util/BasicTileCutter.java index 3ba6793..96a9f6a 100644 --- a/hacked-libtiled/tiled/util/BasicTileCutter.java +++ b/hacked-libtiled/tiled/util/BasicTileCutter.java @@ -64,7 +64,7 @@ public class BasicTileCutter implements TileCutter this.image = image; } - public Image getNextTile() { + public BufferedImage getNextTile() { if (nextY + tileHeight + tileMargin <= image.getHeight()) { BufferedImage tile = image.getSubimage(nextX, nextY, tileWidth, tileHeight); diff --git a/hacked-libtiled/tiled/util/TileCutter.java b/hacked-libtiled/tiled/util/TileCutter.java index 3fe60e7..af91f97 100644 --- a/hacked-libtiled/tiled/util/TileCutter.java +++ b/hacked-libtiled/tiled/util/TileCutter.java @@ -48,7 +48,7 @@ public interface TileCutter * @return the next tile image, or null when no more tile * images are available */ - public Image getNextTile(); + public BufferedImage getNextTile(); /** * Resets the tile cutter so that the next call to getNextTile diff --git a/hacked-libtiled/tiled/view/MapRenderer.java b/hacked-libtiled/tiled/view/MapRenderer.java index 16139e8..cd669fc 100644 --- a/hacked-libtiled/tiled/view/MapRenderer.java +++ b/hacked-libtiled/tiled/view/MapRenderer.java @@ -30,6 +30,7 @@ package tiled.view; import tiled.core.TileLayer; import java.awt.*; +import java.awt.image.BufferedImageOp; /** * An interface defining methods to render a map. @@ -50,5 +51,5 @@ public interface MapRenderer * @param g the graphics context to paint to * @param layer the layer to paint */ - public void paintTileLayer(Graphics2D g, TileLayer layer); + public void paintTileLayer(Graphics2D g, TileLayer layer, BufferedImageOp filter); } diff --git a/hacked-libtiled/tiled/view/OrthogonalRenderer.java b/hacked-libtiled/tiled/view/OrthogonalRenderer.java index d890c55..1168422 100644 --- a/hacked-libtiled/tiled/view/OrthogonalRenderer.java +++ b/hacked-libtiled/tiled/view/OrthogonalRenderer.java @@ -32,6 +32,8 @@ import tiled.core.Tile; import tiled.core.TileLayer; import java.awt.*; +import java.awt.image.BufferedImage; +import java.awt.image.BufferedImageOp; /** * The orthogonal map renderer. This is the most basic map renderer, dealing @@ -51,7 +53,7 @@ public class OrthogonalRenderer implements MapRenderer map.getHeight() * map.getTileHeight()); } - public void paintTileLayer(Graphics2D g, TileLayer layer) { + public void paintTileLayer(Graphics2D g, TileLayer layer, BufferedImageOp filter ) { final Rectangle clip = g.getClipBounds(); final int tileWidth = map.getTileWidth(); final int tileHeight = map.getTileHeight(); @@ -74,15 +76,17 @@ public class OrthogonalRenderer implements MapRenderer final Tile tile = layer.getTileAt(x, y); if (tile == null) continue; - final Image image = tile.getImage(); + final BufferedImage image = tile.getImage(); if (image == null) continue; + + g.drawImage( image, + filter, x * tileWidth, - (y + 1) * tileHeight - image.getHeight(null), - null); + (y + 1) * tileHeight - image.getHeight(null)); } } diff --git a/src/com/gpl/rpg/atcontentstudio/model/maps/TMXMap.java b/src/com/gpl/rpg/atcontentstudio/model/maps/TMXMap.java index be65971..7831da8 100644 --- a/src/com/gpl/rpg/atcontentstudio/model/maps/TMXMap.java +++ b/src/com/gpl/rpg/atcontentstudio/model/maps/TMXMap.java @@ -38,6 +38,14 @@ public class TMXMap extends GameDataElement { public static final String ABOVE_LAYER_NAME = "Above"; public static final String WALKABLE_LAYER_NAME = "Walkable"; + public enum ColorFilter { + black20, + black40, + black60, + black80, + invert, + bw + } public File tmxFile = null; public tiled.core.Map tmxMap = null; @@ -46,6 +54,7 @@ public class TMXMap extends GameDataElement { public ProjectTreeNode parent; public Integer outside = null; + public ColorFilter colorFilter = null; public boolean writable = false; @@ -62,8 +71,11 @@ public class TMXMap extends GameDataElement { usedSpritesheets = new HashSet(); try { tmxMap = new TMXMapReader().readMap(tmxFile.getAbsolutePath(), this); - if (tmxMap.getProperties().get("outside") != null) { - outside = new Integer(((String) tmxMap.getProperties().get("outside"))); + if (tmxMap.getProperties().get("outdoors") != null) { + outside = new Integer(((String) tmxMap.getProperties().get("outdoors"))); + } + if (tmxMap.getProperties().get("colorfilter") != null) { + colorFilter = ColorFilter.valueOf(((String) tmxMap.getProperties().get("colorfilter"))); } } catch (FileNotFoundException e) { Notification.addError("Impossible to load TMX map file "+tmxFile.getAbsolutePath()); @@ -97,8 +109,11 @@ public class TMXMap extends GameDataElement { try { clone.usedSpritesheets = new HashSet(); clone.tmxMap = new TMXMapReader().readMap(new StringReader(this.toXml()), clone); - if (clone.tmxMap.getProperties().get("outside") != null) { - clone.outside = new Integer(((String) clone.tmxMap.getProperties().get("outside"))); + if (clone.tmxMap.getProperties().get("outdoors") != null) { + clone.outside = new Integer(((String) clone.tmxMap.getProperties().get("outdoors"))); + } + if (clone.tmxMap.getProperties().get("colorfilter") != null) { + clone.colorFilter = ColorFilter.valueOf(((String) tmxMap.getProperties().get("colorfilter"))); } for (tiled.core.MapLayer layer : clone.tmxMap.getLayers()) { if (layer instanceof tiled.core.ObjectGroup) { @@ -210,6 +225,17 @@ public class TMXMap extends GameDataElement { } public String toXml() { + if (outside != null && outside == 1) { + tmxMap.getProperties().put("outdoors", Integer.toString(outside)); + } else { + tmxMap.getProperties().remove("outdoors"); + } + if (colorFilter != null) { + tmxMap.getProperties().put("colorfilter", colorFilter.toString()); + } else { + tmxMap.getProperties().remove("colorfilter"); + } + for (MapObjectGroup group : groups) { group.pushBackToTiledProperties(); if (!tmxMap.containsLayer(group.tmxGroup)) { diff --git a/src/com/gpl/rpg/atcontentstudio/ui/Editor.java b/src/com/gpl/rpg/atcontentstudio/ui/Editor.java index d150132..7c67ce5 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/Editor.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/Editor.java @@ -14,6 +14,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.regex.Matcher; import javax.swing.AbstractListModel; import javax.swing.ComboBoxModel; @@ -29,6 +30,7 @@ import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSpinner; import javax.swing.JSpinner.NumberEditor; +import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.ListModel; import javax.swing.SpinnerNumberModel; @@ -147,6 +149,51 @@ public abstract class Editor extends JPanel implements ProjectElementListener { }); return tfField; } + + public static JTextArea addTextArea(JPanel pane, String label, String initialValue, boolean editable, final FieldUpdateListener listener) { + String text= initialValue == null ? "" : initialValue.replaceAll("\\n", "\n"); + + JPanel tfPane = new JPanel(); + tfPane.setLayout(new JideBoxLayout(tfPane, JideBoxLayout.LINE_AXIS, 6)); + JLabel tfLabel = new JLabel(label); + tfPane.add(tfLabel, JideBoxLayout.FIX); + final JTextArea tfArea = new JTextArea(text); + tfArea.setEditable(editable); + tfPane.add(new JScrollPane(tfArea), JideBoxLayout.VARY); + JButton nullify = new JButton(new ImageIcon(DefaultIcons.getNullifyIcon())); + tfPane.add(nullify, JideBoxLayout.FIX); + nullify.setEnabled(editable); + pane.add(tfPane, JideBoxLayout.FIX); + + nullify.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + tfArea.setText(""); + listener.valueChanged(tfArea, null); + } + }); + tfArea.getDocument().addDocumentListener(new DocumentListener() { + @Override + public void removeUpdate(DocumentEvent e) { + listener.valueChanged(tfArea, tfArea.getText().replaceAll("\n", Matcher.quoteReplacement("\n"))); + } + @Override + public void insertUpdate(DocumentEvent e) { + listener.valueChanged(tfArea, tfArea.getText().replaceAll("\n", Matcher.quoteReplacement("\n"))); + } + @Override + public void changedUpdate(DocumentEvent e) { + listener.valueChanged(tfArea, tfArea.getText().replaceAll("\n", Matcher.quoteReplacement("\n"))); + } + }); +// tfArea.addActionListener(new ActionListener() { +// @Override +// public void actionPerformed(ActionEvent e) { +// listener.valueChanged(tfArea, tfArea.getText().replaceAll("\n", "\\n")); +// } +// }); + return tfArea; + } // public static JSpinner addIntegerField(JPanel pane, String label, Integer initialValue, boolean allowNegatives, boolean editable) { // return addIntegerField(pane, label, initialValue, allowNegatives, editable, nullListener); diff --git a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java index f29de6d..fd58697 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/DialogueEditor.java @@ -23,6 +23,7 @@ import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JSpinner; +import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.ListModel; import javax.swing.ListSelectionModel; @@ -79,7 +80,7 @@ public class DialogueEditor extends JSONElementEditor { private static final int SHOP_INDEX = 5; private JTextField idField; - private JTextField messageField; + private JTextArea messageField; private MyComboBox switchToNpcBox; private RewardsListModel rewardsListModel; @@ -127,7 +128,7 @@ public class DialogueEditor extends JSONElementEditor { createButtonPane(pane, dialogue.getProject(), dialogue, Dialogue.class, dialogue.getImage(), null, listener); idField = addTextField(pane, "Internal ID: ", dialogue.id, dialogue.writable, listener); - messageField = addTextField(pane, "Message: ", dialogue.message, dialogue.writable, listener); + messageField = addTextArea(pane, "Message: ", dialogue.message, dialogue.writable, listener); switchToNpcBox = addNPCBox(pane, dialogue.getProject(), "Switch active NPC to: ", dialogue.switch_to_npc, dialogue.writable, listener); CollapsiblePanel rewards = new CollapsiblePanel("Reaching this phrase gives the following rewards: "); diff --git a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/QuestEditor.java b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/QuestEditor.java index b97d029..4a7dc13 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/QuestEditor.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/gamedataeditors/QuestEditor.java @@ -1,24 +1,32 @@ package com.gpl.rpg.atcontentstudio.ui.gamedataeditors; import java.awt.BorderLayout; +import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; +import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; +import javax.swing.JTextArea; import javax.swing.JTextField; +import javax.swing.UIManager; +import javax.swing.border.EmptyBorder; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; +import javax.swing.table.TableCellRenderer; import javax.swing.table.TableModel; +import org.fife.ui.rtextarea.ColorBackgroundPainterStrategy; + import com.gpl.rpg.atcontentstudio.ATContentStudio; import com.gpl.rpg.atcontentstudio.model.GameDataElement; import com.gpl.rpg.atcontentstudio.model.ProjectTreeNode; @@ -79,6 +87,7 @@ public class QuestEditor extends JSONElementEditor { stagesTable.getColumnModel().getColumn(3).setMinWidth(130); stagesTable.getColumnModel().getColumn(3).setMaxWidth(130); stagesTable.setCellSelectionEnabled(true); + stagesTable.getColumnModel().getColumn(1).setCellRenderer(new MultilineCellRenderer()); stagesPane.add(new JScrollPane(stagesTable), BorderLayout.CENTER); if (quest.writable) { JPanel buttonPane = new JPanel(); @@ -330,6 +339,48 @@ public class QuestEditor extends JSONElementEditor { updateJsonViewText(quest.toJsonString()); } + + } + + public class MultilineCellRenderer extends JTextArea implements TableCellRenderer { + private static final long serialVersionUID = 6539816623608859506L; + + public MultilineCellRenderer() { + setLineWrap(true); + setWrapStyleWord(true); + //setOpaque(true); + } + + @Override + public Component getTableCellRendererComponent(JTable table, + Object value, boolean isSelected, boolean hasFocus, + int row, int column) { + if (isSelected) { + setForeground(stagesTable.getSelectionForeground()); + setBackground(stagesTable.getSelectionBackground()); + } else { + setForeground(stagesTable.getForeground()); + setBackground(stagesTable.getBackground()); + } + setFont(stagesTable.getFont()); + if (hasFocus) { + setBorder(UIManager.getBorder("Table.focusCellHighlightBorder")); + if (stagesTable.isCellEditable(row, column)) { + setForeground(UIManager.getColor("Table.focusCellForeground")); + setBackground(UIManager.getColor("Table.focusCellBackground")); + } + } else { + setBorder(BorderFactory.createLineBorder(getBackground(), 1)); + } + setText((value == null ? "" : value.toString())); + + int fh = getFontMetrics(getFont()).getHeight(); +// int tl = getText().length(); + setSize(stagesTable.getWidth(), fh); + stagesTable.setRowHeight(row, getPreferredSize().height); + + return this; + } } diff --git a/src/com/gpl/rpg/atcontentstudio/ui/map/TMXMapEditor.java b/src/com/gpl/rpg/atcontentstudio/ui/map/TMXMapEditor.java index 1f628e9..e48295d 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/map/TMXMapEditor.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/map/TMXMapEditor.java @@ -10,6 +10,7 @@ import java.awt.Graphics2D; import java.awt.Image; import java.awt.Point; import java.awt.Rectangle; +import java.awt.color.ColorSpace; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; @@ -18,8 +19,14 @@ import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.awt.event.MouseMotionListener; +import java.awt.image.BandCombineOp; +import java.awt.image.BufferedImageOp; +import java.awt.image.ByteLookupTable; +import java.awt.image.ColorConvertOp; +import java.awt.image.LookupOp; +import java.awt.image.LookupTable; +import java.awt.image.ShortLookupTable; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.LinkedList; @@ -115,6 +122,7 @@ public class TMXMapEditor extends Editor { private RSyntaxTextArea editorPane; private IntegerBasedCheckBox outsideBox; + private JComboBox colorFilterBox; private LayerListModel layerListModel; private JList layerList; private tiled.core.MapLayer selectedLayer; @@ -206,6 +214,7 @@ public class TMXMapEditor extends Editor { addLabelField(pane, "TMX File: ", ((TMXMap)target).tmxFile.getAbsolutePath()); createButtonPane(pane, map.getProject(), map, listener); outsideBox = addIntegerBasedCheckBox(pane, "Map is outdoors", map.outside, map.writable, listener); + colorFilterBox = addEnumValueBox(pane, "Color Filter", TMXMap.ColorFilter.values(), map.colorFilter, map.writable, listener); JSplitPane layersViewSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); layerListModel = new LayerListModel(map); @@ -1242,12 +1251,51 @@ public class TMXMapEditor extends Editor { } + private static final BufferedImageOp colorFilterBlack20 = null; + private static final BufferedImageOp colorFilterBlack40 = null; + private static final BufferedImageOp colorFilterBlack60 = null; + private static final BufferedImageOp colorFilterBlack80 = null; + private static final BufferedImageOp colorFilterInvert = null; + private static final BufferedImageOp colorFilterBW = null; + + +// private static final BufferedImageOp colorFilterBlack20 = createGrayScaleColorFilter(0.8f); +// private static final BufferedImageOp colorFilterBlack40 = createGrayScaleColorFilter(0.6f); +// private static final BufferedImageOp colorFilterBlack60 = createGrayScaleColorFilter(0.4f); +// private static final BufferedImageOp colorFilterBlack80 = createGrayScaleColorFilter(0.2f); +// private static final BufferedImageOp colorFilterInvert = createInvertColorFilter(); +// private static final BufferedImageOp colorFilterBW = createBWColorFilter(); +// +// private static BufferedImageOp createGrayScaleColorFilter(float f) { +// byte[] gs = new byte[256]; +// for (int i=0; i < 256; i++) { +// gs[i] = (byte)( i * f); +// } +// return new LookupOp(new ByteLookupTable(0, gs), null); +// } +// +// private static BufferedImageOp createInvertColorFilter() { +// byte[] invert = new byte[256]; +// for (int i=0; i < 256; i++) { +// invert[i] = (byte) (255 - i); +// } +// return new LookupOp(new ByteLookupTable(0, invert), null); +// } +// +// +// private static BufferedImageOp createBWColorFilter() { +// return new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null); +// } + public class TMXViewer extends JPanel implements Scrollable { private static final long serialVersionUID = 2845032142029325865L; + + public tiled.core.MapObject highlighted = null; private MapRenderer renderer; private FieldUpdateListener listener; + private TMXMap map; public boolean resizing = false; public boolean moving = false; @@ -1257,7 +1305,8 @@ public class TMXMapEditor extends Editor { return new Rectangle(selectedMapObject.x + selectedMapObject.w - 16, selectedMapObject.y + selectedMapObject.h - 16, 16, 16); } - public Rectangle getMoveHitArea() { + + public Rectangle getMoveHitArea() { //16x16 px square in the upper left corner of area return new Rectangle(selectedMapObject.x, selectedMapObject.y, 16, 16); } @@ -1270,6 +1319,7 @@ public class TMXMapEditor extends Editor { public TMXViewer(final TMXMap map, FieldUpdateListener listener) { this.listener = listener; renderer = createRenderer(map.tmxMap); + this.map = map; setPreferredSize(renderer.getMapSize()); setOpaque(true); @@ -1383,20 +1433,86 @@ public class TMXMapEditor extends Editor { public void paintComponent(Graphics g) { final Graphics2D g2d = (Graphics2D) g.create(); final Rectangle clip = g2d.getClipBounds(); + + BufferedImageOp filter = null; + + if (map.colorFilter != null) { + switch(map.colorFilter) { + case black20: + filter=colorFilterBlack20; + break; + case black40: + filter=colorFilterBlack40; + break; + case black60: + filter=colorFilterBlack60; + break; + case black80: + filter=colorFilterBlack80; + break; + case bw: + filter=colorFilterBW; + break; + case invert: + filter=colorFilterInvert; + break; + default: + break; + + } + } // Draw a gray background g2d.setPaint(new Color(100, 100, 100)); g2d.fill(clip); // Draw each tile map layer - boolean paintSelected = false; for (tiled.core.MapLayer layer : ((TMXMap)target).tmxMap) { if (layer instanceof tiled.core.TileLayer && layer.isVisible()) { - renderer.paintTileLayer(g2d, (tiled.core.TileLayer) layer); - } else if (layer instanceof tiled.core.ObjectGroup && layer.isVisible()) { + renderer.paintTileLayer(g2d, (tiled.core.TileLayer) layer, filter); + } + } + + + if (map.colorFilter != null) { + switch(map.colorFilter) { + case black20: + g2d.setPaint(new Color(0f, 0f, 0f, 0.2f)); + g2d.fill(clip); + break; + case black40: + g2d.setPaint(new Color(0f, 0f, 0f, 0.4f)); + g2d.fill(clip); + break; + case black60: + g2d.setPaint(new Color(0f, 0f, 0f, 0.6f)); + g2d.fill(clip); + break; + case black80: + g2d.setPaint(new Color(0f, 0f, 0f, 0.8f)); + g2d.fill(clip); + break; + case bw: + break; + case invert: + break; + default: + break; + + } + } + + + // Draw each object map layer + boolean paintSelected = false; + for (tiled.core.MapLayer layer : ((TMXMap)target).tmxMap) { + if (layer instanceof tiled.core.ObjectGroup && layer.isVisible()) { paintSelected |= paintObjectGroup(g2d, (tiled.core.ObjectGroup) layer); } } + + + if (paintSelected) { //TODO make this less ugly..... visually speaking. g2d.setColor(new Color(190, 20, 20)); @@ -1725,6 +1841,10 @@ public class TMXMapEditor extends Editor { } } else if (source == outsideBox) { map.outside = (Integer)value; + } else if (source == colorFilterBox) { + map.colorFilter = (TMXMap.ColorFilter) value; + tmxViewer.revalidate(); + tmxViewer.repaint(); } else if (source == droplistBox) { if (selectedMapObject instanceof ContainerArea) { ContainerArea area = (ContainerArea)selectedMapObject; @@ -2050,6 +2170,34 @@ public class TMXMapEditor extends Editor { final Graphics2D g2d = (Graphics2D) g.create(); final Rectangle clip = g2d.getClipBounds(); + BufferedImageOp filter = null; + + if (map.colorFilter != null) { + switch(map.colorFilter) { + case black20: + filter=colorFilterBlack20; + break; + case black40: + filter=colorFilterBlack40; + break; + case black60: + filter=colorFilterBlack60; + break; + case black80: + filter=colorFilterBlack80; + break; + case bw: + filter=colorFilterBW; + break; + case invert: + filter=colorFilterInvert; + break; + default: + break; + + } + } + // Draw a gray background g2d.setPaint(new Color(100, 100, 100)); g2d.fill(clip); @@ -2057,19 +2205,19 @@ public class TMXMapEditor extends Editor { // Draw each tile map layer if (ground != null) { - renderer.paintTileLayer(g2d, ground); + renderer.paintTileLayer(g2d, ground, filter); } if (objects != null) { - renderer.paintTileLayer(g2d, objects); + renderer.paintTileLayer(g2d, objects, filter); } if (above != null) { - renderer.paintTileLayer(g2d, above); + renderer.paintTileLayer(g2d, above, filter); } if (walkable != null && showWalkable) { - renderer.paintTileLayer(g2d, walkable); + renderer.paintTileLayer(g2d, walkable, filter); } if (highlighted != null) { diff --git a/src/com/gpl/rpg/atcontentstudio/ui/map/WorldMapView.java b/src/com/gpl/rpg/atcontentstudio/ui/map/WorldMapView.java index 2bcf3de..f6f5036 100644 --- a/src/com/gpl/rpg/atcontentstudio/ui/map/WorldMapView.java +++ b/src/com/gpl/rpg/atcontentstudio/ui/map/WorldMapView.java @@ -81,7 +81,7 @@ public class WorldMapView extends JComponent implements Scrollable { for (tiled.core.MapLayer layer : ((TMXMap)map).tmxMap) { if (layer instanceof tiled.core.TileLayer && layer.isVisible()) { if (layer.getName().equalsIgnoreCase("walkable")) continue; - renderer.paintTileLayer(g2, (tiled.core.TileLayer) layer); + renderer.paintTileLayer(g2, (tiled.core.TileLayer) layer, null); } else if (layer instanceof tiled.core.ObjectGroup && layer.isVisible()) { // paintObjectGroup(g2, map, (tiled.core.ObjectGroup) layer); }