summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/gendata.js136
-rw-r--r--tools/genunits.js114
2 files changed, 191 insertions, 59 deletions
diff --git a/tools/gendata.js b/tools/gendata.js
index cf77791..93d7502 100644
--- a/tools/gendata.js
+++ b/tools/gendata.js
@@ -1,5 +1,7 @@
// https://www.redblobgames.com/grids/hexagons/
+const fs = require('fs')
+
// Clear
const CLEAR = 2;
@@ -466,10 +468,58 @@ function def_block(nationality, type, appearance, steps, elite, label, name) {
let speed = speed_from_type[type];
if (name in unit_map)
throw new Error("duplicate block name:", name);
- unit_map[name] = units.length;
+ unit_map[name] = 1
units.push({nationality, type, class: klass, speed, appearance, steps, elite, label, name});
}
+function sort_nation(u) {
+ if (u.nationality === 'italian')
+ return 0
+ if (u.nationality === 'german')
+ return 1
+ return 2
+}
+
+function sort_subnation(u) {
+ function isn(x) {
+ let [a, b] = u.name.split('/');
+ if (b)
+ b = b.split('+');
+ return a.endsWith(x) || (b && b[0] === x)
+ }
+ switch (true) {
+ case isn("IN"): return 3
+ case isn("SA"): return 4
+ case isn("AU"): return 5
+ case isn("NZ"): return 6
+ case isn("FF"): return 7
+ case isn("Pol"): return 8
+ }
+ return 2
+}
+
+function sort_name(u) {
+ if (u.nationality === 'italian')
+ return 0
+ if (u.nationality === 'german')
+ return 1
+ return sort_subnation(u)
+}
+
+function cmp_block(a, b) {
+ let x = sort_name(a) * 10000 + a.class * 1000 + (1-a.elite) * 10 + (4-a.speed) * 100 + (4-a.steps)
+ let y = sort_name(b) * 10000 + b.class * 1000 + (1-b.elite) * 10 + (4-b.speed) * 100 + (4-b.steps)
+ // let x = sort_nation(a) * 10000 + a.class * 1000 + (1-a.elite) * 10 + (4-a.speed) * 100 + sort_subnation(a)
+ // let y = sort_nation(b) * 10000 + b.class * 1000 + (1-b.elite) * 10 + (4-b.speed) * 100 + sort_subnation(b)
+ if (x < y) return -1
+ if (x > y) return 1
+ if (parseInt(a.name) < parseInt(b.name)) return -1
+ if (parseInt(a.name) > parseInt(b.name)) return 1
+ if (a.name < b.name) return -1
+ if (a.name > b.name) return 1
+ return 0
+}
+
let S = "S";
let M = "M";
let T = "T";
@@ -587,14 +637,80 @@ def_block("allied", "armor", 18, 3, 1, 77, "Sher/A");
def_block("allied", "mot. a/t", 18, 4, 0, 78, "6#/B");
def_block("allied", "mot. inf.", 18, 4, 0, 79, "51H/154");
+units.sort(cmp_block)
+
let all_hexes = hex_exists.map((x,i) => x ? i : 0).filter(x => x > 0)
-console.log("const all_hexes = " + JSON.stringify(all_hexes));
-console.log("const hex_exists = " + JSON.stringify(hex_exists));
-console.log("const hex_road = " + JSON.stringify(hex_road));
-console.log("const side_road = " + JSON.stringify(side_road));
-console.log("const side_limit = " + JSON.stringify(side_limit));
-console.log("const hex_name = " + JSON.stringify(hex_name));
-console.log("const regions = " + JSON.stringify(regions));
-console.log("const units = " + JSON.stringify(units));
-console.log("if (typeof module !== 'undefined') module.exports = { all_hexes, hex_exists, hex_name, hex_road, side_road, side_limit, regions, units }");
+function gen_array(name, fn) {
+ data += "const " + name + " = [" + units.map(fn).join(",") + "]\n"
+}
+
+let data = "// DON'T EDIT - AUTOGENERATED\n"
+data += "const all_hexes = " + JSON.stringify(all_hexes) + "\n"
+data += "const hex_exists = " + JSON.stringify(hex_exists) + "\n"
+data += "const hex_road = " + JSON.stringify(hex_road) + "\n"
+data += "const side_road = " + JSON.stringify(side_road) + "\n"
+data += "const side_limit = " + JSON.stringify(side_limit) + "\n"
+data += "const hex_name = " + JSON.stringify(hex_name) + "\n"
+data += "const regions = " + JSON.stringify(regions) + "\n"
+
+gen_array("unit_name", u => JSON.stringify(u.name))
+gen_array("unit_appearance", u => JSON.stringify(u.appearance))
+gen_array("unit_start_steps", u => u.steps)
+gen_array("unit_elite", u => u.elite)
+gen_array("unit_class", u => u.class)
+gen_array("unit_speed", u => u.speed)
+
+data += "if (typeof module !== 'undefined')\n\tmodule.exports = {\n"
+data += "\t\tall_hexes, hex_exists, hex_name, hex_road, side_road, side_limit, regions,\n"
+data += "\t\tunit_name, unit_appearance, unit_start_steps, unit_elite, unit_class, unit_speed,\n"
+data += "\t}\n"
+
+fs.writeFileSync("data.js", data)
+
+fs.writeFileSync("rawdata.js", "exports.units = " + JSON.stringify(units))
+
+// Show ranges
+
+let test = ""
+function gen_test_range(fn) {
+ let ranges = [];
+ let start = -1;
+ for (let p = 0; p < units.length; ++p) {
+ if (fn(units[p])) {
+ if (start < 0)
+ start = p;
+ } else {
+ if (start >= 0) {
+ ranges.push([start,p-1])
+ start = -1;
+ }
+ }
+ }
+ if (start >= 0)
+ ranges.push([start,units.length-1])
+ return ranges.map(([a,b])=>`(u >= ${a} && u <= ${b})`).join(" || ")
+}
+
+function gen_test(name, fn) {
+ test += "function " + name + "(u) { return " + gen_test_range(fn) + " }\n"
+}
+
+gen_test("is_armor_unit", u => u.class === ARMOR)
+gen_test("is_artillery_unit", u => u.class === ARTILLERY)
+gen_test("is_infantry_unit", u => u.class === INFANTRY)
+gen_test("is_antitank_unit", u => u.class === ANTITANK)
+
+gen_test("is_recon_unit", u => u.speed === 4)
+gen_test("is_mechanized_unit", u => u.speed === 3)
+gen_test("is_motorized_unit", u => u.speed === 2)
+gen_test("is_leg_unit", u => u.speed === 1)
+
+gen_test("is_elite_unit", u => u.elite)
+
+gen_test("is_italian_unit", u => u.nationality === 'italian')
+gen_test("is_german_unit", u => u.nationality === 'german')
+gen_test("is_axis_unit", u => u.nationality !== 'allied')
+gen_test("is_allied_unit", u => u.nationality === 'allied')
+
+console.log(test)
diff --git a/tools/genunits.js b/tools/genunits.js
index 4e0f30e..820de56 100644
--- a/tools/genunits.js
+++ b/tools/genunits.js
@@ -1,5 +1,9 @@
-const { units } = require("../data.js");
-const print = console.log;
+const fs = require('fs')
+const { units } = require("../rawdata.js");
+var out = []
+function print(s) { out.push(s) }
+
+function print_defs() {
print(`<svg xmlns="http://www.w3.org/2000/svg" width="510" height="510" version="1.2" viewBox="0 0 510 510">
<defs>
@@ -62,9 +66,10 @@ print(`<svg xmlns="http://www.w3.org/2000/svg" width="510" height="510" version=
</symbol>
</defs>
-<g font-family="Arial,Helvetica,sans-serif" font-weight="bold">`);
+<g font-family="Arial,Helvetica,sans-serif" font-weight="bold">`)
+}
-SYMBOLS = {
+const SYMBOLS = {
"armor": `
<path fill="#ccc" stroke="#111" stroke-linejoin="round" stroke-width="1.5" d="M38.3 38.3H12.8V12.9h25.5zm0 0"/>
@@ -175,53 +180,64 @@ const BLACK = {
allied: "#5c3a1e"
}
-let x = 0, y = 0;
-for (let u of units) {
- let type = TYPEMAP[u.type];
- let black = BLACK[u.nationality];
- let fill = COLORMAP[u.nationality];
-
- let [a, b] = u.name.split('/');
- if (b)
- b = b.split('+');
-
- for (let n in COLORMAP)
- if (a.endsWith(n) || (b && b[0] === n))
- fill = COLORMAP[n];
-
- print(`<g transform="translate(${x},${y})">`);
-
- if (type === 'armor' && u.elite && u.nationality === 'allied')
- type = 'armor_elite';
-
- let symbol = SYMBOLS[type];
- print(symbol.replace(/#ccc/g, fill).replace(/#111/g, black).trim());
-
- if (u.elite)
- print(`<use href="#cv${u.steps}e" fill="${black}"/>`);
- else
- print(`<use href="#cv${u.steps}" fill="${black}"/>`);
-
- print(`<g fill="${black}">`);
- print(`<text text-anchor="start" font-size="7" x="2" y="8">${u.appearance}</text>`);
- print(`<text text-anchor="start" font-size="7" x="2" y="48">${a}</text>`);
+function print_units(show_text) {
+ out = []
+ print_defs()
+ let x = 0, y = 0;
+ for (let u of units) {
+ let type = TYPEMAP[u.type];
+ let black = BLACK[u.nationality];
+ let fill = COLORMAP[u.nationality];
+
+ let [a, b] = u.name.split('/');
+ if (b)
+ b = b.split('+');
+
+ for (let n in COLORMAP)
+ if (a.endsWith(n) || (b && b[0] === n))
+ fill = COLORMAP[n];
+
+ print(`<g transform="translate(${x},${y})">`);
+
+ if (type === 'armor' && u.elite && u.nationality === 'allied')
+ type = 'armor_elite';
+
+ let symbol = SYMBOLS[type];
+ print(symbol.replace(/#ccc/g, fill).replace(/#111/g, black).trim());
+
+ if (u.elite)
+ print(`<use href="#cv${u.steps}e" fill="${black}"/>`);
+ else
+ print(`<use href="#cv${u.steps}" fill="${black}"/>`);
+
+ if (show_text) {
+ print(`<g fill="${black}">`);
+ print(`<text text-anchor="start" font-size="7" x="2" y="8">${u.appearance}</text>`);
+ print(`<text text-anchor="start" font-size="7" x="2" y="48">${a}</text>`);
+
+ if (b) {
+ if (b.length > 1) {
+ print(`<text text-anchor="end" font-size="7" x="49" y="43">${b[0]}</text>`);
+ print(`<text text-anchor="end" font-size="7" x="49" y="49">${b[1]}</text>`);
+ } else {
+ print(`<text text-anchor="end" font-size="7" x="48" y="48">${b[0]}</text>`);
+ }
+ }
+
+ print(`</g>`);
+ }
- if (b) {
- if (b.length > 1) {
- print(`<text text-anchor="end" font-size="7" x="49" y="43">${b[0]}</text>`);
- print(`<text text-anchor="end" font-size="7" x="49" y="49">${b[1]}</text>`);
- } else {
- print(`<text text-anchor="end" font-size="7" x="48" y="48">${b[0]}</text>`);
+ print(`</g>`);
+ x += 51;
+ if (x >= 510) {
+ y += 51;
+ x = 0;
}
}
-
print(`</g>`);
- print(`</g>`);
- x += 51;
- if (x >= 510) {
- y += 51;
- x = 0;
- }
+ print(`</svg>`);
+ return out.join("\n")
}
-print(`</g>`);
-print(`</svg>`);
+
+fs.writeFileSync("units.svg", print_units(true))
+fs.writeFileSync("units-simple.svg", print_units(false))