package ttftcuts.physis.common.helper; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.relauncher.Side; import ttftcuts.physis.Physis; import ttftcuts.physis.api.artifact.IArtifactEffect; import ttftcuts.physis.api.artifact.IArtifactTrigger; import ttftcuts.physis.common.artifact.PhysisArtifacts; import ttftcuts.physis.common.story.StoryEngine; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.StatCollector; public class LocalizationHelper { public final String journalPrefix = "physis.journal."; public final String titlePrefix = journalPrefix +"title."; public final String articlePrefix = journalPrefix +"text."; public final String categoryPrefix = journalPrefix +"category."; public final String imagePrefix = journalPrefix + "image."; private static Pattern deepFormatPattern = Pattern.compile("%\\d*\\$s"); private static Pattern translatePattern = Pattern.compile("\\^([^\\^]*?)\\^"); private static Pattern storyVarPattern = Pattern.compile("\\#([^\\#]*?)\\#"); public LocalizationHelper() { } public String translate(String input) { String output = this.translateInternal(input); return replaceColourStrings(output); } private String translateInternal(String input) { String output = StatCollector.translateToLocal(replaceStoryVariables(input)); Matcher m = translatePattern.matcher(output); while(m.find()) { String s = m.group(1); String translated = this.translateInternal(s); output = output.replace("^"+m.group(1)+"^", translated); } return output; } public String replaceColourStrings(String input) { return input.replace("\\n", "\n").replace("@r", "@r@0").replace('@', '\u00a7'); } public String replaceStoryVariables(String input) { Matcher m = storyVarPattern.matcher(input); while(m.find()) { String s = m.group(1); Side side = FMLCommonHandler.instance().getEffectiveSide(); int storyval = StoryEngine.get(s, side == Side.CLIENT); String value = storyval == -1 ? "[Missing story var \""+s+"\"]" : String.valueOf(storyval); input = input.replace("#"+m.group(1)+"#", value); } return input; } @SuppressWarnings("unchecked") public List<String> wrapText(String input, int width) { FontRenderer fr = Minecraft.getMinecraft().fontRenderer; if (input == null) { return new ArrayList<String>(); } List<String> output = fr.listFormattedStringToWidth(input, width); return output; } public List<String> translateAndWrap(String input, int width) { return wrapText(translate(input), width); } public String ticksToSeconds2dp(int ticks) { double seconds = ticks / 20.0; double rounded = Math.round(seconds*100.0)/100.0; if (rounded % 1.0 == 0.0) { return String.valueOf((int)rounded); } return String.valueOf(rounded); } public String deepFormat(String input, String... args) { String output = Physis.text.translate(input); while (deepFormatPattern.matcher(output).find()) { try { output = String.format(output, (Object[])args); } catch (Exception e) { Physis.logger.warn("Formatting error: "+e.getLocalizedMessage()); break; } } return output; } public String formatArtifactNames(String input, ItemStack stack) { String output = this.translate(input); NBTTagCompound tag = stack.stackTagCompound.getCompoundTag(PhysisArtifacts.ARTIFACTTAG); if (tag.hasKey(PhysisArtifacts.TRIGGERTAG) && tag.hasKey(PhysisArtifacts.EFFECTTAG)) { IArtifactTrigger trigger = PhysisArtifacts.getTriggerFromSocketable(stack); IArtifactEffect effect = PhysisArtifacts.getEffectFromSocketable(stack); if (trigger != null && effect != null) { output = this.deepFormat(output, this.translate(effect.getUnlocalizedEffectString()), this.translate(trigger.getUnlocalizedTargetString()), this.ticksToSeconds2dp(effect.getCooldown(trigger.getCooldownCategory())), this.ticksToSeconds2dp(effect.getDuration(trigger.getCooldownCategory())), trigger.getTooltipInfo(), effect.getTooltipInfo() ); } } return output; } }