From 2cf2d608af862e812e7fd3ac580f869141a96fa7 Mon Sep 17 00:00:00 2001 From: XaviDCR92 Date: Sun, 5 Nov 2017 04:16:32 +0100 Subject: [PATCH] + Added copy of BitmapEncoder + New sprite and unit "Town center" * Provisional collision checking. * Many other modifications. --- BarracksSpr.inc => BarracksSpr.i | 0 BitmapEncoder-master/.gitattributes | 23 + BitmapEncoder-master/.gitignore | 3 + BitmapEncoder-master/BitmapEncoder.jar | Bin 0 -> 39886 bytes BitmapEncoder-master/README.md | 10 + BitmapEncoder-master/changelog.md | 13 + BitmapEncoder-master/nbproject/build-impl.xml | 1413 +++++++++ .../nbproject/genfiles.properties | 8 + .../nbproject/private/private.properties | 2 + .../nbproject/private/private.xml | 10 + .../nbproject/project.properties | 73 + BitmapEncoder-master/nbproject/project.xml | 15 + .../src/bitmapencoder/BitmapEncoder.java | 224 ++ .../src/bitmapencoder/BitmapFrame.form | 530 ++++ .../src/bitmapencoder/BitmapFrame.java | 799 +++++ Camera.c | 2 +- Camera.h | 2 +- Exe/POCKET.ELF | Bin 46016 -> 46488 bytes Exe/POCKET.HEX | 2634 +++++++++-------- Exe/POCKET.MAP | 1099 +++---- Gameplay.cpp | 47 +- Gameplay.h | 6 +- Gfx.cpp | 53 +- Gfx.h | 5 +- Libs/libarduino/Makefile | 2 +- Libs/libgamebuino/Makefile | 2 +- Libs/petit_fatfs/Makefile | 6 +- Libs/tinyFAT/Makefile | 2 +- MouseSpr.c => MouseSpr.i | 0 PeasantSpr.inc => PeasantSpr.i | 0 Player.cpp | 47 +- Player.h | 7 +- Sprites/.directory | 4 + Sprites/TownCentre.bmp | Bin 0 -> 1782 bytes Sprites/TownCentreShadow.bmp | Bin 0 -> 1782 bytes TowerSpr.i | 33 + TownCentre.i | 53 + Unit.c | 74 +- Unit.h | 5 +- 39 files changed, 5197 insertions(+), 2009 deletions(-) rename BarracksSpr.inc => BarracksSpr.i (100%) create mode 100644 BitmapEncoder-master/.gitattributes create mode 100644 BitmapEncoder-master/.gitignore create mode 100755 BitmapEncoder-master/BitmapEncoder.jar create mode 100644 BitmapEncoder-master/README.md create mode 100644 BitmapEncoder-master/changelog.md create mode 100644 BitmapEncoder-master/nbproject/build-impl.xml create mode 100644 BitmapEncoder-master/nbproject/genfiles.properties create mode 100644 BitmapEncoder-master/nbproject/private/private.properties create mode 100644 BitmapEncoder-master/nbproject/private/private.xml create mode 100644 BitmapEncoder-master/nbproject/project.properties create mode 100644 BitmapEncoder-master/nbproject/project.xml create mode 100644 BitmapEncoder-master/src/bitmapencoder/BitmapEncoder.java create mode 100644 BitmapEncoder-master/src/bitmapencoder/BitmapFrame.form create mode 100644 BitmapEncoder-master/src/bitmapencoder/BitmapFrame.java rename MouseSpr.c => MouseSpr.i (100%) rename PeasantSpr.inc => PeasantSpr.i (100%) create mode 100644 Sprites/.directory create mode 100644 Sprites/TownCentre.bmp create mode 100644 Sprites/TownCentreShadow.bmp create mode 100644 TowerSpr.i create mode 100644 TownCentre.i diff --git a/BarracksSpr.inc b/BarracksSpr.i similarity index 100% rename from BarracksSpr.inc rename to BarracksSpr.i diff --git a/BitmapEncoder-master/.gitattributes b/BitmapEncoder-master/.gitattributes new file mode 100644 index 0000000..32fdc60 --- /dev/null +++ b/BitmapEncoder-master/.gitattributes @@ -0,0 +1,23 @@ +# Auto detect text files and perform LF normalization +* text=auto +*.jar binary + +# Custom for Visual Studio +*.cs diff=csharp +*.sln merge=union +*.csproj merge=union +*.vbproj merge=union +*.fsproj merge=union +*.dbproj merge=union + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/BitmapEncoder-master/.gitignore b/BitmapEncoder-master/.gitignore new file mode 100644 index 0000000..f05169a --- /dev/null +++ b/BitmapEncoder-master/.gitignore @@ -0,0 +1,3 @@ +/build/ +/dist/ +/settings.dat \ No newline at end of file diff --git a/BitmapEncoder-master/BitmapEncoder.jar b/BitmapEncoder-master/BitmapEncoder.jar new file mode 100755 index 0000000000000000000000000000000000000000..91a4514e01b2e8a240db9fc779b1c9bca9a3cd57 GIT binary patch literal 39886 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

