package net.rebotted.cache.graphics; import java.awt.Color; import org.rebotted.cache.FileArchive; import org.rebotted.cache.graphics.GameFont; import org.rebotted.cache.graphics.Sprite; import org.rebotted.draw.Rasterizer2D; import org.rebotted.io.Buffer; public class RSFont extends Rasterizer2D { public int baseCharacterHeight = 0; public int anInt4142; public int anInt4144; public int[] characterDrawYOffsets; public int[] characterHeights; public int[] characterDrawXOffsets; public int[] characterWidths; public int[] iconWidths; public byte[] aByteArray4151; public byte[][] fontPixels; public int[] characterScreenWidths; public static Sprite[] chatImages; public static Sprite[] clanImages; public static String aRSString_4135; public static String startTransparency; public static String startDefaultShadow; public static String endShadow = "/shad"; public static String endEffect; public static String aRSString_4143; public static String endStrikethrough = "/str"; public static String aRSString_4147; public static String startColor; public static String lineBreak; public static String startStrikethrough; public static String endColor; public static String startImage; public static String startClanImage; public static String endUnderline; public static String defaultStrikethrough; public static String startShadow; public static String startEffect; public static String aRSString_4162; public static String aRSString_4163; public static String endTransparency; public static String aRSString_4165; public static String startUnderline; public static String startDefaultUnderline; public static String aRSString_4169; public static String[] splitTextStrings; public static int defaultColor; public static int textShadowColor; public static int strikethroughColor; public static int defaultTransparency; public static int anInt4175; public static int underlineColor; public static int defaultShadow; public static int anInt4178; public static int transparency; public static int textColor; public RSFont(boolean TypeFont, String s, FileArchive archive) { fontPixels = new byte[256][]; characterWidths = new int[256]; characterHeights = new int[256]; characterDrawXOffsets = new int[256]; characterDrawYOffsets = new int[256]; characterScreenWidths = new int[256]; Buffer stream = new Buffer(archive.readFile(s + ".dat")); Buffer stream_1 = new Buffer(archive.readFile("index.dat")); stream_1.currentPosition = stream.readUShort() + 4; int k = stream_1.readUnsignedByte(); if (k > 0) { stream_1.currentPosition += 3 * (k - 1); } for (int l = 0; l < 256; l++) { characterDrawXOffsets[l] = stream_1.readUnsignedByte(); characterDrawYOffsets[l] = stream_1.readUnsignedByte(); int i1 = characterWidths[l] = stream_1.readUShort(); int j1 = characterHeights[l] = stream_1.readUShort(); int k1 = stream_1.readUnsignedByte(); int l1 = i1 * j1; fontPixels[l] = new byte[l1]; if (k1 == 0) { for (int i2 = 0; i2 < l1; i2++) { fontPixels[l][i2] = stream.readSignedByte(); } } else if (k1 == 1) { for (int j2 = 0; j2 < i1; j2++) { for (int l2 = 0; l2 < j1; l2++) { fontPixels[l][j2 + l2 * i1] = stream.readSignedByte(); } } } if (j1 > baseCharacterHeight && l < 128) { baseCharacterHeight = j1; } characterDrawXOffsets[l] = 1; characterScreenWidths[l] = i1 + 2; int k2 = 0; for (int i3 = j1 / 7; i3 < j1; i3++) { k2 += fontPixels[l][i3 * i1]; } if (k2 <= j1 / 7) { characterScreenWidths[l]--; characterDrawXOffsets[l] = 0; } k2 = 0; for (int j3 = j1 / 7; j3 < j1; j3++) { k2 += fontPixels[l][(i1 - 1) + j3 * i1]; } if (k2 <= j1 / 7) { characterScreenWidths[l]--; } } if (TypeFont) { characterScreenWidths[32] = characterScreenWidths[73]; } else { characterScreenWidths[32] = characterScreenWidths[105]; } } public void drawStringMoveY(String string, int drawX, int drawY, int color, int shadow, int randomMod, int randomMod2) { if (string != null) { setColorAndShadow(color, shadow); double d = 7.0 - (double) randomMod2 / 8.0; if (d < 0.0) { d = 0.0; } int[] yOffset = new int[string.length()]; for (int index = 0; index < string.length(); index++) { yOffset[index] = (int) (Math.sin((double) index / 1.5 + (double) randomMod) * d); } drawBaseStringMoveXY(string, drawX - getTextWidth(string) / 2, drawY, null, yOffset); } } public int getCharacterWidth(int i) { return characterScreenWidths[i & 0xff]; } public void setTrans(int i, int j, int k) { textShadowColor = defaultShadow = i; textColor = defaultColor = j; transparency = defaultTransparency = k; } public void drawCenteredString(String s, int i, int j) { if(s != null) drawBasicString(s, i - getTextWidth(s) / 2, j); } public void setDefaultTextEffectValues(int color, int shadow, int trans) { strikethroughColor = -1; underlineColor = -1; textShadowColor = defaultShadow = shadow; textColor = defaultColor = color; transparency = defaultTransparency = trans; anInt4178 = 0; anInt4175 = 0; } public static int method1014(byte[][] is, byte[][] is_27_, int[] is_28_, int[] is_29_, int[] is_30_, int i, int i_31_) { int i_32_ = is_28_[i]; int i_33_ = i_32_ + is_30_[i]; int i_34_ = is_28_[i_31_]; int i_35_ = i_34_ + is_30_[i_31_]; int i_36_ = i_32_; if (i_34_ > i_32_) { i_36_ = i_34_; } int i_37_ = i_33_; if (i_35_ < i_33_) { i_37_ = i_35_; } int i_38_ = is_29_[i]; if (is_29_[i_31_] < i_38_) { i_38_ = is_29_[i_31_]; } byte[] is_39_ = is_27_[i]; byte[] is_40_ = is[i_31_]; int i_41_ = i_36_ - i_32_; int i_42_ = i_36_ - i_34_; for (int i_43_ = i_36_; i_43_ < i_37_; i_43_++) { int i_44_ = is_39_[i_41_++] + is_40_[i_42_++]; if (i_44_ < i_38_) { i_38_ = i_44_; } } return -i_38_; } public void drawCenteredStringMoveXY(String string, int drawX, int drawY, int color, int shadow, int randomMod) { if (string != null) { setColorAndShadow(color, shadow); int[] xMods = new int[string.length()]; int[] yMods = new int[string.length()]; for (int index = 0; index < string.length(); index++) { xMods[index] = (int) (Math.sin((double) index / 5.0 + (double) randomMod / 5.0) * 5.0); yMods[index] = (int) (Math.sin((double) index / 3.0 + (double) randomMod / 5.0) * 5.0); } drawBaseStringMoveXY(string, drawX - getTextWidth(string) / 2, drawY, xMods, yMods); } } public void drawCenteredStringMoveY(String class100, int drawX, int drawY, int color, int shadow, int i_54_) { if (class100 != null) { setColorAndShadow(color, shadow); int[] yOffset = new int[class100.length()]; for (int index = 0; index < class100.length(); index++) { yOffset[index] = (int) (Math.sin((double) index / 2.0 + (double) i_54_ / 5.0) * 5.0); } drawBaseStringMoveXY(class100, drawX - getTextWidth(class100) / 2, drawY, null, yOffset); } } public static void unpackImages(Sprite[] icons, Sprite[] clan) { chatImages = icons; clanImages = clan; } public void drawBasicString(String string, int drawX, int drawY) { drawY -= baseCharacterHeight; int startIndex = -1; string = handleOldSyntax(string); for (int currentCharacter = 0; currentCharacter < string.length(); currentCharacter++) { int character = string.charAt(currentCharacter); if (character > 255) { character = 32; } if (character == 60) { startIndex = currentCharacter; } else { if (character == 62 && startIndex != -1) { String effectString = string.substring(startIndex + 1, currentCharacter); startIndex = -1; if (effectString.equals(startEffect)) { character = 60; } else if (effectString.equals(endEffect)) { character = 62; } else if (effectString.equals(aRSString_4135)) { character = 160; } else if (effectString.equals(aRSString_4162)) { character = 173; } else if (effectString.equals(aRSString_4165)) { character = 215; } else if (effectString.equals(aRSString_4147)) { character = 128; } else if (effectString.equals(aRSString_4163)) { character = 169; } else if (effectString.equals(aRSString_4169)) { character = 174; } else { if (effectString.startsWith(startImage)) { try { int imageId = Integer.valueOf(effectString.substring(4)); Sprite chatImageId = chatImages[imageId]; int iconModY = chatImageId.getMaxHeight(); if (transparency == 256) { chatImageId.method346(drawX, (drawY + baseCharacterHeight - iconModY)); } else { chatImageId.drawSprite(drawX,(drawY + baseCharacterHeight - iconModY), transparency); } drawX += chatImageId.getMaxWidth(); } catch (Exception exception) { /* empty */ } } else if (effectString.startsWith(startClanImage)) { try { int imageId = Integer.valueOf(effectString .substring(5)); Sprite icon = clanImages[imageId]; int iconModY = icon.getMyHeight() + icon.getOffsetY() + 1; if (transparency == 256) { icon.drawSprite(drawX, (drawY + baseCharacterHeight - iconModY)); } else { icon.drawSprite(drawX, (drawY + baseCharacterHeight - iconModY), transparency); } drawX += 11; } catch (Exception exception) { exception.printStackTrace(); } } else { setTextEffects(effectString); } continue; } } if (startIndex == -1) { int width = characterWidths[character]; int height = characterHeights[character]; if (character != 32) { if (transparency == 256) { if (textShadowColor != -1) { drawCharacter(character, drawX + characterDrawXOffsets[character] + 1, drawY + characterDrawYOffsets[character] + 1, width, height, textShadowColor, true); } drawCharacter(character, drawX + characterDrawXOffsets[character], drawY + characterDrawYOffsets[character], width, height, textColor, false); } else { if (textShadowColor != -1) { drawTransparentCharacter(character, drawX + characterDrawXOffsets[character] + 1, drawY + characterDrawYOffsets[character] + 1, width, height, textShadowColor, transparency, true); } drawTransparentCharacter(character, drawX + characterDrawXOffsets[character], drawY + characterDrawYOffsets[character], width, height, textColor, transparency, false); } } else if (anInt4178 > 0) { anInt4175 += anInt4178; drawX += anInt4175 >> 8; anInt4175 &= 0xff; } int lineWidth = characterScreenWidths[character]; if (strikethroughColor != -1) { GameFont.drawHorizontalLine(drawX, drawY + (int) ((double) baseCharacterHeight * 0.69999999999999996D), lineWidth, strikethroughColor); } if (underlineColor != -1) { GameFont.drawHorizontalLine(drawX, drawY + baseCharacterHeight, lineWidth, underlineColor); } drawX += lineWidth; } } } } public void drawRAString(String string, int drawX, int drawY, int color, int shadow) { if (string != null) { setColorAndShadow(color, shadow); drawBasicString(string, drawX - getTextWidth(string), drawY); } } public void drawBaseStringMoveXY(String string, int drawX, int drawY, int[] xModifier, int[] yModifier) { drawY -= baseCharacterHeight; int startIndex = -1; int modifierOffset = 0; for (int currentCharacter = 0; currentCharacter < string.length(); currentCharacter++) { int character = string.charAt(currentCharacter); if (character == 60) { startIndex = currentCharacter; } else { if (character == 62 && startIndex != -1) { String effectString = string.substring(startIndex + 1, currentCharacter); startIndex = -1; if (effectString.equals(startEffect)) { character = 60; } else if (effectString.equals(endEffect)) { character = 62; } else if (effectString.equals(aRSString_4135)) { character = 160; } else if (effectString.equals(aRSString_4162)) { character = 173; } else if (effectString.equals(aRSString_4165)) { character = 215; } else if (effectString.equals(aRSString_4147)) { character = 128; } else if (effectString.equals(aRSString_4163)) { character = 169; } else if (effectString.equals(aRSString_4169)) { character = 174; } else { if (effectString.startsWith(startImage)) { try { int xModI; if (xModifier != null) { xModI = xModifier[modifierOffset]; } else { xModI = 0; } int yMod; if (yModifier != null) { yMod = yModifier[modifierOffset]; } else { yMod = 0; } modifierOffset++; int iconId = Integer.valueOf(effectString.substring(4)); Sprite class92 = chatImages[iconId]; int iconOffsetY = class92.getMaxHeight(); if (transparency == 256) { class92.drawSprite(drawX + xModI, (drawY + baseCharacterHeight - iconOffsetY + yMod)); } else { class92.drawSprite(drawX + xModI, (drawY + baseCharacterHeight - iconOffsetY + yMod), transparency); } drawX += class92.getMaxWidth(); } catch (Exception exception) { /* empty */ } } else { setTextEffects(effectString); } continue; } } if (startIndex == -1) { int width = characterWidths[character]; int height = characterHeights[character]; int xOff; if (xModifier != null) { xOff = xModifier[modifierOffset]; } else { xOff = 0; } int yOff; if (yModifier != null) { yOff = yModifier[modifierOffset]; } else { yOff = 0; } modifierOffset++; if (character != 32) { if (transparency == 256) { if (textShadowColor != -1) { drawCharacter(character, (drawX + characterDrawXOffsets[character] + 1 + xOff), (drawY + characterDrawYOffsets[character] + 1 + yOff), width, height, textShadowColor, true); } drawCharacter(character, drawX + characterDrawXOffsets[character] + xOff, drawY + characterDrawYOffsets[character] + yOff, width, height, textColor, false); } else { if (textShadowColor != -1) { drawTransparentCharacter(character, (drawX + characterDrawXOffsets[character] + 1 + xOff), (drawY + characterDrawYOffsets[character] + 1 + yOff), width, height, textShadowColor, transparency, true); } drawTransparentCharacter(character, drawX + characterDrawXOffsets[character] + xOff, drawY + characterDrawYOffsets[character] + yOff, width, height, textColor, transparency, false); } } else if (anInt4178 > 0) { anInt4175 += anInt4178; drawX += anInt4175 >> 8; anInt4175 &= 0xff; } int i_109_ = characterScreenWidths[character]; if (strikethroughColor != -1) { GameFont.drawHorizontalLine(drawX, drawY + (int) ((double) baseCharacterHeight * 0.7), i_109_, strikethroughColor); } if (underlineColor != -1) { GameFont.drawHorizontalLine(drawX, drawY + baseCharacterHeight, i_109_, underlineColor); } drawX += i_109_; } } } } public void setTextEffects(String string) { do { try { if (string.startsWith(startColor)) { String color = string.substring(4); textColor = color.length() < 6 ? Color.decode(color).getRGB() : Integer.parseInt(color, 16); } else if (string.equals(endColor)) { textColor = defaultColor; } else if (string.startsWith(startTransparency)) { transparency = Integer.valueOf(string.substring(6)); } else if (string.equals(endTransparency)) { transparency = defaultTransparency; } else if (string.startsWith(startStrikethrough)) { strikethroughColor = Integer.valueOf(string.substring(4)); } else if (string.equals(defaultStrikethrough)) { strikethroughColor = 8388608; } else if (string.equals(endStrikethrough)) { strikethroughColor = -1; } else if (string.startsWith(startUnderline)) { underlineColor = Integer.valueOf(string.substring(2)); } else if (string.equals(startDefaultUnderline)) { underlineColor = 0; } else if (string.equals(endUnderline)) { underlineColor = -1; } else if (string.startsWith(startShadow)) { textShadowColor = Integer.valueOf(string.substring(5)); } else if (string.equals(startDefaultShadow)) { textShadowColor = 0; } else if (string.equals(endShadow)) { textShadowColor = defaultShadow; } else { if (!string.equals(lineBreak)) { break; } setDefaultTextEffectValues(defaultColor, defaultShadow, defaultTransparency); } } catch (Exception exception) { break; } break; } while (false); } public void setColorAndShadow(int color, int shadow) { strikethroughColor = -1; underlineColor = -1; textShadowColor = defaultShadow = shadow; textColor = defaultColor = color; transparency = defaultTransparency = 256; anInt4178 = 0; anInt4175 = 0; } public int getTextWidth(String string) { if (string == null) { return 0; } int startIndex = -1; int finalWidth = 0; for (int currentCharacter = 0; currentCharacter < string.length(); currentCharacter++) { int character = string.charAt(currentCharacter); if (character > 255) { character = 32; } if (character == 60) { startIndex = currentCharacter; } else { if (character == 62 && startIndex != -1) { String effectString = string.substring(startIndex + 1, currentCharacter); startIndex = -1; if (effectString.equals(startEffect)) { character = 60; } else if (effectString.equals(endEffect)) { character = 62; } else if (effectString.equals(aRSString_4135)) { character = 160; } else if (effectString.equals(aRSString_4162)) { character = 173; } else if (effectString.equals(aRSString_4165)) { character = 215; } else if (effectString.equals(aRSString_4147)) { character = 128; } else if (effectString.equals(aRSString_4163)) { character = 169; } else if (effectString.equals(aRSString_4169)) { character = 174; } else { if (effectString.startsWith(startImage)) { try {//> 8; i_7_ = 256 - i_7_; for (int i_8_ = -i_4_; i_8_ < 0; i_8_++) { for (int i_9_ = -i_3_; i_9_ < 0; i_9_++) { if (is_0_[i_1_++] != 0) { int i_10_ = is[i_2_]; is[i_2_++] = ((((i_10_ & 0xff00ff) * i_7_ & ~0xff00ff) + ((i_10_ & 0xff00) * i_7_ & 0xff0000)) >> 8) + i; } else { i_2_++; } } i_2_ += i_5_; i_1_ += i_6_; } } public void drawTransparentCharacter(int i, int i_11_, int i_12_, int i_13_, int i_14_, int i_15_, int i_16_, boolean bool) { int i_17_ = i_11_ + i_12_ * Rasterizer2D.width; int i_18_ = Rasterizer2D.width - i_13_; int i_19_ = 0; int i_20_ = 0; if (i_12_ < Rasterizer2D.topY) { int i_21_ = Rasterizer2D.topY - i_12_; i_14_ -= i_21_; i_12_ = Rasterizer2D.topY; i_20_ += i_21_ * i_13_; i_17_ += i_21_ * Rasterizer2D.width; } if (i_12_ + i_14_ > Rasterizer2D.bottomY) { i_14_ -= i_12_ + i_14_ - Rasterizer2D.bottomY; } if (i_11_ < Rasterizer2D.leftX) { int i_22_ = Rasterizer2D.leftX - i_11_; i_13_ -= i_22_; i_11_ = Rasterizer2D.leftX; i_20_ += i_22_; i_17_ += i_22_; i_19_ += i_22_; i_18_ += i_22_; } if (i_11_ + i_13_ > Rasterizer2D.bottomX) { int i_23_ = i_11_ + i_13_ - Rasterizer2D.bottomX; i_13_ -= i_23_; i_19_ += i_23_; i_18_ += i_23_; } if (i_13_ > 0 && i_14_ > 0) { createTransparentCharacterPixels(Rasterizer2D.pixels, fontPixels[i], i_15_ ,i_20_, i_17_, i_13_, i_14_, i_18_, i_19_, i_16_); } } public static void createCharacterPixels(int[] is, byte[] is_24_, int i, int i_25_, int i_26_, int i_27_, int i_28_, int i_29_, int i_30_) { int i_31_ = -(i_27_ >> 2); i_27_ = -(i_27_ & 0x3); for (int i_32_ = -i_28_; i_32_ < 0; i_32_++) { for (int i_33_ = i_31_; i_33_ < 0; i_33_++) { if (is_24_[i_25_++] != 0) { is[i_26_++] = i; } else { i_26_++; } if (is_24_[i_25_++] != 0) { is[i_26_++] = i; } else { i_26_++; } if (is_24_[i_25_++] != 0) { is[i_26_++] = i; } else { i_26_++; } if (is_24_[i_25_++] != 0) { is[i_26_++] = i; } else { i_26_++; } } for (int i_34_ = i_27_; i_34_ < 0; i_34_++) { if (is_24_[i_25_++] != 0) { is[i_26_++] = i; } else { i_26_++; } } i_26_ += i_29_; i_25_ += i_30_; } } public static String handleOldSyntax(String text) { text = text.replaceAll("@red@", ""); text = text.replaceAll("@gre@", ""); text = text.replaceAll("@blu@", ""); text = text.replaceAll("@yel@", ""); text = text.replaceAll("@cya@", ""); text = text.replaceAll("@mag@", ""); text = text.replaceAll("@whi@", ""); text = text.replaceAll("@lre@", ""); text = text.replaceAll("@dre@", ""); text = text.replaceAll("@bla@", ""); text = text.replaceAll("@or1@", ""); text = text.replaceAll("@or2@", ""); text = text.replaceAll("@or3@", ""); text = text.replaceAll("@gr1@", ""); text = text.replaceAll("@gr2@", ""); text = text.replaceAll("@gr3@", ""); text = text.replaceAll("@RED@", ""); text = text.replaceAll("@GRE@", ""); text = text.replaceAll("@BLU@", ""); text = text.replaceAll("@YEL@", ""); text = text.replaceAll("@CYA@", ""); text = text.replaceAll("@MAG@", ""); text = text.replaceAll("@WHI@", ""); text = text.replaceAll("@LRE@", ""); text = text.replaceAll("@DRE@", ""); text = text.replaceAll("@BLA@", ""); text = text.replaceAll("@OR1@", ""); text = text.replaceAll("@OR2@", ""); text = text.replaceAll("@OR3@", ""); text = text.replaceAll("@GR1@", ""); text = text.replaceAll("@GR2@", ""); text = text.replaceAll("@GR3@", ""); text = text.replaceAll("@cr1@", ""); text = text.replaceAll("@cr2@", ""); text = text.replaceAll("@cr3@", ""); text = text.replaceAll("@cr4@", ""); text = text.replaceAll("@cr5@", ""); text = text.replaceAll("@cr6@", ""); return text; } public void drawCharacter(int character, int i_35_, int i_36_, int i_37_, int i_38_, int i_39_, boolean bool) { int i_40_ = i_35_ + i_36_ * Rasterizer2D.width; int i_41_ = Rasterizer2D.width - i_37_; int i_42_ = 0; int i_43_ = 0; if (i_36_ < Rasterizer2D.topY) { int i_44_ = Rasterizer2D.topY - i_36_; i_38_ -= i_44_; i_36_ = Rasterizer2D.topY; i_43_ += i_44_ * i_37_; i_40_ += i_44_ * Rasterizer2D.width; } if (i_36_ + i_38_ > Rasterizer2D.bottomY) { i_38_ -= i_36_ + i_38_ - Rasterizer2D.bottomY; } if (i_35_ < Rasterizer2D.leftX) { int i_45_ = Rasterizer2D.leftX - i_35_; i_37_ -= i_45_; i_35_ = Rasterizer2D.leftX; i_43_ += i_45_; i_40_ += i_45_; i_42_ += i_45_; i_41_ += i_45_; } if (i_35_ + i_37_ > Rasterizer2D.bottomX) { int i_46_ = i_35_ + i_37_ - Rasterizer2D.bottomX; i_37_ -= i_46_; i_42_ += i_46_; i_41_ += i_46_; } if (i_37_ > 0 && i_38_ > 0) { createCharacterPixels(Rasterizer2D.pixels, fontPixels[character], i_39_, i_43_, i_40_, i_37_, i_38_, i_41_, i_42_); } } static { startTransparency = "trans="; startStrikethrough = "str="; startDefaultShadow = "shad"; startColor = "col="; lineBreak = "br"; defaultStrikethrough = "str"; endUnderline = "/u"; startImage = "img="; startClanImage = "clan="; startShadow = "shad="; startUnderline = "u="; endColor = "/col"; startDefaultUnderline = "u"; endTransparency = "/trans"; aRSString_4143 = Integer.toString(100); aRSString_4135 = "nbsp"; aRSString_4169 = "reg"; aRSString_4165 = "times"; aRSString_4162 = "shy"; aRSString_4163 = "copy"; endEffect = "gt"; aRSString_4147 = "euro"; startEffect = "lt"; defaultTransparency = 256; defaultShadow = -1; anInt4175 = 0; textShadowColor = -1; textColor = 0; defaultColor = 0; strikethroughColor = -1; splitTextStrings = new String[100]; underlineColor = -1; anInt4178 = 0; transparency = 256; } }