package haven; import com.google.gson.TypeAdapter; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; import java.io.IOException; import java.util.LinkedList; import java.util.List; public class ArtificeData implements ItemData.ITipData { public int pmax; public int pmin; public String[] profs; public String[] attrs; public int[] vals; public ArtificeData() { } public ArtificeData(ItemInfo info) { pmin = (int) (100*Reflect.getFieldValueDouble(info,"pmin")); pmax = (int) (100*Reflect.getFieldValueDouble(info,"pmax")); profs = (String[]) Reflect.getFieldValue(info, "attrs"); //noinspection unchecked List<ItemInfo> sub = (List<ItemInfo>) Reflect.getFieldValue(info, "sub"); info = sub.get(0); attrs = (String[]) Reflect.getFieldValue(info, "attrs"); vals = (int[]) Reflect.getFieldValue(info, "vals"); } @Override public ItemInfo.Tip create() { Resource res = Resource.load("ui/tt/slot"); if(res == null){return null;} ItemInfo.InfoFactory f = res.layer(Resource.CodeEntry.class).get(ItemInfo.InfoFactory.class); Session sess = UI.instance.sess; int rid = sess.getresid("ui/tt/dattr"); if(rid == 0){return null;} Object[] bonuses = new Object[1 + attrs.length + vals.length]; bonuses[0] = rid; for(int k = 0; k< attrs.length; k++){ bonuses[1 + 2*k] = attrs[k]; bonuses[2 + 2*k] = vals[k]; } Object[] args = new Object[4 + profs.length]; int i=0; args[i++] = 0; args[i++] = pmin; args[i++] = pmax; for(String prof : profs){ args[i++] = prof; } args[i] = new Object[]{bonuses}; return (ItemInfo.Tip) f.build(sess, args); } public static class DataAdapter extends TypeAdapter<ArtificeData> { @Override public void write(JsonWriter writer, ArtificeData data) throws IOException { writer.beginObject(); writer.name("pmin").value(data.pmin); writer.name("pmax").value(data.pmax); writer.name("profs"); writer.beginArray(); for(String prof : data.profs){ writer.value(prof); } writer.endArray(); writer.name("bonuses"); writer.beginObject(); int n = data.attrs.length; for(int i=0; i < n; i++){ writer.name(data.attrs[i]).value(data.vals[i]); } writer.endObject(); writer.endObject(); } @Override public ArtificeData read(JsonReader reader) throws IOException { ArtificeData data = new ArtificeData(); reader.beginObject(); while(reader.hasNext()){ String name = reader.nextName(); if(name.equals("pmin")){ data.pmin = reader.nextInt(); } else if(name.equals("pmax")) { data.pmax = reader.nextInt(); } else if(name.equals("profs")) { data.profs = parseArray(reader); } else if(name.equals("bonuses")) { parseObject(reader, data); } } reader.endObject(); return data; } private void parseObject(JsonReader reader, ArtificeData data) throws IOException { List<String> names = new LinkedList<String>(); List<Integer> vals = new LinkedList<Integer>(); reader.beginObject(); while(reader.hasNext()){ names.add(reader.nextName()); vals.add(reader.nextInt()); } reader.endObject(); data.attrs = names.toArray(new String[names.size()]); data.vals = new int[vals.size()]; for(int i = 0; i < data.vals.length; i++) { data.vals[i] = vals.get(i); } } private String[] parseArray(JsonReader reader) throws IOException { List<String> values = new LinkedList<String>(); reader.beginArray(); while(reader.hasNext()){ values.add(reader.nextString()); } reader.endArray(); return values.toArray(new String[values.size()]); } } }