package squidpony;
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.utils.Json;
import com.badlogic.gdx.utils.JsonWriter;
import squidpony.squidgrid.mapping.styled.*;
import squidpony.squidmath.GreasedRegion;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
/**
* A reworking of smelC's earlier TilesetsGenerator that might be able to take advantage of newer SquidLib features.
* Created by Tommy Ettinger on 12/4/2016.
*/
public class TilesetProcessor extends ApplicationAdapter {
@Override
public void create() {
super.create();
Json json = new Json(JsonWriter.OutputType.json);
final String[] jss = {"caves_limit_connectivity.js", "caves_tiny_corridors.js", "corner_caves.js",
"default_dungeon.js", "horizontal_corridors_v1.js", "horizontal_corridors_v2.js",
"horizontal_corridors_v3.js", "limit_connectivity_fat.js", "limited_connectivity.js",
"maze_2_wide.js", "maze_plus_2_wide.js", "open_areas.js", "ref2_corner_caves.js",
"rooms_and_corridors_2_wide_diagonal_bias.js", "rooms_and_corridors.js",
"rooms_limit_connectivity.js", "round_rooms_diagonal_corridors.js", "simple_caves_2_wide.js",
"square_rooms_with_random_rects.js"};
for(String js : jss)
{
FileHandle fh = Gdx.files.classpath(js);
OldTileset ts = json.fromJson(OldTileset.class, fh);
/* Now dump 'ts' as a Java class */
final StringBuilder java = new StringBuilder();
appendln(java,
"/* File generated automatically by TilesetsGenerator.java. Do not edit. This file is committed for convenience. */");
appendln(java, "package squidpony.tileset;");
appendln(java, "");
appendln(java, "import squidpony.squidgrid.mapping.styled.*;");
appendln(java, "");
final String fixed = fixFileName(fh.nameWithoutExtension()), javaFileName = fixed + ".java";
appendln(java, "/** @author TilesetsGenerator.java */");
appendln(java, "public class " + fixed + " {");
appendln(java, "");
appendln(java, " public static final Tileset INSTANCE = new Tileset();");
appendln(java, "");
appendln(java, " static {");
appendln(java, 4, "/* Initialize #INSTANCE */ ");
try {
initalizeTopLevel(java, "config", ts.config, ts);
initalizeTopLevel(java, "max_tiles", ts.max_tiles, ts);
} catch (Throwable e) {
errLog("Could not write " + javaFileName, e);
return;
}
initializeTileArray(java, "h_tiles", ts.h_tiles);
initializeTileArray(java, "v_tiles", ts.v_tiles);
appendln(java, " }");
appendln(java, "");
java.append("}");
writeToDisk(java, fixed + ".java");
}
Gdx.app.exit();
}
public static void main(String[] args) {
LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
config.title = "SquidLib Utility: TilesetProcessor";
config.width = 512;
config.height = 128;
new LwjglApplication(new squidpony.TilesetProcessor(), config);
}
private static final String EOL = System.getProperty("line.separator");
private static void initializeTileArray(StringBuilder java, String fieldName, OldTile[] ts_tiles) {
final int len = ts_tiles.length;
/* Initialize array */
appendln(java, 4, "INSTANCE." + fieldName + " = new Tile[" + len + "];");
for (int i = 0; i < len; i++) {
final OldTile source = ts_tiles[i];
/* Fill temporary variable to copy Tile.data */
appendln(java, " /* Build " + fieldName + " #" + i + " */");
java.append(" INSTANCE.").append(fieldName).append("[").append(i).append("] =");
/* Build new Tile */
java.append(" new Tile(");
java.append(source.a_constraint);
java.append(",");
java.append(source.b_constraint);
java.append(",");
java.append(source.c_constraint);
java.append(",");
java.append(source.d_constraint);
java.append(",");
java.append(source.e_constraint);
java.append(",");
java.append(source.f_constraint);
java.append(EOL);
GreasedRegion gr = new GreasedRegion(source.data, '.');
appendln(java, 4,"," + gr.serializeToString() + ");");
}
}
private static void initalizeTopLevel(StringBuilder java, String fieldName, OldConfig c, OldTileset ts)
throws IllegalArgumentException, IllegalAccessException {
appendln(java, 4, "INSTANCE." + fieldName + ".is_corner=" + c.is_corner + ";");
appendln(java, 4, "INSTANCE." + fieldName + ".num_x_variants=" + c.num_x_variants + ";");
appendln(java, 4, "INSTANCE." + fieldName + ".num_y_variants=" + c.num_y_variants + ";");
appendln(java, 4, "INSTANCE." + fieldName + ".short_side_length=" + c.short_side_length + ";");
appendln(java, 4, "INSTANCE." + fieldName + ".num_colors[0]=" + c.num_color_0 + ";");
appendln(java, 4, "INSTANCE." + fieldName + ".num_colors[1]=" + c.num_color_1 + ";");
appendln(java, 4, "INSTANCE." + fieldName + ".num_colors[2]=" + c.num_color_2 + ";");
appendln(java, 4, "INSTANCE." + fieldName + ".num_colors[3]=" + c.num_color_3 + ";");
}
private static void initalizeTopLevel(StringBuilder java, String fieldName, Maximums c, OldTileset ts)
throws IllegalArgumentException, IllegalAccessException {
appendln(java, 4, "INSTANCE." + fieldName + ".h=" + c.h + ";");
appendln(java, 4, "INSTANCE." + fieldName + ".v=" + c.v + ";");
}
private static void writeToDisk(StringBuilder java, String filename) {
final String dest = "generated/" + filename; //"squidlib-util/src/main/java/squidpony/tileset"
final PrintWriter pw;
try {
pw = new PrintWriter(dest);
} catch (FileNotFoundException e) {
errLog("Cannot write " + filename + " to disk", e);
return;
}
pw.append(java);
pw.flush();
pw.close();
infoLog("Written " + dest);
}
/**
* @param s An extension-less filename.
* @return a name suitable for a Java class
*/
private static String fixFileName(String s) {
String result = "";
final int bound = s.length();
boolean upperNext = false;
for (int i = 0; i < bound; i++) {
final char c = s.charAt(i);
if (c == '_')
upperNext = true;
else {
result += (i == 0 || upperNext) ? Character.toUpperCase(c) : c;
upperNext = false;
}
}
return result;
}
private static StringBuilder appendln(StringBuilder buf, int indent, String s) {
for (int i = 0; i < indent; i++)
buf.append(' ');
appendln(buf, s);
return buf;
}
private static StringBuilder appendln(StringBuilder buf, String s) {
buf.append(s);
buf.append(EOL);
return buf;
}
private static void errLog(String msg, Throwable e) {
if (msg != null)
Gdx.app.error(SquidTags.GENERATION, msg);
Gdx.app.error(SquidTags.GENERATION, e.toString() + e.getMessage());
}
private static void errLog(String msg) {
Gdx.app.error(SquidTags.GENERATION, msg);
}
private static void infoLog(String msg) {
Gdx.app.log(SquidTags.GENERATION, msg);
}
}