package de.luca.lager; /** * Ein Farmziel: so viel von einem Gegenstand, in Stueck, Stapeln, * Doppelkisten oder Stufen. Das Widget rechnet aus, wie viel noch fehlt. * * Gezaehlt wird ab dem Moment, in dem du das Ziel setzt — was vorher * schon im Lager lag, steht daneben, zaehlt aber nicht mit rein. */ public class Ziel { public static final int STAPEL = 64; public static final int DOPPELKISTE = 54 * 64; /** Die Einheiten, durch die das Menue durchschaltet. */ public static final String[] EINHEITEN = {"Stueck", "Stapel", "Doppelkisten", "Stufen"}; /** * Die Stufen auf GrieferGames gehen in Neunerschritten: Stufe I sind 9, * dann jedes Mal mal neun — 81, 729, 6.561, 59.049, 531.441, 4.782.969. * Ueber dieser Stufe wird die Zahl groesser als sinnvoll. */ public static final int HOECHSTE_STUFE = 18; public String item = ""; public long menge; public String einheit = "Stueck"; /** Von Hand gesetzt: so viele Stueck je Stufe. 0 heisst Neunerschritte. */ public long jeStufe; /** Was du davon schon geschafft hast, bevor die Mod mitgezaehlt hat. */ public long schon; /** Zaehlerstand beim Setzen, damit ab da gerechnet wird. */ public long start; public long gesetzt; public boolean steht() { return !item.isEmpty() && menge > 0 && inStueck() > 0; } /** Stufe I = 9, Stufe II = 81, und so weiter. */ public static long stufeInStueck(long stufe) { if (stufe <= 0 || stufe > HOECHSTE_STUFE) { return 0; } long n = 1; for (long i = 0; i < stufe; i++) { n *= 9; } return n; } /** Das Ziel in Stueck. 0 heisst: so nicht auszurechnen. */ public long inStueck() { if (einheit.equals("Stapel")) { return menge * STAPEL; } if (einheit.equals("Doppelkisten")) { return menge * DOPPELKISTE; } if (einheit.equals("Stufen")) { return jeStufe > 0 ? menge * jeStufe : stufeInStueck(menge); } return menge; } /** Wie das Ziel dasteht: "Stufe VII" oder "3 Doppelkisten". */ public String beschriftung() { if (einheit.equals("Stufen")) { return "Stufe " + roemisch(menge); } if (einheit.equals("Stapel")) { return menge + (menge == 1 ? " Stapel" : " Stapel"); } if (einheit.equals("Doppelkisten")) { return menge + (menge == 1 ? " Doppelkiste" : " Doppelkisten"); } return menge + " Stueck"; } public void naechsteEinheit(int richtung) { int i = 0; for (int k = 0; k < EINHEITEN.length; k++) { if (EINHEITEN[k].equals(einheit)) { i = k; } } i = (i + richtung + EINHEITEN.length) % EINHEITEN.length; einheit = EINHEITEN[i]; } // ================================================================= // Roemische Zahlen — Stufen schreibt man auf GrieferGames so // ================================================================= private static final int[] WERTE = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}; private static final String[] ZEICHEN = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}; public static String roemisch(long n) { if (n <= 0 || n > 3999) { return String.valueOf(n); } StringBuilder b = new StringBuilder(); long rest = n; for (int i = 0; i < WERTE.length; i++) { while (rest >= WERTE[i]) { rest -= WERTE[i]; b.append(ZEICHEN[i]); } } return b.toString(); } /** Nimmt "VII" genauso wie "7". 0 heisst: nicht zu lesen. */ public static long alsZahl(String s) { if (s == null) { return 0; } String t = s.trim().toUpperCase(java.util.Locale.GERMANY); if (t.isEmpty()) { return 0; } boolean roemischeSchreibweise = true; for (int i = 0; i < t.length(); i++) { if ("MDCLXVI".indexOf(t.charAt(i)) < 0) { roemischeSchreibweise = false; break; } } if (roemischeSchreibweise) { long summe = 0; long vorher = 0; for (int i = t.length() - 1; i >= 0; i--) { long w = wertVon(t.charAt(i)); if (w < vorher) { summe -= w; } else { summe += w; vorher = w; } } return summe > 0 ? summe : 0; } // Sonst alle Ziffern einsammeln, Punkte sind Tausendertrenner StringBuilder b = new StringBuilder(); for (int i = 0; i < t.length(); i++) { char c = t.charAt(i); if (c >= '0' && c <= '9') { b.append(c); } } if (b.length() == 0 || b.length() > 18) { return 0; } try { return Long.parseLong(b.toString()); } catch (Exception e) { return 0; } } private static long wertVon(char c) { switch (c) { case 'M': return 1000; case 'D': return 500; case 'C': return 100; case 'L': return 50; case 'X': return 10; case 'V': return 5; case 'I': return 1; default: return 0; } } }