q+~p(+|a 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У0{IIyRWQ!(QqcX% z;4T6Gbq~(HTs0G1<`t4jaDN+iAaL%5l9}K#ugyz>s|25RkDYsoUM9HA8^V&{ZpRd_ zdvNZ3VVU4EZ$(Oiv!LI056- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set src.dir + Must set test.src.dir + Must set build.dir + Must set dist.dir + Must set build.classes.dir + Must set dist.javadoc.dir + Must set build.test.classes.dir + Must set build.test.results.dir + Must set build.classes.excludes + Must set dist.jar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No tests executed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set JVM to use for profiling in profiler.info.jvm + Must set profiler agent JVM arguments in profiler.info.jvmargs.agent + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + To run this application from the command line without Ant, try: + + java -jar "${dist.jar.resolved}" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + Must select one file in the IDE or set run.class + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set debug.class + + + + + Must select one file in the IDE or set debug.class + + + + + Must set fix.includes + + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + Must select one file in the IDE or set profile.class + This target only works when run from inside the NetBeans IDE. + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + + + Must select some files in the IDE or set test.includes + + + + + Must select one file in the IDE or set run.class + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + Some tests failed; see details above. + + + + + + + + + Must select some files in the IDE or set test.includes + + + + Some tests failed; see details above. + + + + Must select some files in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + Some tests failed; see details above. + + + + + Must select one file in the IDE or set test.class + + + + Must select one file in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + + + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BitmapEncoder-master/nbproject/genfiles.properties b/BitmapEncoder-master/nbproject/genfiles.properties new file mode 100644 index 0000000..1694cfd --- /dev/null +++ b/BitmapEncoder-master/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=64fa75ef +build.xml.script.CRC32=478ad818 +build.xml.stylesheet.CRC32=8064a381@1.74.2.48 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=64fa75ef +nbproject/build-impl.xml.script.CRC32=9209127f +nbproject/build-impl.xml.stylesheet.CRC32=876e7a8f@1.74.2.48 diff --git a/BitmapEncoder-master/nbproject/private/private.properties b/BitmapEncoder-master/nbproject/private/private.properties new file mode 100644 index 0000000..eda7286 --- /dev/null +++ b/BitmapEncoder-master/nbproject/private/private.properties @@ -0,0 +1,2 @@ +compile.on.save=true +user.properties.file=D:\\Dropbox\\Program Files\\netbean_user\\build.properties diff --git a/BitmapEncoder-master/nbproject/private/private.xml b/BitmapEncoder-master/nbproject/private/private.xml new file mode 100644 index 0000000..52944c4 --- /dev/null +++ b/BitmapEncoder-master/nbproject/private/private.xml @@ -0,0 +1,10 @@ + + + + + + file:/D:/Dropbox/Gamebuino/BitmapEncoder/src/bitmapencoder/BitmapFrame.java + file:/D:/Dropbox/Gamebuino/BitmapEncoder/src/bitmapencoder/BitmapEncoder.java + + + diff --git a/BitmapEncoder-master/nbproject/project.properties b/BitmapEncoder-master/nbproject/project.properties new file mode 100644 index 0000000..fe31650 --- /dev/null +++ b/BitmapEncoder-master/nbproject/project.properties @@ -0,0 +1,73 @@ +annotation.processing.enabled=true +annotation.processing.enabled.in.editor=false +annotation.processing.processor.options= +annotation.processing.processors.list= +annotation.processing.run.all.processors=true +annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output +build.classes.dir=${build.dir}/classes +build.classes.excludes=**/*.java,**/*.form +# This directory is removed when the project is cleaned: +build.dir=build +build.generated.dir=${build.dir}/generated +build.generated.sources.dir=${build.dir}/generated-sources +# Only compile against the classpath explicitly listed here: +build.sysclasspath=ignore +build.test.classes.dir=${build.dir}/test/classes +build.test.results.dir=${build.dir}/test/results +# Uncomment to specify the preferred debugger connection transport: +#debug.transport=dt_socket +debug.classpath=\ + ${run.classpath} +debug.test.classpath=\ + ${run.test.classpath} +# Files in build.classes.dir which should be excluded from distribution jar +dist.archive.excludes= +# This directory is removed when the project is cleaned: +dist.dir=dist +dist.jar=${dist.dir}/BitmapEncoder.jar +dist.javadoc.dir=${dist.dir}/javadoc +excludes= +includes=** +jar.compress=false +javac.classpath= +# Space-separated list of extra javac options +javac.compilerargs= +javac.deprecation=false +javac.processorpath=\ + ${javac.classpath} +javac.source=1.8 +javac.target=1.8 +javac.test.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +javac.test.processorpath=\ + ${javac.test.classpath} +javadoc.additionalparam= +javadoc.author=false +javadoc.encoding=${source.encoding} +javadoc.noindex=false +javadoc.nonavbar=false +javadoc.notree=false +javadoc.private=false +javadoc.splitindex=true +javadoc.use=true +javadoc.version=false +javadoc.windowtitle= +main.class=bitmapencoder.BitmapFrame +manifest.file=manifest.mf +meta.inf.dir=${src.dir}/META-INF +mkdist.disabled=false +platform.active=default_platform +run.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +# Space-separated list of JVM arguments used when running the project. +# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value. +# To set system properties for unit tests define test-sys-prop.name=value: +run.jvmargs= +run.test.classpath=\ + ${javac.test.classpath}:\ + ${build.test.classes.dir} +source.encoding=UTF-8 +src.dir=src +test.src.dir=test diff --git a/BitmapEncoder-master/nbproject/project.xml b/BitmapEncoder-master/nbproject/project.xml new file mode 100644 index 0000000..6bfac51 --- /dev/null +++ b/BitmapEncoder-master/nbproject/project.xml @@ -0,0 +1,15 @@ + + + org.netbeans.modules.java.j2seproject + + + BitmapEncoder + + + + + + + + + diff --git a/BitmapEncoder-master/src/bitmapencoder/BitmapEncoder.java b/BitmapEncoder-master/src/bitmapencoder/BitmapEncoder.java new file mode 100644 index 0000000..3f9601d --- /dev/null +++ b/BitmapEncoder-master/src/bitmapencoder/BitmapEncoder.java @@ -0,0 +1,224 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package bitmapencoder; + +import java.io.IOException; +import javax.imageio.ImageIO; +import java.io.File; +import java.awt.image.*; + +/** + * + * @author Rodot + */ +public class BitmapEncoder { + + private BufferedImage inputImage; + private BufferedImage outputImage; + private String bitmapName = "myBitmap"; + private boolean hexFormatting = false; + private boolean wrapping = true; + private static File[] filesToConvert; + private static int imageCounter; + private static int fileCount; + + protected void BitmapEncoder() { + } + + protected void open(File file) { + try { + inputImage = ImageIO.read(file); + } catch (IOException e) { + e.printStackTrace(); + } + if (inputImage != null) { + if ((inputImage.getWidth() > 200) || (inputImage.getHeight() > 200)) { + inputImage = null; + return; + } + outputImage = deepCopy(inputImage); + } + } + + protected void threshold(int thres) { + if (inputImage == null) { + return; + } + for (int y = 0; y < inputImage.getHeight(); y++) { + for (int x = 0; x < inputImage.getWidth(); x++) { + int rgb = inputImage.getRGB(x, y); + int red = (rgb >> 16) & 0x000000FF; + int green = (rgb >> 8) & 0x000000FF; + int blue = (rgb) & 0x000000FF; + int value = red + green + blue; + if (value > thres) { + outputImage.setRGB(x, y, 0x00FFFFFF); + } else { + outputImage.setRGB(x, y, 0); + } + } + } + } + + protected String generateOutput(int thres) { + if (inputImage == null) { + return ""; + } + String output = ""; + output = output.concat("const byte "); + output = output.concat(bitmapName); + output = output.concat("[] PROGMEM = {"); + int width = ((inputImage.getWidth() - 1) / 8 + 1) * 8; //round to the closest larger multiple of 8 + output = output.concat(width + "," + inputImage.getHeight() + ","); + if (wrapping) { + output = output.concat("\n"); + } + for (int y = 0; y < inputImage.getHeight(); y++) { + for (int x = 0; x < inputImage.getWidth(); x += 8) { + if (hexFormatting) { + output = output.concat("0x"); + } else { + output = output.concat("B"); + } + int thisByte = 0; + for (int b = 0; b < 8; b++) { + int value = 0xFFFF; + if (x + b < inputImage.getWidth()) { + int rgb = inputImage.getRGB(x + b, y); + int red = (rgb >> 16) & 0x000000FF; + int green = (rgb >> 8) & 0x000000FF; + int blue = (rgb) & 0x000000FF; + value = red + green + blue; + } + if (hexFormatting) { + thisByte *= 2; + if (value < thres) { + thisByte++; + } + } else {//binary formattning + if (value < thres) { + output = output.concat("1"); + } else { + output = output.concat("0"); + } + + } + } + if (hexFormatting) { + output = output.concat(Integer.toString(thisByte, 16). + toUpperCase()); + } + output = output.concat(","); + } + if (wrapping) { + output = output.concat("\n"); + } + } + output = output.concat("};"); + return output; + } + + protected static BufferedImage deepCopy(BufferedImage bi) { + ColorModel cm = bi.getColorModel(); + boolean isAlphaPremultiplied = cm.isAlphaPremultiplied(); + WritableRaster raster = bi.copyData(null); + return new BufferedImage(cm, raster, isAlphaPremultiplied, null); + } + + protected static int countFiles(File[] list, boolean recursed) { + + if (list == null) { + return 0; + } + + if (!recursed) { + fileCount = 0; + } + + for (File f : list) { + if (f.isDirectory()) { + countFiles(f.listFiles(), true); + } else { + if (isImage(f)) { + fileCount++; + } + } + } + return fileCount; + } + + protected static boolean isImage(File f) { + boolean isImage = false; + if (f.getName().endsWith(".bmp") || f.getName().endsWith(".png") + || f.getName().endsWith(".jpeg") + || f.getName().endsWith(".jpg")) { + isImage = true; + } + return isImage; + } + + protected static File[] processSelectedFiles(File[] list, boolean recursed) { + if (!recursed) { + filesToConvert = new File[countFiles(list, false)]; + imageCounter = 0; + } + if (list == null) { + return null; + } + + for (File f : list) { + if (f.isDirectory()) { + processSelectedFiles(f.listFiles(), true); + } else { + if (isImage(f)) { + filesToConvert[imageCounter] = f; + imageCounter++; + } + } + } + return filesToConvert; + } + + protected BufferedImage getInputImage() { + return inputImage; + } + + protected BufferedImage getOutputImage() { + return outputImage; + } + + protected String getBitmapName() { + return bitmapName; + } + + protected boolean isHexFormatting() { + return hexFormatting; + } + + protected boolean isWrapping() { + return wrapping; + } + + protected void setInputImage(BufferedImage inputImage) { + this.inputImage = inputImage; + } + + protected void setOutputImage(BufferedImage outputImage) { + this.outputImage = outputImage; + } + + protected void setBitmapName(String bitmapName) { + this.bitmapName = bitmapName; + } + + protected void setHexFormatting(boolean hexFormatting) { + this.hexFormatting = hexFormatting; + } + + protected void setWrapping(boolean wrapping) { + this.wrapping = wrapping; + } +} diff --git a/BitmapEncoder-master/src/bitmapencoder/BitmapFrame.form b/BitmapEncoder-master/src/bitmapencoder/BitmapFrame.form new file mode 100644 index 0000000..cbf18c6 --- /dev/null +++ b/BitmapEncoder-master/src/bitmapencoder/BitmapFrame.form @@ -0,0 +1,530 @@ + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BitmapEncoder-master/src/bitmapencoder/BitmapFrame.java b/BitmapEncoder-master/src/bitmapencoder/BitmapFrame.java new file mode 100644 index 0000000..3bb5af3 --- /dev/null +++ b/BitmapEncoder-master/src/bitmapencoder/BitmapFrame.java @@ -0,0 +1,799 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package bitmapencoder; + +import static bitmapencoder.BitmapEncoder.deepCopy; +import static bitmapencoder.BitmapEncoder.isImage; +import static bitmapencoder.BitmapEncoder.processSelectedFiles; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.*; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.imageio.ImageIO; +import javax.swing.*; + +/** + * + * @author Rodot + */ +public class BitmapFrame extends javax.swing.JFrame { + + BitmapEncoder encoder = new BitmapEncoder(); + final JFileChooser fileChooser = new JFileChooser(); + final JFileChooser multiFileChooser = new JFileChooser(); + private File[] filesSelected = null; + private String lastSingleDirectory = System.getProperty("user.home"); + private String lastMultiDirectory = System.getProperty("user.home"); + private byte multiFormattingSetting = 1; + private byte singleFormattingSetting = 0; + private boolean multiWrapSetting = false; + private boolean singleWrapSetting = true; + private boolean allowDirectorySelection = false; + + /** + * Creates new form BitmapFrame + */ + private BitmapFrame() { + initComponents(); + try { + loadSettingsFromDisk(); + } catch (IOException ex) { + Logger.getLogger(BitmapFrame.class.getName()). + log(Level.SEVERE, null, ex); + } + formattingBox.setSelectedIndex((int) singleFormattingSetting); + encoder.setHexFormatting(formattingBox.getSelectedIndex() == 1); + wrapCheckbox.setSelected(singleWrapSetting); + encoder.setWrapping(wrapCheckbox.isSelected()); + allowDirectorySelectionCheckBox.setSelected(allowDirectorySelection); + File singleDirectory = new File(lastSingleDirectory); + if (!singleDirectory.exists()) { + lastSingleDirectory = System.getProperty("user.home"); + } + fileChooser.setCurrentDirectory(new File(lastSingleDirectory)); + File multiDirectory = new File(lastMultiDirectory); + if (!multiDirectory.exists()) { + lastMultiDirectory = System.getProperty("user.home"); + } + multiFileChooser.setCurrentDirectory(new File(lastMultiDirectory)); + } + + /** + * This method is called from within the constructor to initialize the form. + * WARNING: Do NOT modify this code. The content of this method is always + * regenerated by the Form Editor. + */ + @SuppressWarnings("unchecked") + // //GEN-BEGIN:initComponents + private void initComponents() { + + buttonGroup1 = new javax.swing.ButtonGroup(); + jPanel1 = new javax.swing.JPanel(); + openButton = new javax.swing.JButton(); + message = new javax.swing.JLabel(); + originalPanel = new javax.swing.JPanel(); + original = new javax.swing.JLabel(); + previewPanel = new javax.swing.JPanel(); + preview = new javax.swing.JLabel(); + thresholdSlider = new javax.swing.JSlider(); + FileSelectionPanel = new javax.swing.JPanel(); + singleFileModeRadioButton = new javax.swing.JRadioButton(); + multiFileModeRadioButton = new javax.swing.JRadioButton(); + allowDirectorySelectionCheckBox = new javax.swing.JCheckBox(); + jPanel2 = new javax.swing.JPanel(); + outputScrollPane = new javax.swing.JScrollPane(); + outputTextArea = new javax.swing.JTextArea(); + jPanel3 = new javax.swing.JPanel(); + scaleSlider = new javax.swing.JSlider(); + scaleLabel = new javax.swing.JLabel(); + nameTextField = new javax.swing.JTextField(); + nameLabel = new javax.swing.JLabel(); + formattingBox = new javax.swing.JComboBox(); + formattingLabel = new javax.swing.JLabel(); + wrapCheckbox = new javax.swing.JCheckBox(); + wrapLabel = new javax.swing.JLabel(); + + setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); + setTitle("Bitmap Encoder - Gamebuino"); + setMinimumSize(new java.awt.Dimension(600, 502)); + setName("bitmapFrame"); // NOI18N + setPreferredSize(new java.awt.Dimension(800, 600)); + addWindowListener(new java.awt.event.WindowAdapter() { + public void windowClosing(java.awt.event.WindowEvent evt) { + formWindowClosing(evt); + } + }); + + jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Input")); + + openButton.setText("Open"); + openButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + openButtonActionPerformed(evt); + } + }); + + message.setText("Please select a file to encode"); + + originalPanel.setBorder(javax.swing.BorderFactory.createEtchedBorder()); + originalPanel.setMaximumSize(new java.awt.Dimension(400, 400)); + originalPanel.setMinimumSize(new java.awt.Dimension(120, 120)); + originalPanel.setPreferredSize(new java.awt.Dimension(120, 120)); + + original.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + original.setText("original"); + + javax.swing.GroupLayout originalPanelLayout = new javax.swing.GroupLayout(originalPanel); + originalPanel.setLayout(originalPanelLayout); + originalPanelLayout.setHorizontalGroup( + originalPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(original, javax.swing.GroupLayout.DEFAULT_SIZE, 116, Short.MAX_VALUE) + ); + originalPanelLayout.setVerticalGroup( + originalPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(original, javax.swing.GroupLayout.DEFAULT_SIZE, 116, Short.MAX_VALUE) + ); + + previewPanel.setBorder(javax.swing.BorderFactory.createEtchedBorder()); + previewPanel.setMaximumSize(new java.awt.Dimension(400, 400)); + previewPanel.setMinimumSize(new java.awt.Dimension(120, 120)); + previewPanel.setPreferredSize(new java.awt.Dimension(120, 120)); + + preview.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + preview.setText("preview"); + + javax.swing.GroupLayout previewPanelLayout = new javax.swing.GroupLayout(previewPanel); + previewPanel.setLayout(previewPanelLayout); + previewPanelLayout.setHorizontalGroup( + previewPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(preview, javax.swing.GroupLayout.DEFAULT_SIZE, 116, Short.MAX_VALUE) + ); + previewPanelLayout.setVerticalGroup( + previewPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(preview, javax.swing.GroupLayout.DEFAULT_SIZE, 116, Short.MAX_VALUE) + ); + + thresholdSlider.setMaximum(765); + thresholdSlider.setOrientation(javax.swing.JSlider.VERTICAL); + thresholdSlider.setToolTipText("Use to adjust the thresold between black and white."); + thresholdSlider.setValue(384); + thresholdSlider.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); + thresholdSlider.setMaximumSize(new java.awt.Dimension(20, 32767)); + thresholdSlider.setMinimumSize(new java.awt.Dimension(20, 36)); + thresholdSlider.setPreferredSize(new java.awt.Dimension(20, 150)); + thresholdSlider.addMouseListener(new java.awt.event.MouseAdapter() { + public void mouseReleased(java.awt.event.MouseEvent evt) { + thresholdSliderMouseReleased(evt); + } + }); + + FileSelectionPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("File Selection Mode")); + FileSelectionPanel.setName(""); // NOI18N + + buttonGroup1.add(singleFileModeRadioButton); + singleFileModeRadioButton.setSelected(true); + singleFileModeRadioButton.setText("Single File Mode"); + singleFileModeRadioButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + singleFileModeRadioButtonActionPerformed(evt); + } + }); + + buttonGroup1.add(multiFileModeRadioButton); + multiFileModeRadioButton.setText("Multi File Mode (disables preview)"); + multiFileModeRadioButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + multiFileModeRadioButtonActionPerformed(evt); + } + }); + + allowDirectorySelectionCheckBox.setText("Allow directory selection"); + allowDirectorySelectionCheckBox.setEnabled(false); + allowDirectorySelectionCheckBox.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + allowDirectorySelectionCheckBoxActionPerformed(evt); + } + }); + + javax.swing.GroupLayout FileSelectionPanelLayout = new javax.swing.GroupLayout(FileSelectionPanel); + FileSelectionPanel.setLayout(FileSelectionPanelLayout); + FileSelectionPanelLayout.setHorizontalGroup( + FileSelectionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(FileSelectionPanelLayout.createSequentialGroup() + .addContainerGap() + .addGroup(FileSelectionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(FileSelectionPanelLayout.createSequentialGroup() + .addGap(21, 21, 21) + .addComponent(allowDirectorySelectionCheckBox)) + .addComponent(singleFileModeRadioButton) + .addComponent(multiFileModeRadioButton)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + FileSelectionPanelLayout.setVerticalGroup( + FileSelectionPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(FileSelectionPanelLayout.createSequentialGroup() + .addContainerGap() + .addComponent(singleFileModeRadioButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(multiFileModeRadioButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(allowDirectorySelectionCheckBox) + .addContainerGap(8, Short.MAX_VALUE)) + ); + + javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); + jPanel1.setLayout(jPanel1Layout); + jPanel1Layout.setHorizontalGroup( + jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel1Layout.createSequentialGroup() + .addContainerGap() + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addGroup(jPanel1Layout.createSequentialGroup() + .addComponent(originalPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(previewPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(FileSelectionPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addGroup(jPanel1Layout.createSequentialGroup() + .addComponent(openButton) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(message))) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(thresholdSlider, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addContainerGap()) + ); + jPanel1Layout.setVerticalGroup( + jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel1Layout.createSequentialGroup() + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel1Layout.createSequentialGroup() + .addGap(45, 45, 45) + .addComponent(thresholdSlider, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(jPanel1Layout.createSequentialGroup() + .addContainerGap() + .addComponent(FileSelectionPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(openButton) + .addComponent(message, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(originalPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(previewPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + ); + + jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder("Output")); + + outputScrollPane.setFont(new java.awt.Font("Monospaced", 0, 11)); // NOI18N + outputScrollPane.setPreferredSize(new java.awt.Dimension(200, 200)); + + outputTextArea.setColumns(20); + outputTextArea.setFont(new java.awt.Font("Consolas", 0, 10)); // NOI18N + outputTextArea.setRows(5); + outputTextArea.setAutoscrolls(false); + outputScrollPane.setViewportView(outputTextArea); + + javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); + jPanel2.setLayout(jPanel2Layout); + jPanel2Layout.setHorizontalGroup( + jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(outputScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 444, Short.MAX_VALUE) + ); + jPanel2Layout.setVerticalGroup( + jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(outputScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + ); + + jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder("Settings")); + + scaleSlider.setMaximum(4); + scaleSlider.setMinimum(1); + scaleSlider.setMinorTickSpacing(1); + scaleSlider.setPaintLabels(true); + scaleSlider.setPaintTicks(true); + scaleSlider.setSnapToTicks(true); + scaleSlider.setValue(2); + scaleSlider.setMaximumSize(new java.awt.Dimension(150, 31)); + scaleSlider.setMinimumSize(new java.awt.Dimension(150, 31)); + scaleSlider.setPreferredSize(new java.awt.Dimension(150, 31)); + scaleSlider.addChangeListener(new javax.swing.event.ChangeListener() { + public void stateChanged(javax.swing.event.ChangeEvent evt) { + scaleSliderStateChanged(evt); + } + }); + + scaleLabel.setText("Preview scale"); + + nameTextField.setFont(new java.awt.Font("Consolas", 0, 11)); // NOI18N + nameTextField.setText("bitmapName"); + + nameLabel.setText("Bitmap name"); + + formattingBox.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Binary (ex: B00110010)", "Hexadecimal (ex: 0x32)" })); + formattingBox.setName(""); // NOI18N + formattingBox.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + formattingBoxActionPerformed(evt); + } + }); + + formattingLabel.setText("Output number formatting"); + + wrapCheckbox.setSelected(true); + wrapCheckbox.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + wrapCheckboxActionPerformed(evt); + } + }); + + wrapLabel.setText("Wrap output lines"); + + javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3); + jPanel3.setLayout(jPanel3Layout); + jPanel3Layout.setHorizontalGroup( + jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel3Layout.createSequentialGroup() + .addContainerGap() + .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addComponent(wrapCheckbox) + .addComponent(formattingBox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(nameTextField, javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(scaleSlider, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel3Layout.createSequentialGroup() + .addComponent(scaleLabel) + .addGap(0, 0, Short.MAX_VALUE)) + .addGroup(jPanel3Layout.createSequentialGroup() + .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(nameLabel) + .addComponent(formattingLabel) + .addComponent(wrapLabel)) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))) + ); + jPanel3Layout.setVerticalGroup( + jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup() + .addContainerGap() + .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(jPanel3Layout.createSequentialGroup() + .addComponent(scaleLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 31, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup() + .addComponent(scaleSlider, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(8, 8, 8))) + .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(nameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(nameLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(formattingLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 21, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(formattingBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addComponent(wrapCheckbox, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(wrapLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addContainerGap()) + ); + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); + getContentPane().setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGap(0, 98, Short.MAX_VALUE))) + .addContainerGap()) + ); + + getAccessibleContext().setAccessibleDescription(""); + + pack(); + }// //GEN-END:initComponents + + private void scaleSliderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_scaleSliderStateChanged + if (singleFileModeRadioButton.isSelected()) { + redrawPreview(); + } + }//GEN-LAST:event_scaleSliderStateChanged + + private void formattingBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_formattingBoxActionPerformed + encoder.setHexFormatting(formattingBox.getSelectedIndex() == 1); + if (singleFileModeRadioButton.isSelected()) { + singleFormattingSetting = (byte) formattingBox.getSelectedIndex(); + updateOutput(); + } else { + multiFormattingSetting = (byte) formattingBox.getSelectedIndex(); + processMultiFiles(); + } + }//GEN-LAST:event_formattingBoxActionPerformed + + private void wrapCheckboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_wrapCheckboxActionPerformed + encoder.setWrapping(wrapCheckbox.isSelected()); + if (singleFileModeRadioButton.isSelected()) { + singleWrapSetting = wrapCheckbox.isSelected(); + updateOutput(); + } else { + multiWrapSetting = wrapCheckbox.isSelected();; + processMultiFiles(); + } + }//GEN-LAST:event_wrapCheckboxActionPerformed + + private void thresholdSliderMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_thresholdSliderMouseReleased + if (encoder.getInputImage() == null && singleFileModeRadioButton.isSelected()) { + message.setText("Open a image before you play with that slider!"); + } else if (singleFileModeRadioButton.isSelected()) { + message.setText("Loading..."); + redrawPreview(); + message.setText("Output updated"); + } else if (multiFileModeRadioButton.isSelected()) { + processMultiFiles(); + } + }//GEN-LAST:event_thresholdSliderMouseReleased + + private void openButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_openButtonActionPerformed + if (singleFileModeRadioButton.isSelected()) { + int returnVal = fileChooser.showOpenDialog(BitmapFrame.this); + if (returnVal == JFileChooser.APPROVE_OPTION) { + lastSingleDirectory = fileChooser.getCurrentDirectory(). + getAbsolutePath(); + File file = fileChooser.getSelectedFile(); + encoder.open(file); + if (encoder.getInputImage() == null) { + message.setText("Can't open the selected image"); + } else { + message.setText("Image succesfully loaded"); + String fileName = file.getName(); + fileName = fileName.substring(0, fileName.lastIndexOf('.')); + nameTextField.setText(fileName); + redrawPreview(); + } + } + } else { + + if (allowDirectorySelectionCheckBox.isSelected()) { + multiFileChooser.setFileSelectionMode( + JFileChooser.FILES_AND_DIRECTORIES); + } else { + multiFileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); + } + multiFileChooser.setMultiSelectionEnabled(true); + int returnVal = multiFileChooser.showOpenDialog(this); + if (returnVal == JFileChooser.APPROVE_OPTION) { + lastMultiDirectory = multiFileChooser.getCurrentDirectory(). + getAbsolutePath(); + filesSelected = multiFileChooser.getSelectedFiles(); + processMultiFiles(); + } + } + try { + saveSettingsToDisk(new File("settings.dat")); + } catch (IOException ex) { + Logger.getLogger(BitmapFrame.class.getName()). + log(Level.SEVERE, null, ex); + } + }//GEN-LAST:event_openButtonActionPerformed + + private void processMultiFiles() { + outputTextArea.setText(""); + String eol = System.lineSeparator(); + File[] filesToConvert = processSelectedFiles(filesSelected, false); + if (filesToConvert == null) { + return; + } + for (File f : filesToConvert) { + if (f != null) { + if (isImage(f)) { + try { + System.out.println("Reading image " + f.getName() + + "..."); + BufferedImage img = ImageIO.read(f); + if (img != null) { + if ((img.getWidth() > 200) || (img.getHeight() + > 200)) { + System.out.println("File " + f.getName() + + " is too large."); + continue; + } + System.out.println("Deep copy of " + f.getName() + + "."); + BufferedImage newImg = deepCopy(img); + int threshold = thresholdSlider.getValue(); + System.out.println( + "Setting threshold for new image."); + for (int y = 0; y < img.getHeight(); y++) { + for (int x = 0; x < img.getWidth(); x++) { + int rgb = img.getRGB(x, y); + int red = (rgb >> 16) & 0x000000FF; + int green = (rgb >> 8) & 0x000000FF; + int blue = (rgb) & 0x000000FF; + int value = red + green + blue; + if (value > threshold) { + newImg.setRGB(x, y, 0x00FFFFFF); + } else { + newImg.setRGB(x, y, 0); + } + } + } + String bitmapName = f.getName().substring(0, f. + getName().lastIndexOf(".")); + System.out.println("Generating output for " + f. + getName() + "."); + String output = outputTextArea.getText(); + output = output.concat("const byte "); + output = output.concat(bitmapName); + output = output.concat("[] PROGMEM = {"); + if (encoder.isWrapping()) { + output = output.concat(eol); + } + int width = ((img.getWidth() - 1) / 8 + 1) * 8; //round to the closest larger multiple of 8 + output = output.concat(width + "," + img. + getHeight() + ","); + if (encoder.isWrapping()) { + output = output.concat(eol); + } + for (int y = 0; y < img.getHeight(); y++) { + for (int x = 0; x < img.getWidth(); x += 8) { + if (encoder.isHexFormatting()) { + output = output.concat("0x"); + } else { + output = output.concat("B"); + } + int thisByte = 0; + for (int b = 0; b < 8; b++) { + int value = 0xFFFF; + if (x + b < img.getWidth()) { + int rgb = img.getRGB(x + b, y); + int red = (rgb >> 16) + & 0x000000FF; + int green = (rgb >> 8) + & 0x000000FF; + int blue = (rgb) & 0x000000FF; + value = red + green + blue; + } + if (encoder.isHexFormatting()) { + thisByte *= 2; + if (value < threshold) { + thisByte++; + } + } else {//binary formatting + if (value < threshold) { + output = output.concat("1"); + } else { + output = output.concat("0"); + } + + } + } + if (encoder.isHexFormatting()) { + output = output.concat(Integer. + toString(thisByte, 16). + toUpperCase()); + } + output = output.concat(","); + } + if (encoder.isWrapping()) { + output = output.concat(eol); + } + } + output = output.concat("};" + eol); + if (encoder.isWrapping()) { + output = output.concat(eol); + } + outputTextArea.setText(output); + } + } catch (IOException ex) { + Logger.getLogger(BitmapFrame.class. + getName()). + log(Level.SEVERE, null, ex); + } + } else { + System.out.println("File " + f.getName() + + " is not an image."); + } + } + } + } + private void singleFileModeRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_singleFileModeRadioButtonActionPerformed + scaleSlider.setEnabled(true); + nameTextField.setEnabled(true); + allowDirectorySelectionCheckBox.setEnabled(false); + formattingBox.setSelectedIndex((int) singleFormattingSetting); + encoder.setHexFormatting(formattingBox.getSelectedIndex() == 1); + wrapCheckbox.setSelected(singleWrapSetting); + encoder.setWrapping(wrapCheckbox.isSelected()); + updateOutput(); + }//GEN-LAST:event_singleFileModeRadioButtonActionPerformed + + private void multiFileModeRadioButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_multiFileModeRadioButtonActionPerformed + scaleSlider.setEnabled(false); + nameTextField.setEnabled(false); + allowDirectorySelectionCheckBox.setEnabled(true); + formattingBox.setSelectedIndex((int) multiFormattingSetting); + encoder.setHexFormatting(formattingBox.getSelectedIndex() == 1); + wrapCheckbox.setSelected(multiWrapSetting); + encoder.setWrapping(wrapCheckbox.isSelected()); + processMultiFiles(); + }//GEN-LAST:event_multiFileModeRadioButtonActionPerformed + + private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing + try { + saveSettingsToDisk(new File("settings.dat")); + } catch (IOException ex) { + Logger.getLogger(BitmapFrame.class.getName()). + log(Level.SEVERE, null, ex); + } + }//GEN-LAST:event_formWindowClosing + + private void allowDirectorySelectionCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_allowDirectorySelectionCheckBoxActionPerformed + allowDirectorySelection = allowDirectorySelectionCheckBox.isSelected(); + }//GEN-LAST:event_allowDirectorySelectionCheckBoxActionPerformed + + /** + * @param args the command line arguments + */ + public static void main(String args[]) { + /* Set the Nimbus look and feel */ + // + /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. + * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html + */ + try { + /*for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { + if ("Nimbus".equals(info.getName())) { + javax.swing.UIManager.setLookAndFeel(info.getClassName()); + break; + } + }*/ + javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager. + getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | + IllegalAccessException | + javax.swing.UnsupportedLookAndFeelException ex) { + java.util.logging.Logger.getLogger(BitmapFrame.class.getName()).log( + java.util.logging.Level.SEVERE, null, ex); + } + // + + /* Create and display the form */ + java.awt.EventQueue.invokeLater(() -> { + new BitmapFrame().setVisible(true); + }); + } + + private void redrawPreview() { + int scale = scaleSlider.getValue(); + //input image + Image in = BitmapEncoder.deepCopy(encoder.getInputImage()); + in = in.getScaledInstance(in.getWidth(null) * scale, in.getHeight(null) + * scale, java.awt.Image.SCALE_REPLICATE); + ImageIcon originalIcon = new ImageIcon(in); + original.setText(""); + original.setIcon(originalIcon); + //output image + encoder.threshold(thresholdSlider.getValue()); + Image out = BitmapEncoder.deepCopy(encoder.getOutputImage()); + out = out.getScaledInstance(out.getWidth(null) * scale, out.getHeight( + null) * scale, java.awt.Image.SCALE_REPLICATE); + ImageIcon previewIcon = new ImageIcon(out); + preview.setText(""); + preview.setIcon(previewIcon); + updateOutput(); + } + + private void updateOutput() { + encoder.setBitmapName(nameTextField.getText()); + outputTextArea.setText(encoder. + generateOutput(thresholdSlider.getValue())); + outputTextArea.setCaretPosition(0); + } + + private void loadSettingsFromDisk() throws IOException { + File saveFile = new File("settings.dat"); + if (saveFile.createNewFile()) { + saveSettingsToDisk(saveFile); + } else { + BufferedReader br = new BufferedReader(new FileReader(saveFile)); + for (String line; (line = br.readLine()) != null;) { + String settingName = line.trim().substring(0, line.indexOf(":")); + String setting = line.substring((line.indexOf(":") + 1)).trim(); + switch (settingName) { + case "LAST_SINGLE_DIRECTORY": + lastSingleDirectory = setting; + break; + case "LAST_MULTI_DIRECTORY": + lastMultiDirectory = setting; + break; + case "SINGLE_FORMATTING": + singleFormattingSetting = Byte.valueOf(setting); + break; + case "MULTI_FORMATTING": + multiFormattingSetting = Byte.valueOf(setting); + break; + case "SINGLE_WRAPPING": + singleWrapSetting = Boolean.valueOf(setting); + break; + case "MULTI_WRAPPING": + multiWrapSetting = Boolean.valueOf(setting); + break; + case "ALLOW_DIRECTORY_SELECTION": + allowDirectorySelection = Boolean.valueOf(setting); + break; + default: + break; + } + } + // line is not visible here. + } + } + + private void saveSettingsToDisk(File saveFile) throws IOException { + try (BufferedWriter out = new BufferedWriter(new FileWriter(saveFile))) { + out.write("LAST_SINGLE_DIRECTORY: " + lastSingleDirectory); + out.newLine(); + out.write("LAST_MULTI_DIRECTORY: " + lastMultiDirectory); + out.newLine(); + out.write("SINGLE_FORMATTING: " + singleFormattingSetting); + out.newLine(); + out.write("MULTI_FORMATTING: " + multiFormattingSetting); + out.newLine(); + out.write("SINGLE_WRAPPING: " + singleWrapSetting); + out.newLine(); + out.write("MULTI_WRAPPING: " + multiWrapSetting); + out.newLine(); + out.write("ALLOW_DIRECTORY_SELECTION: " + allowDirectorySelection); + out.newLine(); + out.close(); + } + } + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JPanel FileSelectionPanel; + private javax.swing.JCheckBox allowDirectorySelectionCheckBox; + private javax.swing.ButtonGroup buttonGroup1; + private javax.swing.JComboBox formattingBox; + private javax.swing.JLabel formattingLabel; + private javax.swing.JPanel jPanel1; + private javax.swing.JPanel jPanel2; + private javax.swing.JPanel jPanel3; + private javax.swing.JLabel message; + private javax.swing.JRadioButton multiFileModeRadioButton; + private javax.swing.JLabel nameLabel; + private javax.swing.JTextField nameTextField; + private javax.swing.JButton openButton; + private javax.swing.JLabel original; + private javax.swing.JPanel originalPanel; + private javax.swing.JScrollPane outputScrollPane; + private javax.swing.JTextArea outputTextArea; + private javax.swing.JLabel preview; + private javax.swing.JPanel previewPanel; + private javax.swing.JLabel scaleLabel; + private javax.swing.JSlider scaleSlider; + private javax.swing.JRadioButton singleFileModeRadioButton; + private javax.swing.JSlider thresholdSlider; + private javax.swing.JCheckBox wrapCheckbox; + private javax.swing.JLabel wrapLabel; + // End of variables declaration//GEN-END:variables +} diff --git a/Camera.c b/Camera.c index 5b5c9c7..7428d30 100644 --- a/Camera.c +++ b/Camera.c @@ -43,7 +43,7 @@ TYPE_COLLISION_BLOCK CameraApplyCoordinatesToCoordinates( TYPE_CAMERA* ptrCamera } void CameraApplyCoordinatesToSprite(TYPE_CAMERA* ptrCamera, - TYPE_SPRITE * spr, + TYPE_SPRITE* spr, uint16_t x, uint16_t y ) { diff --git a/Camera.h b/Camera.h index 66a9fad..cbefc6b 100644 --- a/Camera.h +++ b/Camera.h @@ -42,7 +42,7 @@ void CameraInit(TYPE_CAMERA* ptrCamera); void CameraHandler(TYPE_CAMERA* ptrCamera); void CameraSetLock(TYPE_CAMERA* ptrCamera, bool value); void CameraApplyCoordinatesToSprite( TYPE_CAMERA* ptrCamera, - TYPE_SPRITE * spr, + TYPE_SPRITE* spr, uint16_t x, uint16_t y ); TYPE_COLLISION_BLOCK CameraApplyCoordinatesToCoordinates( TYPE_CAMERA* ptrCamera, diff --git a/Exe/POCKET.ELF b/Exe/POCKET.ELF index eb822fee7944d1a69058138e1bbaa9b0c9413a8e..94e29f1702b68afe69ac5bd0f8816150cbfd1739 100755 GIT binary patch delta 13610 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 delta 13232 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, spr->y, spr->w, spr->h); } @@ -125,50 +130,6 @@ void GfxPrintTextFont(const char* str, const uint8_t* font, uint8_t x, uint8_t y } } -void GfxRenderTiles(TYPE_CAMERA* ptrCamera) -{ - gb.display.setColor(GFX_GRAY); - - if (ptrCamera == NULL) - { - return; - } - - for (int i = 0; i < Y_SCREEN_RESOLUTION; i+=8) - { - for (int j = 0; j < X_SCREEN_RESOLUTION; j++) - { - //if (j & 1) - //{ - int x = j + ptrCamera->X_Offset; - int y = i + ptrCamera->Y_Offset; - - if ((x >= 0) && (y >= 0)) - { - gb.display.drawPixel(j + ptrCamera->X_Offset, i + ptrCamera->Y_Offset); - } - //} - } - } - - for (int i = 0; i < X_SCREEN_RESOLUTION; i+=8) - { - for (int j = 0; j < Y_SCREEN_RESOLUTION; j++) - { - //if (j & 1) - //{ - int x = j + ptrCamera->X_Offset; - int y = i + ptrCamera->Y_Offset; - - if ((x >= 0) && (y >= 0)) - { - gb.display.drawPixel(i + ptrCamera->X_Offset, j + ptrCamera->Y_Offset); - } - //} - } - } -} - void GfxPrintText(const char* str, uint8_t x, uint8_t y) { GfxPrintTextFont(str, font3x5, x, y); diff --git a/Gfx.h b/Gfx.h index 7617f62..e42e25b 100644 --- a/Gfx.h +++ b/Gfx.h @@ -59,7 +59,7 @@ typedef struct t_Camera TYPE_CAMERA; * Global prototypes * *************************************/ -void GfxDrawSprite(TYPE_SPRITE * ptrSprite); +void GfxDrawSprite(TYPE_SPRITE* ptrSprite); void GfxDrawCircle(uint16_t x, uint16_t y, uint8_t radius, int8_t color); void GfxDrawRectangle(uint8_t x, uint8_t y, uint8_t w, uint8_t h, int8_t color); void GfxFillRectangle(uint8_t x, uint8_t y, uint8_t w, uint8_t h, int8_t color); @@ -68,7 +68,7 @@ bool GfxRefreshNeeded(void); void GfxShowKeyboard(char* str, uint8_t length); uint8_t GfxGetWidthFromSpriteData(const uint8_t* sprData); uint8_t GfxGetHeightFromSpriteData(const uint8_t* sprData); -bool GfxIsSpriteInsideScreenArea(TYPE_SPRITE * spr); +bool GfxIsSpriteInsideScreenArea(TYPE_SPRITE* spr); void GfxClearScreen(void); #ifdef __cplusplus void GfxPrintText_Flash(const __FlashStringHelper * str); @@ -76,7 +76,6 @@ void GfxPrintText_Flash(const __FlashStringHelper * str); void GfxPrintText(const char* str, uint8_t x, uint8_t y); void GfxPrintTextFont(const char* str, const uint8_t* font, uint8_t x, uint8_t y); void GfxInit(void); -void GfxRenderTiles(TYPE_CAMERA* ptrCamera); #ifdef __cplusplus } diff --git a/Libs/libarduino/Makefile b/Libs/libarduino/Makefile index a3f5e1d..4f05c46 100644 --- a/Libs/libarduino/Makefile +++ b/Libs/libarduino/Makefile @@ -21,7 +21,7 @@ $(LIBNAME): $(OBJECTS) %.o: %.cpp $(CXX) $< -o $@ $(INCLUDE) $(DEFINE) $(CC_FLAGS) - + %.o: %.c $(CC) $< -o $@ $(INCLUDE) $(DEFINE) $(CC_FLAGS) diff --git a/Libs/libgamebuino/Makefile b/Libs/libgamebuino/Makefile index 28b1e4a..ae98d12 100644 --- a/Libs/libgamebuino/Makefile +++ b/Libs/libgamebuino/Makefile @@ -30,5 +30,5 @@ $(LIBNAME): $(OBJECTS) clean: rm -f $(OBJECTS) rm -f $(LIBS_FOLDER)/$(LIBNAME) - + .PHONY: default clean diff --git a/Libs/petit_fatfs/Makefile b/Libs/petit_fatfs/Makefile index 0d95ef8..6e96f51 100644 --- a/Libs/petit_fatfs/Makefile +++ b/Libs/petit_fatfs/Makefile @@ -12,7 +12,7 @@ LIBNAME=lib$(PROJECT).a OBJECTS=mmc.o petit_fatfs.o pff.o default: $(LIBNAME) - + $(LIBNAME): $(OBJECTS) avr-ar rcs $@ $^ mkdir -p $(INCLUDE_FOLDER)/$(PROJECT) @@ -22,12 +22,12 @@ $(LIBNAME): $(OBJECTS) %.o: %.cpp $(CXX) $< -o $@ $(DEFINE) $(INCLUDE) $(CC_FLAGS) - + %.o: %.c $(CC) $< -o $@ $(DEFINE) $(INCLUDE) $(CC_FLAGS) clean: rm -f $(OBJECTS) rm -f $(LIBS_FOLDER)/$(LIBNAME) - + .PHONY: default clean diff --git a/Libs/tinyFAT/Makefile b/Libs/tinyFAT/Makefile index b99505f..734ff67 100644 --- a/Libs/tinyFAT/Makefile +++ b/Libs/tinyFAT/Makefile @@ -21,7 +21,7 @@ $(LIBNAME): $(OBJECTS) %.o: %.cpp $(CXX) $< -o $@ $(INCLUDE) $(DEFINE) $(CC_FLAGS) - + %.o: %.c $(CC) $< -o $@ $(INCLUDE) $(DEFINE) $(CC_FLAGS) diff --git a/MouseSpr.c b/MouseSpr.i similarity index 100% rename from MouseSpr.c rename to MouseSpr.i diff --git a/PeasantSpr.inc b/PeasantSpr.i similarity index 100% rename from PeasantSpr.inc rename to PeasantSpr.i diff --git a/Player.cpp b/Player.cpp index b9c05a4..4295da1 100644 --- a/Player.cpp +++ b/Player.cpp @@ -5,7 +5,7 @@ #include "Player.h" #include "Pad.h" #include "Unit.h" -#include +#include "Gameplay.h" /* ************************************** * Defines * @@ -53,7 +53,7 @@ void Player::Init(void) cb.x = SystemRand(0, 20); cb.y = SystemRand(0, 20); - if (createUnit(BARRACKS, cb) == false) + if (createUnit(TOWN_CENTER, cb) == false) { GfxPrintText_Flash(F("Failed to create building!")); } @@ -104,8 +104,6 @@ void Player::DrawHandler(void) uint8_t i; bool bAnyoneSelected = false; - //GfxRenderTiles(&Camera); - for (i = 0; i < PLAYER_MAX_UNITS_BUILDINGS; i++) { TYPE_UNIT* u = &units[i]; @@ -318,7 +316,7 @@ void Player::ActionsMenu(void) IncreaseShowActionsMenuIndex(); } - UNIT_ACTION action = (UNIT_ACTION) (showActionsMenu_index); + UNIT_ACTION action = (UNIT_ACTION)(showActionsMenu_index); const char* str = UnitGetActionString(action); @@ -371,8 +369,6 @@ void Player::ButtonHandler(void) { ButtonRightReleased(); } - - } void Player::ButtonAPressed(void) @@ -418,10 +414,19 @@ void Player::ButtonAReleased(void) if (ptrUnit->selected == true) { + showActionsMenu_counterLevel1 = 0; + switch (showActionsMenu_index) { - case ACTION_CREATE_UNIT: - ActionCreateUnit(ptrUnit); + case ACTION_CREATE_PEASANT: + ActionCreateUnit(ptrUnit, PEASANT); + break; + + case ACTION_BUILD_BARRACKS: + ActionCreateBuilding(ptrUnit, BARRACKS); + break; + + default: break; } @@ -433,18 +438,22 @@ void Player::ButtonAReleased(void) showActionsMenu = (showActionsMenu_counter < ACCEPT_UNIT_BUILDING_OPTIONS_FRAMES)? false: true; } -void Player::ActionCreateUnit(TYPE_UNIT* ptrUnit) +void Player::ActionCreateUnit(TYPE_UNIT* ptrUnit, TYPE_UNIT_ID unit) { - if (showActionsMenu_index == ACTION_CREATE_UNIT) - { - uint8_t w = UnitGetWidthFromID(ptrUnit->id); - uint8_t h = UnitGetHeightFromID(ptrUnit->id); - uint8_t new_pos_x = ptrUnit->x + SystemRand(w, w + (w >> 1)); - uint8_t new_pos_y = ptrUnit->y + SystemRand(h, h + (h >> 1)); - TYPE_COLLISION_BLOCK cb = {.x = new_pos_x, .y = new_pos_y}; + uint8_t w = UnitGetWidthFromID(ptrUnit->id); + uint8_t h = UnitGetHeightFromID(ptrUnit->id); + uint8_t new_pos_x = ptrUnit->x + SystemRand(w, w + (w >> 1)); + uint8_t new_pos_y = ptrUnit->y + SystemRand(h, h + (h >> 1)); + TYPE_COLLISION_BLOCK cb = {.x = new_pos_x, .y = new_pos_y}; - createUnit(PEASANT, cb); - } + createUnit(unit, cb); +} + +void Player::ActionCreateBuilding(TYPE_UNIT* ptrUnit, TYPE_UNIT_ID bldg) +{ + TYPE_COLLISION_BLOCK cb = GetCursorPos(); + + createUnit(bldg, cb); } void Player::ButtonBPressed(void) diff --git a/Player.h b/Player.h index 36b5e94..07101ed 100644 --- a/Player.h +++ b/Player.h @@ -61,6 +61,9 @@ class Player // Camera handling TYPE_CAMERA Camera; + // Map rendering + void RenderMap(void); + // Button pressed/released events void ButtonLeftReleased(void); void ButtonRightReleased(void); @@ -85,10 +88,12 @@ class Player bool showActionsMenu; uint8_t showActionsMenu_counter; uint8_t showActionsMenu_index; + uint8_t showActionsMenu_counterLevel1; void IncreaseShowActionsMenuIndex(); // Action callbacks - void ActionCreateUnit (TYPE_UNIT* ptrUnit); + void ActionCreateUnit(TYPE_UNIT* ptrUnit, TYPE_UNIT_ID unit); + void ActionCreateBuilding(TYPE_UNIT* ptrUnit, TYPE_UNIT_ID bldg); }; #endif // __cplusplus diff --git a/Sprites/.directory b/Sprites/.directory new file mode 100644 index 0000000..1f60e19 --- /dev/null +++ b/Sprites/.directory @@ -0,0 +1,4 @@ +[Dolphin] +PreviewsShown=true +Timestamp=2017,11,5,4,13,19 +Version=3 diff --git a/Sprites/TownCentre.bmp b/Sprites/TownCentre.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b2203d4e11bdc62bd26dbfd61cf55b8e64bb4bf3 GIT binary patch literal 1782 zcmb7=!EM7(3`3nuXXpr-AOrN?ojX;o31hksgrpxh0xVDzNqzX|_x`o*byL6U`#!$Q zj<)UZ*zcmFJzA}{E4~Fhtc2GH7Ra$Ek&S#BOOB1jRrDDS9&<<=x4u$tS;@)?^djyf zO6M?kr5JAkwiM+^VnN&)PIrLI;he}3m&LuOAdP-Wb}P+TnfQE;TrMnt|IO={3TH24 zuE2md;&CO?yb`iZj(sHMO+H8QxdH=5aXuym9rql2#lNYKavYdl$&AKy04J;zKh~!? v=vP2jw4wt{j&E3znN#c{X46Z8PxbLS2{Q`gqP_}LgjNEInkR3yMZ?|l;HF}<%Lt~;GK z+GE<67=`ep{%hbJg>-ymNkMPv=*>ON^GKZ%<$cW>9I>WbJ+-KlQ?q8Z9!_RhNcQ3^ z;OBChi}|>QxY7EVLq>~jaJXf~F1CV_Llx4ObqC>;#Z^5xRii8ZIc^{>?U@g0Aai!4 c5Jc^|9!3|Om4jzuK6oiwn*z((7j-P{3wHA`w*UYD literal 0 HcmV?d00001 diff --git a/TowerSpr.i b/TowerSpr.i new file mode 100644 index 0000000..ea693de --- /dev/null +++ b/TowerSpr.i @@ -0,0 +1,33 @@ +const byte TowerSpr[] PROGMEM = { 16,32, + 0xF,0xF0, + 0x8,0x10, + 0x8,0x10, + 0xF,0xF0, + 0x8,0x10, + 0x8,0x10, + 0x8,0x10, + 0x8,0x10, + 0x1B,0xD8, + 0x2A,0x54, + 0x4A,0x52, + 0xFB,0xDF, + 0x8,0x10, + 0x8,0x10, + 0x8,0x10, + 0x9,0x90, + 0x9,0x90, + 0x8,0x10, + 0x8,0x10, + 0x8,0x10, + 0x8,0x10, + 0x9,0x90, + 0x9,0x90, + 0x8,0x10, + 0x8,0x10, + 0x8,0x10, + 0x8,0x10, + 0x8,0x10, + 0xB,0xD0, + 0xA,0x50, + 0xA,0x50, + 0xF,0xF0, }; diff --git a/TownCentre.i b/TownCentre.i new file mode 100644 index 0000000..6d78342 --- /dev/null +++ b/TownCentre.i @@ -0,0 +1,53 @@ +const uint8_t TownCentreSprData[] PROGMEM = {24,24, +0x3,0xFF,0xC0, +0xC,0x0,0x30, +0x37,0xFF,0xEC, +0x78,0x0,0x16, +0xAF,0xFF,0xF5, +0xA8,0x0,0x15, +0xA8,0xFF,0x15, +0xA8,0x81,0x15, +0xA8,0xFF,0xD5, +0xAB,0x81,0x55, +0xAA,0xA5,0xD5, +0xAB,0x81,0x55, +0xAA,0xA5,0x55, +0xAB,0x81,0xD5, +0xA8,0x99,0x15, +0xA8,0xFF,0x15, +0xA6,0x0,0x65, +0x91,0xC3,0x89, +0x8C,0x42,0x31, +0x83,0xC3,0xC1, +0x40,0x42,0x2, +0x30,0x42,0xC, +0xC,0x42,0x30, +0x3,0xC3,0xC0, +}; + +const uint8_t TownCentreShadowSprData[] PROGMEM = {24,24, +0x1F,0x80,0x0, +0x7E,0x0,0x0, +0xF8,0x0,0x0, +0xF0,0x0,0x0, +0xE0,0x0,0x0, +0xE0,0x0,0x4, +0xE0,0x0,0x4, +0xE0,0x0,0x4, +0xE2,0xE0,0x4, +0xE2,0x80,0x4, +0xE2,0x80,0x4, +0xE2,0x80,0x4, +0xE2,0x80,0x4, +0xE2,0x80,0x4, +0xE2,0xE0,0x4, +0xE0,0x60,0xC, +0xE0,0x0,0x10, +0xE0,0x0,0x0, +0xE0,0x0,0x0, +0xE0,0x1,0x80, +0xF0,0x1,0x80, +0xF8,0x1,0x80, +0x7E,0x1,0x80, +0x1F,0x81,0x80, +}; diff --git a/Unit.c b/Unit.c index 7d12666..26beae0 100644 --- a/Unit.c +++ b/Unit.c @@ -3,8 +3,9 @@ * **************************************/ #include "Unit.h" -#include "PeasantSpr.inc" -#include "BarracksSpr.inc" +#include "PeasantSpr.i" +#include "BarracksSpr.i" +#include "TownCentre.i" /* ************************************** * Defines * @@ -30,33 +31,32 @@ struct t_coordinates /* Tables */ static uint8_t const UnitHPTable[MAX_UNITS_BUILDINGS] = { [PEASANT] = 25 , - [BARRACKS] = 100 }; -static uint8_t const UnitSpeedTable[MAX_UNITS_BUILDINGS] = { [PEASANT] = 1 , - [BARRACKS] = 0 }; + [BARRACKS] = 100, + [TOWN_CENTER] = 200 }; -static const char* const UnitActionsTable_Level[MAX_ACTIONS] = { [ACTION_BUILD] = "BUILD", - [ACTION_ATTACK] = "ATTACK", - [ACTION_CREATE_UNIT] = "CREATE"}; +static uint8_t const UnitSpeedTable[MAX_UNITS_BUILDINGS] = { [PEASANT] = 1, + [BARRACKS] = 0, + [TOWN_CENTER] = 0 }; -static uint8_t const UnitActionsTable[MAX_UNITS_BUILDINGS] = { [PEASANT] = ((1 << ACTION_BUILD) | (1 << ACTION_ATTACK)), - [BARRACKS] = (1 << ACTION_CREATE_UNIT) }; +static const char* const UnitActionsTable_Level[MAX_ACTIONS] = { [ACTION_BUILD_BARRACKS] = "B.BARR", + [ACTION_ATTACK] = "ATTACK", + [ACTION_CREATE_PEASANT] = "C.PEAS."}; + +static uint8_t const UnitActionsTable[MAX_UNITS_BUILDINGS] = { [PEASANT] = ((1 << ACTION_BUILD_BARRACKS) | (1 << ACTION_ATTACK)), + [BARRACKS] = (1 << ACTION_CREATE_PEASANT), + [TOWN_CENTER] = (1 << ACTION_CREATE_PEASANT) }; // ************** // Sprite tables // ************** static TYPE_SPRITE UnitSprTable[MAX_UNITS_BUILDINGS]; static TYPE_SPRITE UnitWalkingShadowSprTable[MAX_UNITS_BUILDINGS]; -static const struct t_coordinates UnitShadowOffsetTable[MAX_BUILDING_ID - FIRST_BUILDING_ID] = { [BARRACKS - FIRST_BUILDING_ID] = {.x = -6, .y = 0} }; +static const struct t_coordinates UnitShadowOffsetTable[MAX_BUILDING_ID - FIRST_BUILDING_ID] = { [BARRACKS - FIRST_BUILDING_ID] = {.x = -6, .y = 0}, + [TOWN_CENTER - FIRST_BUILDING_ID] = {.x = -3, .y = 0} }; void UnitInit(void) { - enum - { - BARRACKS_SHADOW_OFFSET_X = -8, - BARRACKS_SHADOW_OFFSET_Y = 0 - }; - - UnitSprTable[PEASANT].Data = Peasant_SprData; + UnitSprTable[PEASANT].Data = Peasant_SprData; UnitSprTable[PEASANT].w = GfxGetWidthFromSpriteData(Peasant_SprData); UnitSprTable[PEASANT].h = GfxGetHeightFromSpriteData(Peasant_SprData); UnitSprTable[PEASANT].flip = 0; @@ -77,18 +77,32 @@ void UnitInit(void) UnitSprTable[BARRACKS].rotation = 0; UnitSprTable[BARRACKS].color = GFX_BLACK; + UnitSprTable[TOWN_CENTER].Data = TownCentreSprData; + UnitSprTable[TOWN_CENTER].w = GfxGetWidthFromSpriteData(TownCentreSprData); + UnitSprTable[TOWN_CENTER].h = GfxGetHeightFromSpriteData(TownCentreSprData); + UnitSprTable[TOWN_CENTER].flip = 0; + UnitSprTable[TOWN_CENTER].rotation = 0; + UnitSprTable[TOWN_CENTER].color = GFX_BLACK; + UnitWalkingShadowSprTable[BARRACKS].Data = BarracksShadowSpr_Data; UnitWalkingShadowSprTable[BARRACKS].w = GfxGetWidthFromSpriteData(BarracksShadowSpr_Data); UnitWalkingShadowSprTable[BARRACKS].h = GfxGetHeightFromSpriteData(BarracksShadowSpr_Data); UnitWalkingShadowSprTable[BARRACKS].flip = 0; UnitWalkingShadowSprTable[BARRACKS].rotation = 0; UnitWalkingShadowSprTable[BARRACKS].color = GFX_GRAY; + + UnitWalkingShadowSprTable[TOWN_CENTER].Data = TownCentreShadowSprData; + UnitWalkingShadowSprTable[TOWN_CENTER].w = GfxGetWidthFromSpriteData(TownCentreShadowSprData); + UnitWalkingShadowSprTable[TOWN_CENTER].h = GfxGetHeightFromSpriteData(TownCentreShadowSprData); + UnitWalkingShadowSprTable[TOWN_CENTER].flip = 0; + UnitWalkingShadowSprTable[TOWN_CENTER].rotation = 0; + UnitWalkingShadowSprTable[TOWN_CENTER].color = GFX_GRAY; } void UnitDraw(TYPE_UNIT* ptrUnit, TYPE_CAMERA* ptrCamera, bool bHighlighted) { uint8_t id = ptrUnit->id; - TYPE_SPRITE * ptrSpr; + TYPE_SPRITE* ptrSpr; if (ptrUnit->alive == false) { @@ -156,10 +170,6 @@ void UnitDraw(TYPE_UNIT* ptrUnit, TYPE_CAMERA* ptrCamera, bool bHighlighted) ptrSpr->flip |= GFX_FLIPV; } break; - - default: - // Invalid direction - break; } } else @@ -244,7 +254,7 @@ void UnitHandler(TYPE_UNIT* unitArray, size_t sz) } - bool bMoving = false; + bool bMoving = true; if (ptrUnit->walking == true) { @@ -256,14 +266,12 @@ void UnitHandler(TYPE_UNIT* unitArray, size_t sz) ptrUnit->dir = DIRECTION_LEFT; x_d = -UnitSpeedTable[ptrUnit->id]; //~ ptrUnit->x -= UnitSpeedTable[ptrUnit->id]; - bMoving = true; } else if ( (ptrUnit->x + UnitSpeedTable[ptrUnit->id]) < ptrUnit->target_x) { ptrUnit->dir = DIRECTION_RIGHT; x_d = UnitSpeedTable[ptrUnit->id]; //~ ptrUnit->x += UnitSpeedTable[ptrUnit->id]; - bMoving = true; } if ( (ptrUnit->y - UnitSpeedTable[ptrUnit->id]) > ptrUnit->target_y) @@ -271,14 +279,18 @@ void UnitHandler(TYPE_UNIT* unitArray, size_t sz) ptrUnit->dir = DIRECTION_UP; y_d = -UnitSpeedTable[ptrUnit->id]; //~ ptrUnit->y -= UnitSpeedTable[ptrUnit->id]; - bMoving = true; } else if ( (ptrUnit->y + UnitSpeedTable[ptrUnit->id]) < ptrUnit->target_y) { ptrUnit->dir = DIRECTION_DOWN; y_d = UnitSpeedTable[ptrUnit->id]; //~ ptrUnit->y += UnitSpeedTable[ptrUnit->id]; - bMoving = true; + } + else + { + x_d = ptrUnit->x - ptrUnit->target_x; + y_d = ptrUnit->y - ptrUnit->target_y; + bMoving = false; } ptrUnit->walking = bMoving; @@ -298,7 +310,7 @@ void UnitHandler(TYPE_UNIT* unitArray, size_t sz) .w = UnitGetWidthFromID(ptrUnit->id), .h = UnitGetHeightFromID(ptrUnit->id) }; TYPE_COLLISION_BLOCK ou; - + if (ptrOtherUnit->alive == false) { continue; @@ -315,7 +327,7 @@ void UnitHandler(TYPE_UNIT* unitArray, size_t sz) ou.y = ptrOtherUnit->x; ou.w = UnitGetWidthFromID(ptrOtherUnit->id); ou.h = UnitGetHeightFromID(ptrOtherUnit->id); - + if (SystemCollisionCheck(cu, ou) == true) { ptrUnit->walking = false; @@ -323,7 +335,7 @@ void UnitHandler(TYPE_UNIT* unitArray, size_t sz) } } } - + if (ptrUnit->walking == true) { // If no collision is detected, keep moving to the new position diff --git a/Unit.h b/Unit.h index eecdbcd..86bd6f7 100644 --- a/Unit.h +++ b/Unit.h @@ -58,6 +58,7 @@ typedef enum t_unitid // Buildings BARRACKS, TOWER, + TOWN_CENTER, MAX_BUILDING_ID, @@ -75,9 +76,9 @@ typedef struct typedef enum t_availableactions { - ACTION_BUILD, + ACTION_BUILD_BARRACKS, ACTION_ATTACK, - ACTION_CREATE_UNIT, + ACTION_CREATE_PEASANT, MAX_ACTIONS }UNIT_ACTION;