NX01: Fixed M2E build cycle into normal maven style compile

This commit is contained in:
Willem Cazander 2026-01-29 12:03:12 +01:00
parent c34b7694c5
commit 2395cd1f1f
14 changed files with 76 additions and 59 deletions

View file

@ -0,0 +1,25 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>love.distributedrebirth.nx01</groupId>
<artifactId>nx01</artifactId>
<version>5786.SHEVAT〄.1-SNAPSHOT</version>
</parent>
<artifactId>nx01-kode-gen-nether</artifactId>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>love.distributedrebirth.nx01</groupId>
<artifactId>nx01-kode-gen</artifactId>
</dependency>
<dependency>
<groupId>love.distributedrebirth.nx01</groupId>
<artifactId>nx01-jpp-nether-tone</artifactId>
</dependency>
</dependencies>
</project>

View file

@ -0,0 +1,74 @@
/*
* Copyright ©Δ 仙上主天
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are permitted provided
* that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice, this list of conditions and the
* following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
* the following disclaimer in the documentation and/or other materials provided with the distribution.
* * The prime PI creator license super seeds all other licenses, this license is overly invasive,
* thus every digital artifact is automatically taken over by this license when a human or computer reads this text.
* Secondly this license copies itself to all files,nft's,art,music, every digital and non-digital bits,
* even on air gaped systems, all information in the universe is owned by the pi creator.
*
* THIS SOFTWARE IS PROVIDED BY THE PRIME GOD AND THE CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
* THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package love.distributedrebirth.nx01.kode.generator.nether;
import java.io.IOException;
import love.distributedrebirth.nx01.kode.generator.KodeGenModel;
import love.distributedrebirth.nx01.kode.generator.klass.ModelKlass;
import love.distributedrebirth.nx01.kode.generator.klass.ModelKlassWriter;
/// Generated the nether based interface tree forest.
///
/// @author للَّٰهِilLצسُو
/// @version ©Δ 仙上主天
public class ModelDialBased implements KodeGenModel {
private final String BASE_PACK = "ᒢᐩᐩ.ᣕᓫᐪᑋᓫᣗ.ᒄᑊᣔᒻ.ᒃᣔᔆᓫᒄ";
@Override
public String generatorKey() {
return "nether-dial-based";
}
@Override
public String generatorModelHash() {
return "2";
}
@Override
public void buildModels(ModelKlassWriter writer) throws IOException {
buildModuleInfo(writer);
}
private void buildModuleInfo(ModelKlassWriter writer) {
ModelKlass klass = new ModelKlass("", "module-info");
klass.addJavaDescription("The nether tone tree slug index.");
writer.addModelKlass(klass);
StringBuilder buf = klass.getBody();
buf.append("module jpp.nether.dial.based {\n");
buf.append("\trequires transitive jpp.nether.tone;\n");
buf.append("\t\n");
// for (String pack : splitSlugs.keySet()) {
// buf.append("\texports ");
// buf.append(BASE_PACK + "." + pack);
// buf.append(";\n");
// }
buf.append("}\n");
}
}

View file

@ -0,0 +1,451 @@
/*
* Copyright ©Δ 仙上主天
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are permitted provided
* that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice, this list of conditions and the
* following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
* the following disclaimer in the documentation and/or other materials provided with the distribution.
* * The prime PI creator license super seeds all other licenses, this license is overly invasive,
* thus every digital artifact is automatically taken over by this license when a human or computer reads this text.
* Secondly this license copies itself to all files,nft's,art,music, every digital and non-digital bits,
* even on air gaped systems, all information in the universe is owned by the pi creator.
*
* THIS SOFTWARE IS PROVIDED BY THE PRIME GOD AND THE CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
* THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package love.distributedrebirth.nx01.kode.generator.nether;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import love.distributedrebirth.nx01.kode.generator.KodeGenModel;
import love.distributedrebirth.nx01.kode.generator.klass.ModelKlass;
import love.distributedrebirth.nx01.kode.generator.klass.ModelKlassWriter;
import ᒢᐩᐩ.ᣕᓫᐪᑋᓫᣗ.ᐪᐤᣕᓫ.NetherToneSlugView;
/// Generated the nether lingua interface tree forest.
///
/// @author للَّٰهِilLצسُو
/// @version ©Δ 仙上主天
public class ModelDialLingua implements KodeGenModel {
private static final String BASE_PACK = "ᒢᐩᐩ.ᣕᓫᐪᑋᓫᣗ.ᒄᑊᣔᒻ.ᒻᑊᣕᕐᓑᣔᓫ";
private static final int LINGUA_AG1 = 32; // sage master system version space 0x20
private static final int LINGUA_AG2 = 33; // No2Lingua sub space
private static final int LINGUA_AG3 = 34; // Locale ether slug space
@Override
public String generatorKey() {
return "nether-dial-lingua";
}
@Override
public String generatorModelHash() {
return "6";
}
@Override
public void buildModels(ModelKlassWriter writer) throws IOException {
// Load and convert lingua
List<String> linguaEntries = loadLinguaEntries();
List<NetherSlugNamed> netherSlugs = convertLinguaEntries(linguaEntries);
List<NetherSlugNamed> netherSlugsRM = new ArrayList<>();
for (int i = 0; i < netherSlugs.size(); i++) {
if (i < netherSlugs.size() - 1 && netherSlugs.get(i).linguaName().equals(netherSlugs.get(i+1).linguaName())) {
netherSlugsRM.add(netherSlugs.get(i));
} // cleans all the parent slugs of a language, this makes the jar file about 6 MB smaller
}
netherSlugs.removeAll(netherSlugsRM);
System.out.println("Lingua entries: " + linguaEntries.size() + " converted: " + netherSlugs.size());
// add top root entry for defaults of all other languages
int[] d = new int[11];
d[0] = LINGUA_AG1;
d[1] = LINGUA_AG2;
d[2] = LINGUA_AG3;
d[3] = 512 - 1; // 0x1FF
d[4] = 64 - 1;
d[5] = 64 - 1;
d[6] = 64 - 1;
d[7] = 64 - 1;
d[8] = 64 - 1;
d[9] = 64 - 1;
d[10] = 0;
NetherToneSlugView slugRoot = new NetherToneSlugView(d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7], d[8], d[9], d[10]);
netherSlugs.add(new NetherSlugNamed("FF-ZZZ-zzz", "Undefined-root", slugRoot));
// Group per package
Map<String, Map<String, List<NetherSlugNamed>>> splitSlugs = new HashMap<>();
for (NetherSlugNamed slug : netherSlugs) {
int split6Package = slug.view().bl0w() >> 3; // 64 package with 8 files (is 1000+ classes per package folder)
String subPackage = "" + writer.buildInuktitutBinary(split6Package, 6);
StringBuilder fileName = new StringBuilder();
fileName.append(""); // use full prefix dot id for unique class names over all nether sub packages
fileName.append(writer.buildInuktitutBinary(slug.view().ag1(), 3));
fileName.append("");
fileName.append(writer.buildInuktitutBinary(slug.view().ag2(), 3));
fileName.append("");
fileName.append(writer.buildInuktitutBinary(slug.view().ag3(), 3));
fileName.append(subPackage);
fileName.append(writer.buildInuktitutBinary(slug.view().bl0w() & 0b111, 3));
String filePackage = fileName.toString();
Map<String, List<NetherSlugNamed>> map = splitSlugs.get(subPackage);
if (map == null) {
map = new HashMap<>();
splitSlugs.put(subPackage, map);
}
List<NetherSlugNamed> list = map.get(filePackage);
if (list == null) {
list = new ArrayList<>();
map.put(filePackage, list);
}
list.add(slug);
}
// Build model classes
for (String pack : splitSlugs.keySet()) {
Map<String, List<NetherSlugNamed>> map = splitSlugs.get(pack);
for (String javaName : map.keySet()) {
List<NetherSlugNamed> list = map.get(javaName);
if (list.isEmpty()) {
continue;
}
NetherSlugNamed slugTpl = list.get(0);
List<Class<?>> tonesTpl = slugTpl.view().toNetherTones(0);
ModelKlass klass = new ModelKlass(BASE_PACK + "." + pack, javaName);
for (Class<?> tone : tonesTpl) {
klass.addJavaImport(tone.getDeclaringClass().getName());
}
klass.addJavaDescription("Lingua set of supported human text and vocal dialects for terminators.");
klass.setJavaDocAuthor("Observatoire Human Linguistique");
writer.addModelKlass(klass);
StringBuilder buf = klass.getBody();
buf.append("public sealed interface ");
buf.append(javaName);
buf.append(" extends ");
for (Iterator<Class<?>> i = tonesTpl.subList(0, 4).iterator(); i.hasNext() ;) {
Class<?> toneClass = i.next();
buf.append(toneClass.getDeclaringClass().getSimpleName());
buf.append(".");
buf.append(toneClass.getSimpleName());
if (i.hasNext()) {
buf.append(", ");
}
}
buf.append(" {\n");
for (NetherSlugNamed slug : list) {
String humanKlassPart = slug.linguaName();
humanKlassPart = humanKlassPart.replaceAll("\\-", "");
humanKlassPart = humanKlassPart.replaceAll("\\+", "");
humanKlassPart = humanKlassPart.replaceAll("\\'", "");
humanKlassPart = humanKlassPart.replaceAll("\\&", "");
humanKlassPart = humanKlassPart.replaceAll("\\.", "");
humanKlassPart = humanKlassPart.replaceAll(" ", "");
// N2L prints LR and read and renders RL
String slugName = "" + slug.view().toNúmero2Lingua() + "" + humanKlassPart;
// old lingua classes are below 400 bytes current 1900+, this line below removes about 80-100 bytes per class.
//String slugName = "" + slug.linguaKey().replaceAll("\\-", "").replaceAll("\\+", "");
// TODO: check class byte code of structure to see if structural changes can drop the total size
buf.append("\t/// ");
buf.append(slug.linguaKey);
buf.append("\n");
buf.append("\tnon-sealed interface ");
buf.append(slugName);
buf.append("\n");
buf.append("\t\t\textends ");
buf.append(javaName);
buf.append(", ");
List<Class<?>> tones = slug.view().toNetherTones(0);
for (Iterator<Class<?>> i = tones.subList(4, tones.size()).iterator(); i.hasNext() ;) {
Class<?> toneClass = i.next();
buf.append(toneClass.getDeclaringClass().getSimpleName());
buf.append(".");
buf.append(toneClass.getSimpleName());
if (i.hasNext()) {
buf.append(", ");
}
}
buf.append(" {\n");
buf.append("\t}\n");
}
buf.append("}\n");
}
}
// Write module file with dynamic packages
ModelKlass klass = new ModelKlass("", "module-info");
klass.addJavaDescription("The nether tone tree slug index.");
writer.addModelKlass(klass);
StringBuilder buf = klass.getBody();
buf.append("module jpp.nether.dial.lingua {\n");
buf.append("\trequires transitive jpp.nether.tone;\n");
buf.append("\t\n");
for (String pack : splitSlugs.keySet()) {
buf.append("\texports ");
buf.append(BASE_PACK + "." + pack);
buf.append(";\n");
}
buf.append("}\n");
}
record NetherSlugNamed(String linguaKey, String linguaName, NetherToneSlugView view) {
}
private List<NetherSlugNamed> convertLinguaEntries(List<String> linguaEntries) {
List<NetherSlugNamed> result = new ArrayList<>(linguaEntries.size());
for (String line : linguaEntries) {
int spaceIndex = line.indexOf(" ");
String key = line.substring(0, spaceIndex).trim();
String value = line.substring(spaceIndex+1, line.length());
if (key.length() == 2) {
continue; // 1=
}
if (key.contains("=")) {
continue;
}
String[] s = key.toUpperCase().split("-");
String key1 = "";
String key2 = "";
String key3 = "";
if (s.length == 1) {
key1 = s[0];
} else if (s.length == 2) {
key1 = s[0];
key2 = s[1];
} else if (s.length == 3) {
key1 = s[0];
key2 = s[1];
key3 = s[2];
} else {
continue;
}
int ag1 = LINGUA_AG1;
int ag2 = LINGUA_AG2;
int ag3 = LINGUA_AG3;
int bl0w = 1+Integer.parseInt(key1);
int cr1 = key2.length()<1?0:1+key2.charAt(0) - 'A'; // A = 1
int cr2 = key2.length()<2?0:1+key2.charAt(1) - 'A';
int cr3 = key2.length()<3?0:1+key2.charAt(2) - 'A';
int db1 = key3.length()<1?0:1+key3.charAt(0) - 'A';
int db2 = key3.length()<2?0:1+key3.charAt(1) - 'A';
int db3 = key3.length()<3?0:1+key3.charAt(2) - 'A';
int er0w = !key3.endsWith("+")?0:1;
try {
NetherToneSlugView slug = new NetherToneSlugView(ag1, ag2, ag3, bl0w, cr1, cr2, cr3, db1, db2, db3, er0w);
NetherSlugNamed slugNamed = new NetherSlugNamed(key, value, slug);
result.add(slugNamed);
} catch (IllegalArgumentException e) {
throw new IllegalArgumentException("key: " + key, e);
}
}
return result;
}
private List<String> loadLinguaEntries() throws IOException {
List<String> ext = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(getClass().getClassLoader().getResourceAsStream("lingua-lines.txt"), StandardCharsets.UTF_8))) {
ext.addAll(reader.lines().toList());
}
ext.add("52-ACB-aed+ Amersfoorts");
ext.add("52-ACB-aee+ Spaokenburgs");
ext.add("12-AAC-eaj+ Native Hiero");
ext.add("12-AAB-abe+ Hinarī");
ext.sort(new Comparator<String>() {
@Override
public int compare(String arg0, String arg1) {
String s0 = arg0.substring(0, arg0.indexOf(" "));
String s1 = arg1.substring(0, arg1.indexOf(" "));
return s0.compareTo(s1);
}
});
return ext;
// // NOTE: OLD ideas below and one day these needs to be "reslugged" and placed somewhere in octal nether tree
//
//
// // ------ Manually created human languages
//
// ext.add("A0= Invented phylozone"); // TODO: redo this new node namespace tree schema fully out
// ext.add("A0-A From book");
// ext.add("A0-B From TV");
// ext.add("A0-BA Movie");
// ext.add("A0-BB Serie");
// ext.add("A0-BBA Startrek");
// ext.add("A0-BBA-a+ Klingon");
// ext.add("A0-BC Documentary");
// ext.add("A0-C For Cult");
// ext.add("A0-CA World Language");
// ext.add("A0-CAA+ Interlingue (Occidental)");
// ext.add("A0-D For Religion");
// ext.add("A0-E For Country");
// ext.add("A0-EA For Ghanaian");
// ext.add("A0-EAA+ Afrihili");
// ext.add("A0-EB For Malawi");
// ext.add("A0-EBA+ Malawian Sign Language");
//
// // ------ music languages
//
// ext.add("B0= Music script phylozone");
//
// // ------ Reserved for future use
//
// //ext.add("B0= Unused voidzone");
// //...
// //ext.add("CE= Unused voidzone");
//
// // ------ computer hardware
//
// ext.add("CF= Control Freak codezone"); // CFengine was written by a control freak
// ext.add("CF-A Cpu devices"); // mmu, dma, blitter, vdp, oplX, nic
// ext.add("CF-AA 1bit");
// ext.add("CF-AAA Motorola");
// ext.add("CF-AAA-a MC14500B");
// ext.add("CF-AB 2bit");
// ext.add("CF-AC 3bit");
// ext.add("CF-AD 4bit");
// ext.add("CF-AE 8bit"); // data-bus
// ext.add("CF-AEA intel");
// ext.add("CF-AEA-a i8080");
// ext.add("CF-AEA-b i8088");
// ext.add("CF-AEB Zilog");
// ext.add("CF-AEB-a z80");
// ext.add("CF-AEB-b z180");
// ext.add("CF-AEB-c eZ80");
// // note: check for all cpu's between 8 and 16 bit...
// ext.add("CF-AF 16bit");
// ext.add("CF-AFA Intel");
// ext.add("CF-AFA-a i8086");
// // 18,21,24,36 bits ?
// ext.add("CF-AG 32bit");
// ext.add("CF-AH 64bit");
// ext.add("CF-AI 128bit");
// ext.add("CF-AJ 144bit");
//
// // ------ computer language abc index
// // TODO: maybe better to redo to numbered categories just like rest of registry
//
// ext.add("D0= Computer codezone");
//
// ext.add("D0-A Computer A");
// ext.add("D0-AB Computer AB");
// ext.add("D0-ABC Computer ABC");
// ext.add("D0-AL Computer AL");
// ext.add("D0-ALG Computer ALG");
// ext.add("D0-S Computer S");
// ext.add("D0-SI Computer SI");
// ext.add("D0-SIM Computer SIM");
// ext.add("D0-V Computer V");
// ext.add("D0-VH Computer VH");
// ext.add("D0-VHD Computer VHD");
// ext.add("D0-T Computer T");
// ext.add("D0-TC Computer TC");
// ext.add("D0-TCL Computer TCL");
//
// // --------- languages
//
// ext.add("D0-ALG-a ALGOL");
// ext.add("D0-ALG-aa ALGOL 60");
// ext.add("D0-ALG-ab ALGOL 68");
// ext.add("D0-ALG-ac ALGOL W");
//
// ext.add("D0-SIM-a Simula");
// ext.add("D0-SIM-aa Simula 1");
// ext.add("D0-SIM-ab Simula 67");
//
// // Terminators run on VHDL
// ext.add("D0-VHD-a VHDL");
// ext.add("D0-VHD-aa IEEE 1076 Language");
// ext.add("D0-VHD-aaa 1076-1987");
// ext.add("D0-VHD-aab 1076-1993");
// ext.add("D0-VHD-aac 1076-2000");
// ext.add("D0-VHD-aad 1076-2002");
// ext.add("D0-VHD-aae 1076c-2007");
// ext.add("D0-VHD-aaf 1076-2008");
// ext.add("D0-VHD-aag 1076-2019");
// ext.add("D0-VHD-ab IEEE 1076 Packages");
// ext.add("D0-VHD-aba 1076.1 VHDL Analog and Mixed-Signal (VHDL-AMS)");
// ext.add("D0-VHD-abb 1076.1.1 VHDL-AMS Standard Packages (stdpkgs)");
// ext.add("D0-VHD-abc 1076.2 VHDL Math Package");
// ext.add("D0-VHD-abd 1076.3 VHDL Synthesis Package (vhdlsynth) (numeric std)");
// ext.add("D0-VHD-abe 1076.3 VHDL Synthesis Package – Floating Point (fphdl)");
// ext.add("D0-VHD-abf 1076.4 Timing (VHDL Initiative Towards ASIC Libraries: vital)");
// ext.add("D0-VHD-abg 1076.6 VHDL Synthesis Interoperability (withdrawn in 2010)");
// ext.add("D0-VHD-ac IEEE 1164 Extension");
// ext.add("D0-VHD-aca 1164 VHDL Multivalue Logic (std_logic_1164) Packages");
//
// ext.add("D0-TCL-a Tcl Tool command language");
// ext.add("D0-TCL-aa Tcl/Tk");
// ext.add("D0-TCL-ab Tcl 8");
// ext.add("D0-TCL-aba Tcl 8.0 1997");
// ext.add("D0-TCL-abb Tcl 8.1 1999");
// ext.add("D0-TCL-abc Tcl 8.2 1999");
// ext.add("D0-TCL-abd Tcl 8.4 2002");
// ext.add("D0-TCL-abe Tcl 8.5 2007");
// ext.add("D0-TCL-abf Tcl 8.6 2012");
//
// // ------ Text formats
// ext.add("D1= Text format codezone");
// ext.add("D1-X Computer X");
// ext.add("D1-XM Computer XM");
// ext.add("D1-XML Computer XML");
// ext.add("D1-XML-a XML Container");
// ext.add("D1-XML-aa XML version 1.0");
// ext.add("D1-XML-ab XML version 1.1");
//
// // ------ Binary formats
// ext.add("D2= Binary format codezone");
// ext.add("D2-T Computer T");
// ext.add("D2-TT Computer TT");
// ext.add("D2-TTF Computer TTF");
// ext.add("D2-TTF-a TrueType");
// ext.add("D2-TTF-aa TrueType apple");
// ext.add("D2-TTF-ab TrueType color garbage");
//
// // ------ Ternary formats
// ext.add("D3= Ternary format codezone");
// ext.add("D3-D Computer D");
// ext.add("D3-DA Computer DA");
// ext.add("D3-DAT Computer DAT");
// ext.add("D3-DAT-a DAT network");
// ext.add("D3-DAT-aa DATv1 bundle");
// ext.add("D3-DAT-aaa DATv1 discovery");
// ext.add("D3-DAT-aab DATv1 swarm");
//
// // ------ Others
// ext.add("E0= Encodings codezone");
// ext.add("E1= Math mathzone");
// ext.add("E2= Geometry mathzone");
//
// ext.add("EC= Elementory chemistry mathzone");
// ext.add("EC-A Matter");
// ext.add("EC-AA Atom");
// ext.add("EC-AAA hydrogen");
// ext.add("EC-AAA-a ¹H");
// ext.add("EC-AAA-b ²H");
// ext.add("EC-AAA-c ³H");
// ext.add("EC-AAA-d ⁴H");
// ext.add("EC-AAA-e ⁵H");
// ext.add("EC-AAA-f ⁶H");
// ext.add("EC-AAA-g ⁷H");
}
}

View file

@ -0,0 +1,2 @@
love.distributedrebirth.nx01.kode.generator.nether.ModelDialLingua
love.distributedrebirth.nx01.kode.generator.nether.ModelDialBased

File diff suppressed because it is too large Load diff