public void tick(double dt) { int max = 0; int[] lmax = new int[4]; for (int i = 0; i < 4; i++) { lmax[i] = ui.sess.glob.cattr.get(Tempers.anm[i]).base; if (lmax[i] == 0) return; if (lmax[i] != this.lmax[i]) redraw(); max = Math.max(max, lmax[i]); } this.lmax = lmax; this.max = max; GobbleInfo food = null; Alchemy ch = null; if (ui.lasttip instanceof WItem.ItemTip) { try { food = ItemInfo.find(GobbleInfo.class, ((WItem.ItemTip) ui.lasttip).item().info()); ch = ItemInfo.find(Alchemy.class, ((WItem.ItemTip) ui.lasttip).item().info()); } catch (Loading e) { } } if (lfood != food) { lfood = food; redraw(); } }
public static Tex rendertt(Resource res, boolean withpg, boolean hotkey) { Resource.AButton ad = res.layer(Resource.action); Resource.Pagina pg = res.layer(Resource.pagina); String tt = ad.name; BufferedImage xp = null, food = null; if (hotkey) { int pos = tt.toUpperCase().indexOf(Character.toUpperCase(ad.hk)); if (pos >= 0) tt = tt.substring(0, pos) + "$col[255,255,0]{" + tt.charAt(pos) + "}" + tt.substring(pos + 1); else if (ad.hk != 0) tt += " [" + ad.hk + "]"; } if (withpg) { if (pg != null) { tt += "\n\n" + pg.text; } xp = getXPgain(ad.name); food = getFood(ad.name); } BufferedImage img = ttfnd.render(tt, 300).img; if (xp != null) { img = ItemInfo.catimgs(3, img, xp); } if (food != null) { img = ItemInfo.catimgs(3, img, food); } return (new TexI(img)); }
public static BufferedImage getFood(String name) { Item itm = Wiki.get(name); if (itm != null) { Map<String, Float[]> food = itm.food; if (food != null) { Float[] heal = food.get("Heals"); Float[] salt = food.get("Salt"); Float[] merc = food.get("Mercury"); Float[] sulph = food.get("Sulphur"); Float[] lead = food.get("Lead"); int[] tempers = new int[4]; int[][] evs = new int[4][4]; for (int i = 0; i < 4; i++) { tempers[i] = (int) (1000 * heal[i]); evs[0][i] = (int) (1000 * salt[i]); evs[1][i] = (int) (1000 * merc[i]); evs[2][i] = (int) (1000 * sulph[i]); evs[3][i] = (int) (1000 * lead[i]); } FoodInfo fi = new FoodInfo(null, tempers); GobbleInfo gi = new GobbleInfo(null, evs, 0); return ItemInfo.catimgs(3, fi.longtip(), gi.longtip()); } } return null; }
protected boolean generate(TrackerWebPageRequest request, TrackerWebPageResponse response) throws IOException { InetSocketAddress local_address = request.getLocalAddress(); if (local_address == null) { return (false); } String host = local_address.getAddress().getHostAddress(); String url = request.getURL(); if (TRACE) { System.out.println("url: " + url); } if (!url.startsWith("/TiVoConnect?")) { return (false); } int pos = url.indexOf('?'); if (pos == -1) { return (false); } String[] bits = url.substring(pos + 1).split("&"); Map<String, String> args = new HashMap<String, String>(); for (String bit : bits) { String[] x = bit.split("="); args.put(x[0], URLDecoder.decode(x[1], "UTF-8")); } if (TRACE) { System.out.println("args: " + args); } // root folder /TiVoConnect?Command=QueryContainer&Container=%2F String command = args.get("Command"); if (command == null) { return (false); } String reply = null; if (command.equals("QueryContainer")) { String container = args.get("Container"); if (container == null) { return (false); } if (container.equals("/")) { reply = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" + NL + "<TiVoContainer>" + NL + " <Details>" + NL + " <Title>" + server_name + "</Title>" + NL + " <ContentType>x-container/tivo-server</ContentType>" + NL + " <SourceFormat>x-container/folder</SourceFormat>" + NL + " <TotalItems>1</TotalItems>" + NL + " </Details>" + NL + " <Item>" + NL + " <Details>" + NL + " <Title>" + server_name + "</Title>" + NL + " <ContentType>x-container/tivo-videos</ContentType>" + NL + " <SourceFormat>x-container/folder</SourceFormat>" + NL + " </Details>" + NL + " <Links>" + NL + " <Content>" + NL + " <Url>/TiVoConnect?Command=QueryContainer&Container=" + urlencode("/Content") + "</Url>" + NL + " <ContentType>x-container/tivo-videos</ContentType>" + NL + " </Content>" + NL + " </Links>" + NL + " </Item>" + NL + " <ItemStart>0</ItemStart>" + NL + " <ItemCount>1</ItemCount>" + NL + "</TiVoContainer>"; } else if (container.startsWith("/Content")) { boolean show_categories = getShowCategories(); String recurse = args.get("Recurse"); if (recurse != null && recurse.equals("Yes")) { show_categories = false; } TranscodeFileImpl[] tfs = getFiles(); String category_or_tag = null; Map<String, ContainerInfo> categories_or_tags = null; if (show_categories) { if (container.startsWith("/Content/")) { category_or_tag = container.substring(container.lastIndexOf('/') + 1); } else { categories_or_tags = new HashMap<String, ContainerInfo>(); } } // build list of applicable items List<ItemInfo> items = new ArrayList<ItemInfo>(tfs.length); for (TranscodeFileImpl file : tfs) { if (!file.isComplete()) { // see if we can set up a stream xcode for this but only if we // know the duration and the transcode is in progress (done in setup) if (!setupStreamXCode(file)) { continue; } } if (category_or_tag != null) { boolean hit = false; String[] cats = file.getCategories(); String[] tags = file.getTags(true); for (String[] strs : new String[][] {cats, tags}) { for (String c : strs) { if (c.equals(category_or_tag)) { hit = true; } } } if (!hit) { continue; } } FileInfo info = new FileInfo(file, host); if (info.isOK()) { boolean skip = false; if (categories_or_tags != null) { String[] cats = file.getCategories(); String[] tags = file.getTags(true); if (cats.length > 0 || tags.length > 0) { skip = true; for (String[] strs : new String[][] {cats, tags}) { for (String s : strs) { ContainerInfo cont = categories_or_tags.get(s); if (cont == null) { items.add(cont = new ContainerInfo(s)); categories_or_tags.put(s, cont); } cont.addChild(); } } } } if (!skip) { items.add(info); } } } // sort String sort_order = args.get("SortOrder"); if (sort_order != null) { String[] keys = Constants.PAT_SPLIT_COMMA.split(sort_order); final List<Comparator<ItemInfo>> comparators = new ArrayList<Comparator<ItemInfo>>(); final List<Boolean> reverses = new ArrayList<Boolean>(); for (String key : keys) { boolean reverse = false; if (key.startsWith("!")) { reverse = true; key = key.substring(1); } Comparator<ItemInfo> comp = sort_comparators.get(key); if (comp != null) { comparators.add(comp); reverses.add(reverse); } } if (comparators.size() > 0) { Collections.sort( items, new Comparator<ItemInfo>() { public int compare(ItemInfo i1, ItemInfo i2) { for (int i = 0; i < comparators.size(); i++) { Comparator<ItemInfo> comp = comparators.get(i); int res = comp.compare(i1, i2); if (res != 0) { if (reverses.get(i)) { if (res < 0) { res = 1; } else { res = -1; } } return (res); } } return (0); } }); } } // select items to return String item_count = args.get("ItemCount"); String anchor_offset = args.get("AnchorOffset"); String anchor = args.get("AnchorItem"); int num_items; if (item_count == null) { num_items = items.size(); } else { // can be negative if X items from end num_items = Integer.parseInt(item_count); } int anchor_index; // either one before or one after item to be returned depending on count // +ve/-ve if (num_items < 0) { anchor_index = items.size(); } else { anchor_index = -1; } if (anchor != null) { for (int i = 0; i < items.size(); i++) { ItemInfo info = items.get(i); if (anchor.equals(info.getLinkURL())) { anchor_index = i; } } } if (anchor_offset != null) { anchor_index += Integer.parseInt(anchor_offset); if (anchor_index < -1) { anchor_index = -1; } else if (anchor_index > items.size()) { anchor_index = items.size(); } } int start_index; int end_index; if (num_items > 0) { start_index = anchor_index + 1; end_index = anchor_index + num_items; } else { start_index = anchor_index + num_items; end_index = anchor_index - 1; } if (start_index < 0) { start_index = 0; } if (end_index >= items.size()) { end_index = items.size() - 1; } int num_to_return = end_index - start_index + 1; if (num_to_return < 0) { num_to_return = 0; } String machine = getMachineName(); if (machine == null) { // default until we find out what it is - can't see any way to get it apart from wait for // broadcast machine = "TivoHDDVR"; } String header = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" + NL + "<TiVoContainer>" + NL + " <Tivos>" + NL + " <Tivo>" + machine + "</Tivo>" + NL + " </Tivos>" + NL + " <ItemStart>" + start_index + "</ItemStart>" + NL + " <ItemCount>" + num_to_return + "</ItemCount>" + NL + " <Details>" + NL + " <Title>" + escape(container) + "</Title>" + NL + " <ContentType>x-container/tivo-videos</ContentType>" + NL + " <SourceFormat>x-container/folder</SourceFormat>" + NL + " <TotalItems>" + items.size() + "</TotalItems>" + NL + " </Details>" + NL; reply = header; for (int i = start_index; i <= end_index; i++) { ItemInfo item = items.get(i); if (item instanceof FileInfo) { FileInfo file = (FileInfo) item; long file_size = file.getTargetSize(); String title = escape(file.getName()); String desc = title; int MAX_TITLE_LENGTH = 30; if (title.length() > MAX_TITLE_LENGTH) { // TiVo has problems displaying a truncated title if it has // no spaces in it String temp = ""; for (int j = 0; j < title.length(); j++) { char c = title.charAt(j); if (Character.isLetterOrDigit(c)) { temp += c; } else { temp += ' '; } } int space_pos = temp.indexOf(' '); if (space_pos == -1 || space_pos > MAX_TITLE_LENGTH) { temp = temp.substring(0, 30) + "..."; } title = temp; } reply += " <Item>" + NL + " <Details>" + NL + " <Title>" + title + "</Title>" + NL + " <ContentType>video/x-tivo-mpeg</ContentType>" + NL + " <SourceFormat>video/x-ms-wmv</SourceFormat>" + NL; if (file_size > 0) { reply += " <SourceSize>" + file_size + "</SourceSize>" + NL; } else { long est_size = file.getEstimatedTargetSize(); if (est_size > 0) { reply += " <SourceSize>" + est_size + "</SourceSize>" + NL; } } reply += " <Duration>" + file.getDurationMillis() + "</Duration>" + NL + " <Description>" + desc + "</Description>" + NL + " <SourceChannel>0</SourceChannel>" + NL + " <SourceStation></SourceStation>" + NL + " <SeriesId></SeriesId>" + NL + " <CaptureDate>" + file.getCaptureDate() + "</CaptureDate>" + NL + " </Details>" + NL + " <Links>" + NL + " <Content>" + NL + " <ContentType>video/x-tivo-mpeg</ContentType>" + NL + " <AcceptsParams>No</AcceptsParams>" + NL + " <Url>" + file.getLinkURL() + "</Url>" + NL + " </Content>" + NL + " <CustomIcon>" + NL + " <ContentType>video/*</ContentType>" + NL + " <AcceptsParams>No</AcceptsParams>" + NL + " <Url>urn:tivo:image:save-until-i-delete-recording</Url>" + NL + " </CustomIcon>" + NL + " </Links>" + NL + " </Item>" + NL; } else { ContainerInfo cont = (ContainerInfo) item; reply += " <Item>" + NL + " <Details>" + NL + " <Title>" + cont.getName() + "</Title>" + NL + " <ContentType>x-container/tivo-videos</ContentType>" + NL + " <SourceFormat>x-container/folder</SourceFormat>" + NL + " <TotalItems>" + cont.getChildCount() + "</TotalItems>" + NL + " </Details>" + NL + " <Links>" + NL + " <Content>" + NL + " <Url>" + cont.getLinkURL() + "</Url>" + NL + " <ContentType>x-container/tivo-videos</ContentType>" + NL + " </Content>" + NL + " </Links>" + NL + " </Item>" + NL; } } String footer = "</TiVoContainer>"; reply += footer; } } else if (command.equals("QueryFormats")) { String source_format = args.get("SourceFormat"); if (source_format != null && source_format.startsWith("video")) { // /TiVoConnect?Command=QueryFormats&SourceFormat=video%2Fx-tivo-mpeg reply = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + NL + "<TiVoFormats><Format>" + NL + "<ContentType>video/x-tivo-mpeg</ContentType><Description/>" + NL + "</Format></TiVoFormats>"; } } if (reply == null) { return (false); } if (TRACE) { System.out.println("->" + reply); } response.setContentType("text/xml"); response.getOutputStream().write(reply.getBytes("UTF-8")); return (true); }