Block hardness adaptions (issue #32). Lang files updated. Build utils enhanced to prepare code release for 1.13/1.14.

This commit is contained in:
stfwi 2019-06-22 22:53:51 +02:00
parent 8af8544e30
commit 0a310c4261
19 changed files with 1221 additions and 618 deletions

127
meta/lib/libassets.js Normal file
View file

@ -0,0 +1,127 @@
"use strict";
(function(constants){
var me = {};
/**
* Determines a list of all textures in the given path as plain object,
* where the keys are the unified texture path (e.g. "block/", not "blocks/"),
* and the value an object containing file path, SHA1, size, etc.
* @returns {object}
*/
me.load_texture_data = function(textures_path) {
const wd = fs.cwd();
var data = {};
try {
if(!fs.chdir(textures_path)) throw new Error("Texture root path does not exist: '" + textures_path + "'");
fs.find(".", '*.*', function(path) {
const file = path.replace(/[\\]/g, "/").replace(/^\.\//,"");
const unified_file = file.replace(/^blocks\//, "block/");
data[unified_file] = { path:file, size:fs.size(file), sha:sys.hash.sha1(path, true) };
return false;
});
return data;
} finally {
fs.chdir(wd);
}
}
/**
* Compares texture files and mcdata files two given assets paths, returns the
* lists of both file trees and the differences as object.
* @returns {object}
*/
me.compare_textures = function(assets_path_a, assets_path_b) {
const txpath_a = assets_path_a + "/" + constants.mod_registry_name() + "/textures";
const txpath_b = assets_path_b + "/" + constants.mod_registry_name() + "/textures";
const a = me.load_texture_data(txpath_a);
const b = me.load_texture_data(txpath_b);
const txpath_a_is112 = fs.isdir(txpath_a + "/blocks");
const txpath_b_is112 = fs.isdir(txpath_b + "/blocks");
const cmp = {a:{},b:{}};
cmp.a.path = txpath_a;
cmp.b.path = txpath_b;
cmp.a.is112 = txpath_a_is112;
cmp.b.is112 = txpath_b_is112;
cmp.a.files = Object.assign({},a);
cmp.b.files = Object.assign({},b);
cmp.match = {}
cmp.differ = {}
cmp.onlyin_a = {}
cmp.onlyin_b = {}
for(var key in a) {
if(b[key] === undefined) {
cmp.onlyin_a[key] = a[key];
continue;
}
if(a[key].sha === b[key].sha) {
cmp.match[key] = a[key];
b[key]=undefined; delete b[key];
} else {
cmp.differ[key] = { a:a[key], b:b[key] };
b[key]=undefined; delete b[key];
}
}
a = undefined;
for(var key in b) {
cmp.onlyin_b[key] = b[key];
}
b = undefined;
return cmp;
};
/**
* Loads all blockstate files in the given assets path, and returns the parsed JSON
* data as plain object, where the keys are the blockstate names, and the value the
* parsed JSON files.
* @returns {object}
*/
me.load_blockstates = function(assets_path) {
const wd = fs.cwd();
var data = {};
try {
if(!fs.chdir(assets_path+"/blockstates")) throw new Error("blockstates path not found in: '" + assets_path + "'");
fs.find(".", '*.json', function(path) {
const file = path.replace(/[\\]/g, "/").replace(/^\.\//,"");
if(fs.basename(file) != fs.basename(file).toLowerCase()) throw new Error("Blockstate file must be lowercase: '"+file+"'"); // hard fail
const blockstate_name = fs.basename(file).replace(/[\.]json/i, "");
if(blockstate_name.search(/[^a-z0-9_]/) >= 0) throw new Error("Blockstate file name contains invalid characters: '"+file+"'"); // here, too
var json = fs.readfile(path);
if(json===undefined) throw new Error("Failed to read blockstate file '"+file+"' (could not open file)");
try { json=JSON.parse(json); } catch(ex) { throw new Error("Failed to parse blockstate file '"+file+"' (invalid JSON)"); }
data[blockstate_name] = {file:(assets_path+"/blockstates/"+file), data:json};
return false;
});
return data;
} finally {
fs.chdir(wd);
}
};
me.compare_blockstates = function(assets_path_a, assets_path_b) {
const a = me.load_blockstates(assets_path_a);
const b = me.load_blockstates(assets_path_b);
const onlyin_a = {};
const onlyin_b = {};
for(var key in a) {
if(b[key] === undefined) {
onlyin_a[key] = a[key];
continue;
} else {
b[key]=undefined; delete b[key];
}
}
a = undefined;
for(var key in b) {
onlyin_b[key] = b[key];
}
b = undefined;
return {
onlyin_a: onlyin_a,
onlyin_b: onlyin_b,
}
};
Object.freeze(me);
return me;
});