deep-c-rsc/mudclient204-headless/Surface.java

2016 lines
70 KiB
Java

public class Surface {
public static int anInt346;
public static int anInt347;
public static int anInt348;
static byte gameFonts[][] = new byte[50][];
static int characterWidth[];
public int width2;
public int height2;
public int area;
public int width1;
public int height1;
public int pixels[];
//private Component unused;
//public Image image;
public int surfacePixels[][];
public byte spriteColoursUsed[][];
public int spriteColourList[][];
public int spriteWidth[];
public int spriteHeight[];
public int spriteTranslateX[];
public int spriteTranslateY[];
public int spriteWidthFull[];
public int spriteHeightFull[];
public boolean spriteTranslate[];
public boolean interlace;
public boolean loggedIn;
//ColorModel colorModel;
//ImageConsumer imageconsumer;
int landscapeColours[];
int anIntArray340[];
int anIntArray341[];
int anIntArray342[];
int anIntArray343[];
int anIntArray344[];
int anIntArray345[];
private int boundsTopY;
private int boundsBottomY;
private int boundsTopX;
private int boundsBottomX;
static {
String s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!\"\243$%^&*()-_=+[{]};:'@#~,<.>/?\\| ";
characterWidth = new int[256];
for (int i = 0; i < 256; i++) {
int j = s.indexOf(i);
if (j == -1)
j = 74;
characterWidth[i] = j * 9;
}
}
public Surface(int width, int height, int limit, mudclient component) {
interlace = false;
loggedIn = false;
//unused = component;
boundsBottomY = height;
boundsBottomX = width;
width1 = width2 = width;
height1 = height2 = height;
area = width * height;
pixels = new int[width * height];
surfacePixels = new int[limit][];
spriteTranslate = new boolean[limit];
spriteColoursUsed = new byte[limit][];
spriteColourList = new int[limit][];
spriteWidth = new int[limit];
spriteHeight = new int[limit];
spriteWidthFull = new int[limit];
spriteHeightFull = new int[limit];
spriteTranslateX = new int[limit];
spriteTranslateY = new int[limit];
/*
if (width > 1 && height > 1 && component != null) {
colorModel = new DirectColorModel(32, 0xff0000, 65280, 255);
int l = width2 * height2;
for (int i1 = 0; i1 < l; i1++)
pixels[i1] = 0;
image = component.createImage(this);
setcomplete();
component.prepareImage(image, component);
setcomplete();
component.prepareImage(image, component);
setcomplete();
component.prepareImage(image, component);
}*/
}
public static int rgb2long(int red, int green, int blue) {
return (red << 16) + (green << 8) + blue;
}
public static void createFont(byte bytes[], int id) {
gameFonts[id] = bytes;
}
/*public synchronized void addConsumer(ImageConsumer imageconsumer) {
this.imageconsumer = imageconsumer;
imageconsumer.setDimensions(width2, height2);
imageconsumer.setProperties(null);
imageconsumer.setColorModel(colorModel);
imageconsumer.setHints(14);
}
public synchronized boolean isConsumer(ImageConsumer imageconsumer) {
return this.imageconsumer == imageconsumer;
}
public synchronized void removeConsumer(ImageConsumer imageconsumer) {
if (this.imageconsumer == imageconsumer)
this.imageconsumer = null;
}
public void startProduction(ImageConsumer imageconsumer) {
addConsumer(imageconsumer);
}
public void requestTopDownLeftRightResend(ImageConsumer imageconsumer) {
System.out.println("TDLR");
}*/
public synchronized void setcomplete() {
/*if (imageconsumer == null) {
return;
} else {
imageconsumer.setPixels(0, 0, width2, height2, colorModel, pixels, 0, width2);
imageconsumer.imageComplete(2);
return;
}*/
}
public void setBounds(int x1, int y1, int x2, int y2) {
if (x1 < 0)
x1 = 0;
if (y1 < 0)
y1 = 0;
if (x2 > width2)
x2 = width2;
if (y2 > height2)
y2 = height2;
boundsTopX = x1;
boundsTopY = y1;
boundsBottomX = x2;
boundsBottomY = y2;
}
public void resetBounds() {
boundsTopX = 0;
boundsTopY = 0;
boundsBottomX = width2;
boundsBottomY = height2;
}
public void draw(/*Graphics g,*/int x, int y) {
setcomplete();
//g.drawImage(image, x, y, this);
}
public void blackScreen() {
int area = width2 * height2;
if (!interlace) {
for (int j = 0; j < area; j++)
pixels[j] = 0;
return;
}
int k = 0;
for (int l = -height2; l < 0; l += 2) {
for (int i1 = -width2; i1 < 0; i1++)
pixels[k++] = 0;
k += width2;
}
}
public void drawCircle(int x, int y, int radius, int colour, int alpha) {
int bgAlpha = 256 - alpha;
int red = (colour >> 16 & 0xff) * alpha;
int green = (colour >> 8 & 0xff) * alpha;
int blue = (colour & 0xff) * alpha;
int top = y - radius;
if (top < 0)
top = 0;
int bottom = y + radius;
if (bottom >= height2)
bottom = height2 - 1;
byte vertInc = 1;
if (interlace) {
vertInc = 2;
if ((top & 1) != 0)
top++;
}
for (int yy = top; yy <= bottom; yy += vertInc) {
int l3 = yy - y;
int i4 = (int) Math.sqrt(radius * radius - l3 * l3);
int j4 = x - i4;
if (j4 < 0)
j4 = 0;
int k4 = x + i4;
if (k4 >= width2)
k4 = width2 - 1;
int pixelIdx = j4 + yy * width2;
for (int i5 = j4; i5 <= k4; i5++) {
int bgRed = (pixels[pixelIdx] >> 16 & 0xff) * bgAlpha;
int bgGreen = (pixels[pixelIdx] >> 8 & 0xff) * bgAlpha;
int bgBlue = (pixels[pixelIdx] & 0xff) * bgAlpha;
int newColour = ((red + bgRed >> 8) << 16) + ((green + bgGreen >> 8) << 8) + (blue + bgBlue >> 8);
pixels[pixelIdx++] = newColour;
}
}
}
public void drawBoxAlpha(int x, int y, int width, int height, int colour, int alpha) {
if (x < boundsTopX) {
width -= boundsTopX - x;
x = boundsTopX;
}
if (y < boundsTopY) {
height -= boundsTopY - y;
y = boundsTopY;
}
if (x + width > boundsBottomX)
width = boundsBottomX - x;
if (y + height > boundsBottomY)
height = boundsBottomY - y;
int bgAlpha = 256 - alpha;
int red = (colour >> 16 & 0xff) * alpha;
int green = (colour >> 8 & 0xff) * alpha;
int blue = (colour & 0xff) * alpha;
int j3 = width2 - width;// wat
byte vertInc = 1;
if (interlace) {
vertInc = 2;
j3 += width2;
if ((y & 1) != 0) {
y++;
height--;
}
}
int pixelIdx = x + y * width2;
for (int l3 = 0; l3 < height; l3 += vertInc) {
for (int i4 = -width; i4 < 0; i4++) {
int bgRed = (pixels[pixelIdx] >> 16 & 0xff) * bgAlpha;
int bgGreen = (pixels[pixelIdx] >> 8 & 0xff) * bgAlpha;
int bgBlue = (pixels[pixelIdx] & 0xff) * bgAlpha;
int newColour = ((red + bgRed >> 8) << 16) + ((green + bgGreen >> 8) << 8) + (blue + bgBlue >> 8);
pixels[pixelIdx++] = newColour;
}
pixelIdx += j3;
}
}
public void drawGradient(int x, int y, int width, int height, int colourTop, int colourBottom) {
if (x < boundsTopX) {
width -= boundsTopX - x;
x = boundsTopX;
}
if (x + width > boundsBottomX)
width = boundsBottomX - x;
int btmRed = colourBottom >> 16 & 0xff;
int btmGreen = colourBottom >> 8 & 0xff;
int btmBlue = colourBottom & 0xff;
int topRed = colourTop >> 16 & 0xff;
int topGreen = colourTop >> 8 & 0xff;
int topBlue = colourTop & 0xff;
int i3 = width2 - width;// wat
byte vertInc = 1;
if (interlace) {
vertInc = 2;
i3 += width2;
if ((y & 1) != 0) {
y++;
height--;
}
}
int pixelIdx = x + y * width2;
for (int k3 = 0; k3 < height; k3 += vertInc)
if (k3 + y >= boundsTopY && k3 + y < boundsBottomY) {
int newColour = ((btmRed * k3 + topRed * (height - k3)) / height << 16) + ((btmGreen * k3 + topGreen * (height - k3)) / height << 8) + (btmBlue * k3 + topBlue * (height - k3)) / height;
for (int i4 = -width; i4 < 0; i4++)
pixels[pixelIdx++] = newColour;
pixelIdx += i3;
} else {
pixelIdx += width2;
}
}
public void drawBox(int x, int y, int w, int h, int colour) {
if (x < boundsTopX) {
w -= boundsTopX - x;
x = boundsTopX;
}
if (y < boundsTopY) {
h -= boundsTopY - y;
y = boundsTopY;
}
if (x + w > boundsBottomX)
w = boundsBottomX - x;
if (y + h > boundsBottomY)
h = boundsBottomY - y;
int j1 = width2 - w;// wat
byte vertInc = 1;
if (interlace) {
vertInc = 2;
j1 += width2;
if ((y & 1) != 0) {
y++;
h--;
}
}
int pixelIdx = x + y * width2;
for (int l1 = -h; l1 < 0; l1 += vertInc) {
for (int i2 = -w; i2 < 0; i2++)
pixels[pixelIdx++] = colour;
pixelIdx += j1;
}
}
public void drawBoxEdge(int x, int y, int width, int height, int colour) {
drawLineHoriz(x, y, width, colour);
drawLineHoriz(x, (y + height) - 1, width, colour);
drawLineVert(x, y, height, colour);
drawLineVert((x + width) - 1, y, height, colour);
}
public void drawLineHoriz(int x, int y, int width, int colour) {
if (y < boundsTopY || y >= boundsBottomY)
return;
if (x < boundsTopX) {
width -= boundsTopX - x;
x = boundsTopX;
}
if (x + width > boundsBottomX)
width = boundsBottomX - x;
int i1 = x + y * width2;
for (int j1 = 0; j1 < width; j1++)
pixels[i1 + j1] = colour;
}
public void drawLineVert(int x, int y, int height, int colour) {
if (x < boundsTopX || x >= boundsBottomX)
return;
if (y < boundsTopY) {
height -= boundsTopY - y;
y = boundsTopY;
}
if (y + height > boundsBottomX)
height = boundsBottomY - y;
int i1 = x + y * width2;
for (int j1 = 0; j1 < height; j1++)
pixels[i1 + j1 * width2] = colour;
}
public void setPixel(int x, int y, int colour) {
if (x < boundsTopX || y < boundsTopY || x >= boundsBottomX || y >= boundsBottomY) {
return;
} else {
pixels[x + y * width2] = colour;
return;
}
}
public void fade2black() {
int k = width2 * height2;
for (int j = 0; j < k; j++) {
int i = pixels[j] & 0xffffff;
pixels[j] = (i >>> 1 & 0x7f7f7f) + (i >>> 2 & 0x3f3f3f) + (i >>> 3 & 0x1f1f1f) + (i >>> 4 & 0xf0f0f);
}
}
public void drawLineAlpha(int i, int j, int x, int y, int width, int height) {
for (int xx = x; xx < x + width; xx++) {
for (int yy = y; yy < y + height; yy++) {
int i2 = 0;
int j2 = 0;
int k2 = 0;
int l2 = 0;
for (int i3 = xx - i; i3 <= xx + i; i3++)
if (i3 >= 0 && i3 < width2) {
for (int j3 = yy - j; j3 <= yy + j; j3++)
if (j3 >= 0 && j3 < height2) {
int k3 = pixels[i3 + width2 * j3];
i2 += k3 >> 16 & 0xff;
j2 += k3 >> 8 & 0xff;
k2 += k3 & 0xff;
l2++;
}
}
pixels[xx + width2 * yy] = (i2 / l2 << 16) + (j2 / l2 << 8) + k2 / l2;
}
}
}
public void clear() {
for (int i = 0; i < surfacePixels.length; i++) {
surfacePixels[i] = null;
spriteWidth[i] = 0;
spriteHeight[i] = 0;
spriteColoursUsed[i] = null;
spriteColourList[i] = null;
}
}
public void parseSprite(int spriteId, byte spriteData[], byte indexData[], int frameCount) {
int indexOff = Utility.getUnsignedShort(spriteData, 0);
int fullWidth = Utility.getUnsignedShort(indexData, indexOff);
indexOff += 2;
int fullHeight = Utility.getUnsignedShort(indexData, indexOff);
indexOff += 2;
int colourCount = indexData[indexOff++] & 0xff;
int colours[] = new int[colourCount];
colours[0] = 0xff00ff;
for (int i = 0; i < colourCount - 1; i++) {
colours[i + 1] = ((indexData[indexOff] & 0xff) << 16) + ((indexData[indexOff + 1] & 0xff) << 8) + (indexData[indexOff + 2] & 0xff);
indexOff += 3;
}
int spriteOff = 2;
for (int id = spriteId; id < spriteId + frameCount; id++) {
spriteTranslateX[id] = indexData[indexOff++] & 0xff;
spriteTranslateY[id] = indexData[indexOff++] & 0xff;
spriteWidth[id] = Utility.getUnsignedShort(indexData, indexOff);
indexOff += 2;
spriteHeight[id] = Utility.getUnsignedShort(indexData, indexOff);
indexOff += 2;
int unknown = indexData[indexOff++] & 0xff;
int size = spriteWidth[id] * spriteHeight[id];
spriteColoursUsed[id] = new byte[size];
spriteColourList[id] = colours;
spriteWidthFull[id] = fullWidth;
spriteHeightFull[id] = fullHeight;
surfacePixels[id] = null;
spriteTranslate[id] = false;
if (spriteTranslateX[id] != 0 || spriteTranslateY[id] != 0)
spriteTranslate[id] = true;
if (unknown == 0) {
for (int pixel = 0; pixel < size; pixel++) {
spriteColoursUsed[id][pixel] = spriteData[spriteOff++];
if (spriteColoursUsed[id][pixel] == 0)
spriteTranslate[id] = true;
}
} else if (unknown == 1) {
for (int x = 0; x < spriteWidth[id]; x++) {
for (int y = 0; y < spriteHeight[id]; y++) {
spriteColoursUsed[id][x + y * spriteWidth[id]] = spriteData[spriteOff++];
if (spriteColoursUsed[id][x + y * spriteWidth[id]] == 0)
spriteTranslate[id] = true;
}
}
}
}
}
public void readSleepWord(int spriteId, byte spriteData[]) {
int pixels[] = surfacePixels[spriteId] = new int[10200];
spriteWidth[spriteId] = 255;
spriteHeight[spriteId] = 40;
spriteTranslateX[spriteId] = 0;
spriteTranslateY[spriteId] = 0;
spriteWidthFull[spriteId] = 255;
spriteHeightFull[spriteId] = 40;
spriteTranslate[spriteId] = false;
int j = 0;
int k = 1;
int l;
for (l = 0; l < 255; ) {
int i1 = spriteData[k++] & 0xff;
for (int k1 = 0; k1 < i1; k1++)
pixels[l++] = j;
j = 0xffffff - j;
}
for (int y = 1; y < 40; y++) {
for (int x = 0; x < 255; ) {
int i2 = spriteData[k++] & 0xff;
for (int j2 = 0; j2 < i2; j2++) {
pixels[l] = pixels[l - 255];
l++;
x++;
}
if (x < 255) {
pixels[l] = 0xffffff - pixels[l - 255];
l++;
x++;
}
}
}
}
public void drawWorld(int spriteId) {
int spriteSize = spriteWidth[spriteId] * spriteHeight[spriteId];
int spritePixels[] = this.surfacePixels[spriteId];
int ai1[] = new int[32768];
for (int k = 0; k < spriteSize; k++) {
int l = spritePixels[k];
ai1[((l & 0xf80000) >> 9) + ((l & 0xf800) >> 6) + ((l & 0xf8) >> 3)]++;
}
int ai2[] = new int[256];
ai2[0] = 0xff00ff;
int ai3[] = new int[256];
for (int i1 = 0; i1 < 32768; i1++) {
int j1 = ai1[i1];
if (j1 > ai3[255]) {
for (int k1 = 1; k1 < 256; k1++) {
if (j1 <= ai3[k1])
continue;
for (int i2 = 255; i2 > k1; i2--) {
ai2[i2] = ai2[i2 - 1];
ai3[i2] = ai3[i2 - 1];
}
ai2[k1] = ((i1 & 0x7c00) << 9) + ((i1 & 0x3e0) << 6) + ((i1 & 0x1f) << 3) + 0x40404;
ai3[k1] = j1;
break;
}
}
ai1[i1] = -1;
}
byte abyte0[] = new byte[spriteSize];
for (int l1 = 0; l1 < spriteSize; l1++) {
int j2 = spritePixels[l1];
int k2 = ((j2 & 0xf80000) >> 9) + ((j2 & 0xf800) >> 6) + ((j2 & 0xf8) >> 3);
int l2 = ai1[k2];
if (l2 == -1) {
int i3 = 0x3b9ac9ff;
int j3 = j2 >> 16 & 0xff;
int k3 = j2 >> 8 & 0xff;
int l3 = j2 & 0xff;
for (int i4 = 0; i4 < 256; i4++) {
int j4 = ai2[i4];
int k4 = j4 >> 16 & 0xff;
int l4 = j4 >> 8 & 0xff;
int i5 = j4 & 0xff;
int j5 = (j3 - k4) * (j3 - k4) + (k3 - l4) * (k3 - l4) + (l3 - i5) * (l3 - i5);
if (j5 < i3) {
i3 = j5;
l2 = i4;
}
}
ai1[k2] = l2;
}
abyte0[l1] = (byte) l2;
}
spriteColoursUsed[spriteId] = abyte0;
spriteColourList[spriteId] = ai2;
this.surfacePixels[spriteId] = null;
}
public void loadSprite(int spriteId) {
if (spriteColoursUsed[spriteId] == null)
return;
int size = spriteWidth[spriteId] * spriteHeight[spriteId];
byte idx[] = spriteColoursUsed[spriteId];
int cols[] = spriteColourList[spriteId];
int pixels[] = new int[size];
for (int pixel = 0; pixel < size; pixel++) {
int colour = cols[idx[pixel] & 0xff];
if (colour == 0)
colour = 1;
else if (colour == 0xff00ff)
colour = 0;
pixels[pixel] = colour;
}
surfacePixels[spriteId] = pixels;
spriteColoursUsed[spriteId] = null;
spriteColourList[spriteId] = null;
}
public void drawSpriteMinimap(int sprite, int x, int y, int width, int height) {// used from World
spriteWidth[sprite] = width;
spriteHeight[sprite] = height;
spriteTranslate[sprite] = false;
spriteTranslateX[sprite] = 0;
spriteTranslateY[sprite] = 0;
spriteWidthFull[sprite] = width;
spriteHeightFull[sprite] = height;
int area = width * height;
int pixel = 0;
surfacePixels[sprite] = new int[area];
for (int xx = x; xx < x + width; xx++) {
for (int yy = y; yy < y + height; yy++) {
surfacePixels[sprite][pixel++] = pixels[xx + yy * width2];
}
}
}
public void drawSprite(int sprite, int x, int y, int width, int height) {// used from mudclient
spriteWidth[sprite] = width;
spriteHeight[sprite] = height;
spriteTranslate[sprite] = false;
spriteTranslateX[sprite] = 0;
spriteTranslateY[sprite] = 0;
spriteWidthFull[sprite] = width;
spriteHeightFull[sprite] = height;
int area = width * height;
int pixel = 0;
surfacePixels[sprite] = new int[area];
for (int yy = y; yy < y + height; yy++) {
for (int xx = x; xx < x + width; xx++)
surfacePixels[sprite][pixel++] = pixels[xx + yy * width2];
}
}
public void drawSprite(int x, int y, int id) {
if (spriteTranslate[id]) {
x += spriteTranslateX[id];
y += spriteTranslateY[id];
}
int rY = x + y * width2;
int rX = 0;
int height = spriteHeight[id];
int width = spriteWidth[id];
int w2 = width2 - width;
int h2 = 0;
if (y < boundsTopY) {
int j2 = boundsTopY - y;
height -= j2;
y = boundsTopY;
rX += j2 * width;
rY += j2 * width2;
}
if (y + height >= boundsBottomY)
height -= ((y + height) - boundsBottomY) + 1;
if (x < boundsTopX) {
int k2 = boundsTopX - x;
width -= k2;
x = boundsTopX;
rX += k2;
rY += k2;
h2 += k2;
w2 += k2;
}
if (x + width >= boundsBottomX) {
int l2 = ((x + width) - boundsBottomX) + 1;
width -= l2;
h2 += l2;
w2 += l2;
}
if (width <= 0 || height <= 0)
return;
byte inc = 1;
if (interlace) {
inc = 2;
w2 += width2;
h2 += spriteWidth[id];
if ((y & 1) != 0) {
rY += width2;
height--;
}
}
if (surfacePixels[id] == null) {
drawSprite(pixels, spriteColoursUsed[id], spriteColourList[id], rX, rY, width, height, w2, h2, inc);
return;
} else {
drawSprite(pixels, surfacePixels[id], 0, rX, rY, width, height, w2, h2, inc);
return;
}
}
public void spriteClipping(int x, int y, int width, int height, int spriteId) {
try {
int spriteWidth = this.spriteWidth[spriteId];
int spriteHeight = this.spriteHeight[spriteId];
int l1 = 0;
int i2 = 0;
int j2 = (spriteWidth << 16) / width;
int k2 = (spriteHeight << 16) / height;
if (spriteTranslate[spriteId]) {
int l2 = spriteWidthFull[spriteId];
int j3 = spriteHeightFull[spriteId];
j2 = (l2 << 16) / width;
k2 = (j3 << 16) / height;
x += ((spriteTranslateX[spriteId] * width + l2) - 1) / l2;
y += ((spriteTranslateY[spriteId] * height + j3) - 1) / j3;
if ((spriteTranslateX[spriteId] * width) % l2 != 0)
l1 = (l2 - (spriteTranslateX[spriteId] * width) % l2 << 16) / width;
if ((spriteTranslateY[spriteId] * height) % j3 != 0)
i2 = (j3 - (spriteTranslateY[spriteId] * height) % j3 << 16) / height;
width = (width * (this.spriteWidth[spriteId] - (l1 >> 16))) / l2;
height = (height * (this.spriteHeight[spriteId] - (i2 >> 16))) / j3;
}
int i3 = x + y * width2;
int k3 = width2 - width;
if (y < boundsTopY) {
int l3 = boundsTopY - y;
height -= l3;
y = 0;
i3 += l3 * width2;
i2 += k2 * l3;
}
if (y + height >= boundsBottomY)
height -= ((y + height) - boundsBottomY) + 1;
if (x < boundsTopX) {
int i4 = boundsTopX - x;
width -= i4;
x = 0;
i3 += i4;
l1 += j2 * i4;
k3 += i4;
}
if (x + width >= boundsBottomX) {
int j4 = ((x + width) - boundsBottomX) + 1;
width -= j4;
k3 += j4;
}
byte yInc = 1;
if (interlace) {
yInc = 2;
k3 += width2;
k2 += k2;
if ((y & 1) != 0) {
i3 += width2;
height--;
}
}
plotScale(pixels, surfacePixels[spriteId], 0, l1, i2, i3, k3, width, height, j2, k2, spriteWidth, yInc);
return;
} catch (Exception Ex) {
System.out.println("error in sprite clipping routine");
}
}
public void drawSpriteAlpha(int x, int y, int spriteId, int alpha) {
if (spriteTranslate[spriteId]) {
x += spriteTranslateX[spriteId];
y += spriteTranslateY[spriteId];
}
int size = x + y * width2;
int j1 = 0;
int height = spriteHeight[spriteId];
int width = spriteWidth[spriteId];
int extraXSpace = width2 - width;
int j2 = 0;
if (y < boundsTopY) {
int k2 = boundsTopY - y;
height -= k2;
y = boundsTopY;
j1 += k2 * width;
size += k2 * width2;
}
if (y + height >= boundsBottomY)
height -= ((y + height) - boundsBottomY) + 1;
if (x < boundsTopX) {
int l2 = boundsTopX - x;
width -= l2;
x = boundsTopX;
j1 += l2;
size += l2;
j2 += l2;
extraXSpace += l2;
}
if (x + width >= boundsBottomX) {
int i3 = ((x + width) - boundsBottomX) + 1;
width -= i3;
j2 += i3;
extraXSpace += i3;
}
if (width <= 0 || height <= 0)
return;
byte yInc = 1;
if (this.interlace) {
yInc = 2;
extraXSpace += width2;
j2 += spriteWidth[spriteId];
if ((y & 1) != 0) {
size += width2;
height--;
}
}
if (surfacePixels[spriteId] == null) {
drawSpriteAlpha(pixels, spriteColoursUsed[spriteId], spriteColourList[spriteId], j1, size, width, height, extraXSpace, j2, yInc, alpha);
return;
} else {
drawSpriteAlpha(pixels, surfacePixels[spriteId], 0, j1, size, width, height, extraXSpace, j2, yInc, alpha);
return;
}
}
public void drawActionBubble(int x, int y, int scaleX, int scaleY, int sprite, int alpha) {
try {
int spriteWidth = this.spriteWidth[sprite];
int spriteHeight = this.spriteHeight[sprite];
int i2 = 0;
int j2 = 0;
int k2 = (spriteWidth << 16) / scaleX;
int l2 = (spriteHeight << 16) / scaleY;
if (spriteTranslate[sprite]) {
int i3 = spriteWidthFull[sprite];
int k3 = spriteHeightFull[sprite];
k2 = (i3 << 16) / scaleX;
l2 = (k3 << 16) / scaleY;
x += ((spriteTranslateX[sprite] * scaleX + i3) - 1) / i3;
y += ((spriteTranslateY[sprite] * scaleY + k3) - 1) / k3;
if ((spriteTranslateX[sprite] * scaleX) % i3 != 0)
i2 = (i3 - (spriteTranslateX[sprite] * scaleX) % i3 << 16) / scaleX;
if ((spriteTranslateY[sprite] * scaleY) % k3 != 0)
j2 = (k3 - (spriteTranslateY[sprite] * scaleY) % k3 << 16) / scaleY;
scaleX = (scaleX * (this.spriteWidth[sprite] - (i2 >> 16))) / i3;
scaleY = (scaleY * (this.spriteHeight[sprite] - (j2 >> 16))) / k3;
}
int j3 = x + y * width2;
int l3 = width2 - scaleX;
if (y < boundsTopY) {
int i4 = boundsTopY - y;
scaleY -= i4;
y = 0;
j3 += i4 * width2;
j2 += l2 * i4;
}
if (y + scaleY >= boundsBottomY)
scaleY -= ((y + scaleY) - boundsBottomY) + 1;
if (x < boundsTopX) {
int j4 = boundsTopX - x;
scaleX -= j4;
x = 0;
j3 += j4;
i2 += k2 * j4;
l3 += j4;
}
if (x + scaleX >= boundsBottomX) {
int k4 = ((x + scaleX) - boundsBottomX) + 1;
scaleX -= k4;
l3 += k4;
}
byte yInc = 1;
if (interlace) {
yInc = 2;
l3 += width2;
l2 += l2;
if ((y & 1) != 0) {
j3 += width2;
scaleY--;
}
}
transparentScale(pixels, surfacePixels[sprite], 0, i2, j2, j3, l3, scaleX, scaleY, k2, l2, spriteWidth, yInc, alpha);
return;
} catch (Exception ex) {
System.out.println("error in sprite clipping routine");
}
}
public void spriteClipping(int x, int y, int width, int height, int spriteId, int colour) {
try {
int k1 = spriteWidth[spriteId];
int l1 = spriteHeight[spriteId];
int i2 = 0;
int j2 = 0;
int k2 = (k1 << 16) / width;
int l2 = (l1 << 16) / height;
if (spriteTranslate[spriteId]) {
int i3 = spriteWidthFull[spriteId];
int k3 = spriteHeightFull[spriteId];
k2 = (i3 << 16) / width;
l2 = (k3 << 16) / height;
x += ((spriteTranslateX[spriteId] * width + i3) - 1) / i3;
y += ((spriteTranslateY[spriteId] * height + k3) - 1) / k3;
if ((spriteTranslateX[spriteId] * width) % i3 != 0)
i2 = (i3 - (spriteTranslateX[spriteId] * width) % i3 << 16) / width;
if ((spriteTranslateY[spriteId] * height) % k3 != 0)
j2 = (k3 - (spriteTranslateY[spriteId] * height) % k3 << 16) / height;
width = (width * (spriteWidth[spriteId] - (i2 >> 16))) / i3;
height = (height * (spriteHeight[spriteId] - (j2 >> 16))) / k3;
}
int j3 = x + y * width2;
int l3 = width2 - width;
if (y < boundsTopY) {
int i4 = boundsTopY - y;
height -= i4;
y = 0;
j3 += i4 * width2;
j2 += l2 * i4;
}
if (y + height >= boundsBottomY)
height -= ((y + height) - boundsBottomY) + 1;
if (x < boundsTopX) {
int j4 = boundsTopX - x;
width -= j4;
x = 0;
j3 += j4;
i2 += k2 * j4;
l3 += j4;
}
if (x + width >= boundsBottomX) {
int k4 = ((x + width) - boundsBottomX) + 1;
width -= k4;
l3 += k4;
}
byte yInc = 1;
if (interlace) {
yInc = 2;
l3 += width2;
l2 += l2;
if ((y & 1) != 0) {
j3 += width2;
height--;
}
}
plotScale(pixels, surfacePixels[spriteId], 0, i2, j2, j3, l3, width, height, k2, l2, k1, yInc, colour);
return;
} catch (Exception Ex) {
System.out.println("error in sprite clipping routine");
}
}
private void drawSprite(int dest[], int src[], int i, int srcPos, int destPos, int width, int height,
int j1, int k1, int yInc) {
int i2 = -(width >> 2);
width = -(width & 3);
for (int j2 = -height; j2 < 0; j2 += yInc) {
for (int k2 = i2; k2 < 0; k2++) {
i = src[srcPos++];
if (i != 0)
dest[destPos++] = i;
else
destPos++;
i = src[srcPos++];
if (i != 0)
dest[destPos++] = i;
else
destPos++;
i = src[srcPos++];
if (i != 0)
dest[destPos++] = i;
else
destPos++;
i = src[srcPos++];
if (i != 0)
dest[destPos++] = i;
else
destPos++;
}
for (int l2 = width; l2 < 0; l2++) {
i = src[srcPos++];
if (i != 0)
dest[destPos++] = i;
else
destPos++;
}
destPos += j1;
srcPos += k1;
}
}
private void drawSprite(int target[], byte colourIdx[], int colours[], int srcPos, int destPos, int width, int height,
int w2, int h2, int rowInc) {
int l1 = -(width >> 2);
width = -(width & 3);
for (int i2 = -height; i2 < 0; i2 += rowInc) {
for (int j2 = l1; j2 < 0; j2++) {
byte byte0 = colourIdx[srcPos++];
if (byte0 != 0)
target[destPos++] = colours[byte0 & 0xff];
else
destPos++;
byte0 = colourIdx[srcPos++];
if (byte0 != 0)
target[destPos++] = colours[byte0 & 0xff];
else
destPos++;
byte0 = colourIdx[srcPos++];
if (byte0 != 0)
target[destPos++] = colours[byte0 & 0xff];
else
destPos++;
byte0 = colourIdx[srcPos++];
if (byte0 != 0)
target[destPos++] = colours[byte0 & 0xff];
else
destPos++;
}
for (int k2 = width; k2 < 0; k2++) {
byte byte1 = colourIdx[srcPos++];
if (byte1 != 0)
target[destPos++] = colours[byte1 & 0xff];
else
destPos++;
}
destPos += w2;
srcPos += h2;
}
}
private void plotScale(int dest[], int src[], int i, int j, int k, int destPos, int i1,
int j1, int k1, int l1, int i2, int j2, int k2) {
try {
int l2 = j;
for (int i3 = -k1; i3 < 0; i3 += k2) {
int j3 = (k >> 16) * j2;
for (int k3 = -j1; k3 < 0; k3++) {
i = src[(j >> 16) + j3];
if (i != 0)
dest[destPos++] = i;
else
destPos++;
j += l1;
}
k += i2;
j = l2;
destPos += i1;
}
return;
} catch (Exception Ex) {
System.out.println("error in plotScale");
}
}
private void drawSpriteAlpha(int dest[], int src[], int i, int srcPos, int size, int width, int height,
int extraXSpace, int k1, int yInc, int alpha) {
int j2 = 256 - alpha;
for (int k2 = -height; k2 < 0; k2 += yInc) {
for (int l2 = -width; l2 < 0; l2++) {
i = src[srcPos++];
if (i != 0) {
int i3 = dest[size];
dest[size++] = ((i & 0xff00ff) * alpha + (i3 & 0xff00ff) * j2 & 0xff00ff00) + ((i & 0xff00) * alpha + (i3 & 0xff00) * j2 & 0xff0000) >> 8;
} else {
size++;
}
}
size += extraXSpace;
srcPos += k1;
}
}
private void drawSpriteAlpha(int dest[], byte coloursUsed[], int colourList[], int listPos, int size, int width, int height,
int extraXSpace, int j1, int yInc, int alpha) {
int i2 = 256 - alpha;
for (int j2 = -height; j2 < 0; j2 += yInc) {
for (int k2 = -width; k2 < 0; k2++) {
int l2 = coloursUsed[listPos++];
if (l2 != 0) {
l2 = colourList[l2 & 0xff];
int i3 = dest[size];
dest[size++] = ((l2 & 0xff00ff) * alpha + (i3 & 0xff00ff) * i2 & 0xff00ff00) + ((l2 & 0xff00) * alpha + (i3 & 0xff00) * i2 & 0xff0000) >> 8;
} else {
size++;
}
}
size += extraXSpace;
listPos += j1;
}
}
private void transparentScale(int dest[], int src[], int i, int j, int k, int destPos, int i1,
int j1, int k1, int l1, int i2, int j2, int yInc, int alpha) {
int i3 = 256 - alpha;
try {
int j3 = j;
for (int k3 = -k1; k3 < 0; k3 += yInc) {
int l3 = (k >> 16) * j2;
for (int i4 = -j1; i4 < 0; i4++) {
i = src[(j >> 16) + l3];
if (i != 0) {
int j4 = dest[destPos];
dest[destPos++] = ((i & 0xff00ff) * alpha + (j4 & 0xff00ff) * i3 & 0xff00ff00) + ((i & 0xff00) * alpha + (j4 & 0xff00) * i3 & 0xff0000) >> 8;
} else {
destPos++;
}
j += l1;
}
k += i2;
j = j3;
destPos += i1;
}
return;
} catch (Exception Ex) {
System.out.println("error in tranScale");
}
}
private void plotScale(int target[], int pixels[], int i, int j, int k, int l, int i1,
int width, int height, int l1, int i2, int j2, int yInc, int colour) {
int i3 = colour >> 16 & 0xff;
int j3 = colour >> 8 & 0xff;
int k3 = colour & 0xff;
try {
int l3 = j;
for (int i4 = -height; i4 < 0; i4 += yInc) {
int j4 = (k >> 16) * j2;
for (int k4 = -width; k4 < 0; k4++) {
i = pixels[(j >> 16) + j4];
if (i != 0) {
int l4 = i >> 16 & 0xff;
int i5 = i >> 8 & 0xff;
int j5 = i & 0xff;
if (l4 == i5 && i5 == j5)
target[l++] = ((l4 * i3 >> 8) << 16) + ((i5 * j3 >> 8) << 8) + (j5 * k3 >> 8);
else
target[l++] = i;
} else {
l++;
}
j += l1;
}
k += i2;
j = l3;
l += i1;
}
return;
} catch (Exception Ex) {
System.out.println("error in plotScale");
}
}
public void drawMinimapSprite(int x, int y, int sprite, int rotation, int scale) {// "scale" is not actually scaling when it comes to the landscape
int j1 = width2;
int k1 = height2;
if (landscapeColours == null) {
landscapeColours = new int[512];
for (int l1 = 0; l1 < 256; l1++) {
landscapeColours[l1] = (int) (Math.sin((double) l1 * 0.02454369D) * 32768D);
landscapeColours[l1 + 256] = (int) (Math.cos((double) l1 * 0.02454369D) * 32768D);
}
}
int i2 = -spriteWidthFull[sprite] / 2;
int j2 = -spriteHeightFull[sprite] / 2;
if (spriteTranslate[sprite]) {
i2 += spriteTranslateX[sprite];
j2 += spriteTranslateY[sprite];
}
int k2 = i2 + spriteWidth[sprite];
int l2 = j2 + spriteHeight[sprite];
int i3 = k2;
int j3 = j2;
int k3 = i2;
int l3 = l2;
rotation &= 0xff;
int i4 = landscapeColours[rotation] * scale;
int j4 = landscapeColours[rotation + 256] * scale;
int k4 = x + (j2 * i4 + i2 * j4 >> 22);
int l4 = y + (j2 * j4 - i2 * i4 >> 22);
int i5 = x + (j3 * i4 + i3 * j4 >> 22);
int j5 = y + (j3 * j4 - i3 * i4 >> 22);
int k5 = x + (l2 * i4 + k2 * j4 >> 22);
int l5 = y + (l2 * j4 - k2 * i4 >> 22);
int i6 = x + (l3 * i4 + k3 * j4 >> 22);
int j6 = y + (l3 * j4 - k3 * i4 >> 22);
if (scale == 192 && (rotation & 0x3f) == (anInt348 & 0x3f))
anInt346++;
else if (scale == 128)
anInt348 = rotation;
else
anInt347++;
int k6 = l4;
int l6 = l4;
if (j5 < k6)
k6 = j5;
else if (j5 > l6)
l6 = j5;
if (l5 < k6)
k6 = l5;
else if (l5 > l6)
l6 = l5;
if (j6 < k6)
k6 = j6;
else if (j6 > l6)
l6 = j6;
if (k6 < boundsTopY)
k6 = boundsTopY;
if (l6 > boundsBottomY)
l6 = boundsBottomY;
if (anIntArray340 == null || anIntArray340.length != k1 + 1) {
anIntArray340 = new int[k1 + 1];
anIntArray341 = new int[k1 + 1];
anIntArray342 = new int[k1 + 1];
anIntArray343 = new int[k1 + 1];
anIntArray344 = new int[k1 + 1];
anIntArray345 = new int[k1 + 1];
}
for (int i7 = k6; i7 <= l6; i7++) {
anIntArray340[i7] = 99999999;
anIntArray341[i7] = 0xfa0a1f01;
}
int i8 = 0;
int k8 = 0;
int i9 = 0;
int j9 = spriteWidth[sprite];
int k9 = spriteHeight[sprite];
i2 = 0;
j2 = 0;
i3 = j9 - 1;
j3 = 0;
k2 = j9 - 1;
l2 = k9 - 1;
k3 = 0;
l3 = k9 - 1;
if (j6 != l4) {
i8 = (i6 - k4 << 8) / (j6 - l4);
i9 = (l3 - j2 << 8) / (j6 - l4);
}
int j7;
int k7;
int l7;
int l8;
if (l4 > j6) {
l7 = i6 << 8;
l8 = l3 << 8;
j7 = j6;
k7 = l4;
} else {
l7 = k4 << 8;
l8 = j2 << 8;
j7 = l4;
k7 = j6;
}
if (j7 < 0) {
l7 -= i8 * j7;
l8 -= i9 * j7;
j7 = 0;
}
if (k7 > k1 - 1)
k7 = k1 - 1;
for (int l9 = j7; l9 <= k7; l9++) {
anIntArray340[l9] = anIntArray341[l9] = l7;
l7 += i8;
anIntArray342[l9] = anIntArray343[l9] = 0;
anIntArray344[l9] = anIntArray345[l9] = l8;
l8 += i9;
}
if (j5 != l4) {
i8 = (i5 - k4 << 8) / (j5 - l4);
k8 = (i3 - i2 << 8) / (j5 - l4);
}
int j8;
if (l4 > j5) {
l7 = i5 << 8;
j8 = i3 << 8;
j7 = j5;
k7 = l4;
} else {
l7 = k4 << 8;
j8 = i2 << 8;
j7 = l4;
k7 = j5;
}
if (j7 < 0) {
l7 -= i8 * j7;
j8 -= k8 * j7;
j7 = 0;
}
if (k7 > k1 - 1)
k7 = k1 - 1;
for (int i10 = j7; i10 <= k7; i10++) {
if (l7 < anIntArray340[i10]) {
anIntArray340[i10] = l7;
anIntArray342[i10] = j8;
anIntArray344[i10] = 0;
}
if (l7 > anIntArray341[i10]) {
anIntArray341[i10] = l7;
anIntArray343[i10] = j8;
anIntArray345[i10] = 0;
}
l7 += i8;
j8 += k8;
}
if (l5 != j5) {
i8 = (k5 - i5 << 8) / (l5 - j5);
i9 = (l2 - j3 << 8) / (l5 - j5);
}
if (j5 > l5) {
l7 = k5 << 8;
j8 = k2 << 8;
l8 = l2 << 8;
j7 = l5;
k7 = j5;
} else {
l7 = i5 << 8;
j8 = i3 << 8;
l8 = j3 << 8;
j7 = j5;
k7 = l5;
}
if (j7 < 0) {
l7 -= i8 * j7;
l8 -= i9 * j7;
j7 = 0;
}
if (k7 > k1 - 1)
k7 = k1 - 1;
for (int j10 = j7; j10 <= k7; j10++) {
if (l7 < anIntArray340[j10]) {
anIntArray340[j10] = l7;
anIntArray342[j10] = j8;
anIntArray344[j10] = l8;
}
if (l7 > anIntArray341[j10]) {
anIntArray341[j10] = l7;
anIntArray343[j10] = j8;
anIntArray345[j10] = l8;
}
l7 += i8;
l8 += i9;
}
if (j6 != l5) {
i8 = (i6 - k5 << 8) / (j6 - l5);
k8 = (k3 - k2 << 8) / (j6 - l5);
}
if (l5 > j6) {
l7 = i6 << 8;
j8 = k3 << 8;
l8 = l3 << 8;
j7 = j6;
k7 = l5;
} else {
l7 = k5 << 8;
j8 = k2 << 8;
l8 = l2 << 8;
j7 = l5;
k7 = j6;
}
if (j7 < 0) {
l7 -= i8 * j7;
j8 -= k8 * j7;
j7 = 0;
}
if (k7 > k1 - 1)
k7 = k1 - 1;
for (int k10 = j7; k10 <= k7; k10++) {
if (l7 < anIntArray340[k10]) {
anIntArray340[k10] = l7;
anIntArray342[k10] = j8;
anIntArray344[k10] = l8;
}
if (l7 > anIntArray341[k10]) {
anIntArray341[k10] = l7;
anIntArray343[k10] = j8;
anIntArray345[k10] = l8;
}
l7 += i8;
j8 += k8;
}
int l10 = k6 * j1;
int ai[] = surfacePixels[sprite];
for (int i11 = k6; i11 < l6; i11++) {
int j11 = anIntArray340[i11] >> 8;
int k11 = anIntArray341[i11] >> 8;
if (k11 - j11 <= 0) {
l10 += j1;
} else {
int l11 = anIntArray342[i11] << 9;
int i12 = ((anIntArray343[i11] << 9) - l11) / (k11 - j11);
int j12 = anIntArray344[i11] << 9;
int k12 = ((anIntArray345[i11] << 9) - j12) / (k11 - j11);
if (j11 < boundsTopX) {
l11 += (boundsTopX - j11) * i12;
j12 += (boundsTopX - j11) * k12;
j11 = boundsTopX;
}
if (k11 > boundsBottomX)
k11 = boundsBottomX;
if (!interlace || (i11 & 1) == 0)
if (!spriteTranslate[sprite])
drawMinimap(pixels, ai, 0, l10 + j11, l11, j12, i12, k12, j11 - k11, j9);
else
drawMinimapTranslate(pixels, ai, 0, l10 + j11, l11, j12, i12, k12, j11 - k11, j9);
l10 += j1;
}
}
}
private void drawMinimap(int ai[], int ai1[], int i, int j, int k, int l, int i1,
int j1, int k1, int l1) {
for (i = k1; i < 0; i++) {
pixels[j++] = ai1[(k >> 17) + (l >> 17) * l1];
k += i1;
l += j1;
}
}
private void drawMinimapTranslate(int ai[], int ai1[], int i, int j, int k, int l, int i1,
int j1, int k1, int l1) {
for (int i2 = k1; i2 < 0; i2++) {
i = ai1[(k >> 17) + (l >> 17) * l1];
if (i != 0)
pixels[j++] = i;
else
j++;
k += i1;
l += j1;
}
}
public void spriteClipping(int x, int y, int w, int h, int id, int tx, int ty) {
spriteClipping(x, y, w, h, id);
}
public void spriteClipping(int x, int y, int w, int h, int sprite, int colour1, int colour2,
int l1, boolean flag) {
try {
if (colour1 == 0)
colour1 = 0xffffff;
if (colour2 == 0)
colour2 = 0xffffff;
int width = spriteWidth[sprite];
int height = spriteHeight[sprite];
int k2 = 0;
int l2 = 0;
int i3 = l1 << 16;
int j3 = (width << 16) / w;
int k3 = (height << 16) / h;
int l3 = -(l1 << 16) / h;
if (spriteTranslate[sprite]) {
int fullWidth = spriteWidthFull[sprite];
int fullHeight = spriteHeightFull[sprite];
j3 = (fullWidth << 16) / w;
k3 = (fullHeight << 16) / h;
int j5 = spriteTranslateX[sprite];
int k5 = spriteTranslateY[sprite];
if (flag)
j5 = fullWidth - spriteWidth[sprite] - j5;
x += ((j5 * w + fullWidth) - 1) / fullWidth;
int l5 = ((k5 * h + fullHeight) - 1) / fullHeight;
y += l5;
i3 += l5 * l3;
if ((j5 * w) % fullWidth != 0)
k2 = (fullWidth - (j5 * w) % fullWidth << 16) / w;
if ((k5 * h) % fullHeight != 0)
l2 = (fullHeight - (k5 * h) % fullHeight << 16) / h;
w = ((((spriteWidth[sprite] << 16) - k2) + j3) - 1) / j3;
h = ((((spriteHeight[sprite] << 16) - l2) + k3) - 1) / k3;
}
int j4 = y * width2;
i3 += x << 16;
if (y < boundsTopY) {
int l4 = boundsTopY - y;
h -= l4;
y = boundsTopY;
j4 += l4 * width2;
l2 += k3 * l4;
i3 += l3 * l4;
}
if (y + h >= boundsBottomY)
h -= ((y + h) - boundsBottomY) + 1;
int i5 = j4 / width2 & 1;
if (!interlace)
i5 = 2;
if (colour2 == 0xffffff) {
if (surfacePixels[sprite] != null)
if (!flag) {
transparentSpritePlot(pixels, surfacePixels[sprite], 0, k2, l2, j4, w, h, j3, k3, width, colour1, i3, l3, i5);
return;
} else {
transparentSpritePlot(pixels, surfacePixels[sprite], 0, (spriteWidth[sprite] << 16) - k2 - 1, l2, j4, w, h, -j3, k3, width, colour1, i3, l3, i5);
return;
}
if (!flag) {
transparentSpritePlot(pixels, spriteColoursUsed[sprite], spriteColourList[sprite], 0, k2, l2, j4, w, h, j3, k3, width, colour1, i3, l3, i5);
return;
} else {
transparentSpritePlot(pixels, spriteColoursUsed[sprite], spriteColourList[sprite], 0, (spriteWidth[sprite] << 16) - k2 - 1, l2, j4, w, h, -j3, k3, width, colour1, i3, l3, i5);
return;
}
}
if (surfacePixels[sprite] != null)
if (!flag) {
transparentSpritePlot(pixels, surfacePixels[sprite], 0, k2, l2, j4, w, h, j3, k3, width, colour1, colour2, i3, l3, i5);
return;
} else {
transparentSpritePlot(pixels, surfacePixels[sprite], 0, (spriteWidth[sprite] << 16) - k2 - 1, l2, j4, w, h, -j3, k3, width, colour1, colour2, i3, l3, i5);
return;
}
if (!flag) {
transparentSpritePlot(pixels, spriteColoursUsed[sprite], spriteColourList[sprite], 0, k2, l2, j4, w, h, j3, k3, width, colour1, colour2, i3, l3, i5);
return;
} else {
transparentSpritePlot(pixels, spriteColoursUsed[sprite], spriteColourList[sprite], 0, (spriteWidth[sprite] << 16) - k2 - 1, l2, j4, w, h, -j3, k3, width, colour1, colour2, i3, l3, i5);
return;
}
} catch (Exception Ex) {
System.out.println("error in sprite clipping routine");
}
}
private void transparentSpritePlot(int dest[], int src[], int i, int j, int k, int destPos, int i1,
int j1, int k1, int l1, int i2, int j2, int k2, int l2,
int i3) {
int i4 = j2 >> 16 & 0xff;
int j4 = j2 >> 8 & 0xff;
int k4 = j2 & 0xff;
try {
int l4 = j;
for (int i5 = -j1; i5 < 0; i5++) {
int j5 = (k >> 16) * i2;
int k5 = k2 >> 16;
int l5 = i1;
if (k5 < boundsTopX) {
int i6 = boundsTopX - k5;
l5 -= i6;
k5 = boundsTopX;
j += k1 * i6;
}
if (k5 + l5 >= boundsBottomX) {
int j6 = (k5 + l5) - boundsBottomX;
l5 -= j6;
}
i3 = 1 - i3;
if (i3 != 0) {
for (int k6 = k5; k6 < k5 + l5; k6++) {
i = src[(j >> 16) + j5];
if (i != 0) {
int j3 = i >> 16 & 0xff;
int k3 = i >> 8 & 0xff;
int l3 = i & 0xff;
if (j3 == k3 && k3 == l3)
dest[k6 + destPos] = ((j3 * i4 >> 8) << 16) + ((k3 * j4 >> 8) << 8) + (l3 * k4 >> 8);
else
dest[k6 + destPos] = i;
}
j += k1;
}
}
k += l1;
j = l4;
destPos += width2;
k2 += l2;
}
return;
} catch (Exception Ex) {
System.out.println("error in transparent sprite plot routine");
}
}
private void transparentSpritePlot(int dest[], int src[], int i, int j, int k, int destPos, int i1,
int j1, int k1, int l1, int i2, int j2, int k2, int l2,
int i3, int j3) {
int j4 = j2 >> 16 & 0xff;
int k4 = j2 >> 8 & 0xff;
int l4 = j2 & 0xff;
int i5 = k2 >> 16 & 0xff;
int j5 = k2 >> 8 & 0xff;
int k5 = k2 & 0xff;
try {
int l5 = j;
for (int i6 = -j1; i6 < 0; i6++) {
int j6 = (k >> 16) * i2;
int k6 = l2 >> 16;
int l6 = i1;
if (k6 < boundsTopX) {
int i7 = boundsTopX - k6;
l6 -= i7;
k6 = boundsTopX;
j += k1 * i7;
}
if (k6 + l6 >= boundsBottomX) {
int j7 = (k6 + l6) - boundsBottomX;
l6 -= j7;
}
j3 = 1 - j3;
if (j3 != 0) {
for (int k7 = k6; k7 < k6 + l6; k7++) {
i = src[(j >> 16) + j6];
if (i != 0) {
int k3 = i >> 16 & 0xff;
int l3 = i >> 8 & 0xff;
int i4 = i & 0xff;
if (k3 == l3 && l3 == i4)
dest[k7 + destPos] = ((k3 * j4 >> 8) << 16) + ((l3 * k4 >> 8) << 8) + (i4 * l4 >> 8);
else if (k3 == 255 && l3 == i4)
dest[k7 + destPos] = ((k3 * i5 >> 8) << 16) + ((l3 * j5 >> 8) << 8) + (i4 * k5 >> 8);
else
dest[k7 + destPos] = i;
}
j += k1;
}
}
k += l1;
j = l5;
destPos += width2;
l2 += i3;
}
return;
} catch (Exception Ex) {
System.out.println("error in transparent sprite plot routine");
}
}
private void transparentSpritePlot(int dest[], byte colourIdx[], int colours[], int i, int j, int k, int l,
int i1, int j1, int k1, int l1, int i2, int j2, int k2,
int l2, int i3) {
int i4 = j2 >> 16 & 0xff;
int j4 = j2 >> 8 & 0xff;
int k4 = j2 & 0xff;
try {
int l4 = j;
for (int i5 = -j1; i5 < 0; i5++) {
int j5 = (k >> 16) * i2;
int k5 = k2 >> 16;
int l5 = i1;
if (k5 < boundsTopX) {
int i6 = boundsTopX - k5;
l5 -= i6;
k5 = boundsTopX;
j += k1 * i6;
}
if (k5 + l5 >= boundsBottomX) {
int j6 = (k5 + l5) - boundsBottomX;
l5 -= j6;
}
i3 = 1 - i3;
if (i3 != 0) {
for (int k6 = k5; k6 < k5 + l5; k6++) {
i = colourIdx[(j >> 16) + j5] & 0xff;
if (i != 0) {
i = colours[i];
int j3 = i >> 16 & 0xff;
int k3 = i >> 8 & 0xff;
int l3 = i & 0xff;
if (j3 == k3 && k3 == l3)
dest[k6 + l] = ((j3 * i4 >> 8) << 16) + ((k3 * j4 >> 8) << 8) + (l3 * k4 >> 8);
else
dest[k6 + l] = i;
}
j += k1;
}
}
k += l1;
j = l4;
l += width2;
k2 += l2;
}
return;
} catch (Exception Ex) {
System.out.println("error in transparent sprite plot routine");
}
}
private void transparentSpritePlot(int dest[], byte coloursUsed[], int colourList[], int i, int j, int k, int l,
int i1, int j1, int k1, int l1, int i2, int j2, int k2,
int l2, int i3, int j3) {
int j4 = j2 >> 16 & 0xff;
int k4 = j2 >> 8 & 0xff;
int l4 = j2 & 0xff;
int i5 = k2 >> 16 & 0xff;
int j5 = k2 >> 8 & 0xff;
int k5 = k2 & 0xff;
try {
int l5 = j;
for (int i6 = -j1; i6 < 0; i6++) {
int j6 = (k >> 16) * i2;
int k6 = l2 >> 16;
int l6 = i1;
if (k6 < boundsTopX) {
int i7 = boundsTopX - k6;
l6 -= i7;
k6 = boundsTopX;
j += k1 * i7;
}
if (k6 + l6 >= boundsBottomX) {
int j7 = (k6 + l6) - boundsBottomX;
l6 -= j7;
}
j3 = 1 - j3;
if (j3 != 0) {
for (int k7 = k6; k7 < k6 + l6; k7++) {
i = coloursUsed[(j >> 16) + j6] & 0xff;
if (i != 0) {
i = colourList[i];
int k3 = i >> 16 & 0xff;
int l3 = i >> 8 & 0xff;
int i4 = i & 0xff;
if (k3 == l3 && l3 == i4)
dest[k7 + l] = ((k3 * j4 >> 8) << 16) + ((l3 * k4 >> 8) << 8) + (i4 * l4 >> 8);
else if (k3 == 255 && l3 == i4)
dest[k7 + l] = ((k3 * i5 >> 8) << 16) + ((l3 * j5 >> 8) << 8) + (i4 * k5 >> 8);
else
dest[k7 + l] = i;
}
j += k1;
}
}
k += l1;
j = l5;
l += width2;
l2 += i3;
}
return;
} catch (Exception Ex) {
System.out.println("error in transparent sprite plot routine");
}
}
public void drawstringRight(String text, int x, int y, int font, int colour) {
drawstring(text, x - textWidth(text, font), y, font, colour);
}
public void drawStringCenter(String text, int x, int y, int font, int colour) {
drawstring(text, x - textWidth(text, font) / 2, y, font, colour);
}
public void centrepara(String text, int x, int y, int font, int colour, int max) {
try {
int width = 0;
byte fontdata[] = gameFonts[font];
int start = 0;
int end = 0;
for (int index = 0; index < text.length(); index++) {
if (text.charAt(index) == '@' && index + 4 < text.length() && text.charAt(index + 4) == '@')
index += 4;
else if (text.charAt(index) == '~' && index + 4 < text.length() && text.charAt(index + 4) == '~')
index += 4;
else
width += fontdata[characterWidth[text.charAt(index)] + 7];
if (text.charAt(index) == ' ')
end = index;
if (text.charAt(index) == '%') {
end = index;
width = 1000;
}
if (width > max) {
if (end <= start)
end = index;
drawStringCenter(text.substring(start, end), x, y, font, colour);
width = 0;
start = index = end + 1;
y += textHeight(font);
}
}
if (width > 0) {
drawStringCenter(text.substring(start), x, y, font, colour);
return;
}
} catch (Exception exception) {
System.out.println("centrepara: " + exception);
exception.printStackTrace();
}
}
public void drawstring(String text, int x, int y, int font, int colour) {
try {
byte fontData[] = gameFonts[font];
for (int idx = 0; idx < text.length(); idx++)
if (text.charAt(idx) == '@' && idx + 4 < text.length() && text.charAt(idx + 4) == '@') {
if (text.substring(idx + 1, idx + 4).equalsIgnoreCase("red"))
colour = 0xff0000;
else if (text.substring(idx + 1, idx + 4).equalsIgnoreCase("lre"))
colour = 0xff9040;
else if (text.substring(idx + 1, idx + 4).equalsIgnoreCase("yel"))
colour = 0xffff00;
else if (text.substring(idx + 1, idx + 4).equalsIgnoreCase("gre"))
colour = 65280;
else if (text.substring(idx + 1, idx + 4).equalsIgnoreCase("blu"))
colour = 255;
else if (text.substring(idx + 1, idx + 4).equalsIgnoreCase("cya"))
colour = 65535;
else if (text.substring(idx + 1, idx + 4).equalsIgnoreCase("mag"))
colour = 0xff00ff;
else if (text.substring(idx + 1, idx + 4).equalsIgnoreCase("whi"))
colour = 0xffffff;
else if (text.substring(idx + 1, idx + 4).equalsIgnoreCase("bla"))
colour = 0;
else if (text.substring(idx + 1, idx + 4).equalsIgnoreCase("dre"))
colour = 0xc00000;
else if (text.substring(idx + 1, idx + 4).equalsIgnoreCase("ora"))
colour = 0xff9040;
else if (text.substring(idx + 1, idx + 4).equalsIgnoreCase("ran"))
colour = (int) (Math.random() * 16777215D);
else if (text.substring(idx + 1, idx + 4).equalsIgnoreCase("or1"))
colour = 0xffb000;
else if (text.substring(idx + 1, idx + 4).equalsIgnoreCase("or2"))
colour = 0xff7000;
else if (text.substring(idx + 1, idx + 4).equalsIgnoreCase("or3"))
colour = 0xff3000;
else if (text.substring(idx + 1, idx + 4).equalsIgnoreCase("gr1"))
colour = 0xc0ff00;
else if (text.substring(idx + 1, idx + 4).equalsIgnoreCase("gr2"))
colour = 0x80ff00;
else if (text.substring(idx + 1, idx + 4).equalsIgnoreCase("gr3"))
colour = 0x40ff00;
idx += 4;
} else if (text.charAt(idx) == '~' && idx + 4 < text.length() && text.charAt(idx + 4) == '~') {
char c = text.charAt(idx + 1);
char c1 = text.charAt(idx + 2);
char c2 = text.charAt(idx + 3);
if (c >= '0' && c <= '9' && c1 >= '0' && c1 <= '9' && c2 >= '0' && c2 <= '9')
x = Integer.parseInt(text.substring(idx + 1, idx + 4));
idx += 4;
} else {
int width = characterWidth[text.charAt(idx)];
if (loggedIn && colour != 0) {
drawCharacter(width, x + 1, y, 0, fontData);
drawCharacter(width, x, y + 1, 0, fontData);
}
drawCharacter(width, x, y, colour, fontData);
x += fontData[width + 7];
}
return;
} catch (Exception exception) {
System.out.println("drawstring: " + exception);
exception.printStackTrace();
return;
}
}
private void drawCharacter(int width, int x, int y, int colour, byte font[]) {
int i1 = x + font[width + 5];
int j1 = y - font[width + 6];
int k1 = font[width + 3];
int l1 = font[width + 4];
int i2 = font[width] * 16384 + font[width + 1] * 128 + font[width + 2];
int j2 = i1 + j1 * width2;
int k2 = width2 - k1;
int l2 = 0;
if (j1 < boundsTopY) {
int i3 = boundsTopY - j1;
l1 -= i3;
j1 = boundsTopY;
i2 += i3 * k1;
j2 += i3 * width2;
}
if (j1 + l1 >= boundsBottomY)
l1 -= ((j1 + l1) - boundsBottomY) + 1;
if (i1 < boundsTopX) {
int j3 = boundsTopX - i1;
k1 -= j3;
i1 = boundsTopX;
i2 += j3;
j2 += j3;
l2 += j3;
k2 += j3;
}
if (i1 + k1 >= boundsBottomX) {
int k3 = ((i1 + k1) - boundsBottomX) + 1;
k1 -= k3;
l2 += k3;
k2 += k3;
}
if (k1 > 0 && l1 > 0) {
plotLetter(pixels, font, colour, i2, j2, k1, l1, k2, l2);
}
}
private void plotLetter(int ai[], byte abyte0[], int i, int j, int k, int l, int i1,
int j1, int k1) {
try {
int l1 = -(l >> 2);
l = -(l & 3);
for (int i2 = -i1; i2 < 0; i2++) {
for (int j2 = l1; j2 < 0; j2++) {
if (abyte0[j++] != 0)
ai[k++] = i;
else
k++;
if (abyte0[j++] != 0)
ai[k++] = i;
else
k++;
if (abyte0[j++] != 0)
ai[k++] = i;
else
k++;
if (abyte0[j++] != 0)
ai[k++] = i;
else
k++;
}
for (int k2 = l; k2 < 0; k2++)
if (abyte0[j++] != 0)
ai[k++] = i;
else
k++;
k += j1;
j += k1;
}
return;
} catch (Exception exception) {
System.out.println("plotletter: " + exception);
exception.printStackTrace();
return;
}
}
private void method259(int ai[], byte abyte0[], int i, int j, int k, int l, int i1,
int j1, int k1) {// todo
for (int l1 = -i1; l1 < 0; l1++) {
for (int i2 = -l; i2 < 0; i2++) {
int j2 = abyte0[j++] & 0xff;
if (j2 > 30) {
if (j2 >= 230) {
ai[k++] = i;
} else {
int k2 = ai[k];
ai[k++] = ((i & 0xff00ff) * j2 + (k2 & 0xff00ff) * (256 - j2) & 0xff00ff00) + ((i & 0xff00) * j2 + (k2 & 0xff00) * (256 - j2) & 0xff0000) >> 8;
}
} else {
k++;
}
}
k += j1;
j += k1;
}
}
public int textHeight(int fontId) {
if (fontId == 0)
return 12;
if (fontId == 1)
return 14;
if (fontId == 2)
return 14;
if (fontId == 3)
return 15;
if (fontId == 4)
return 15;
if (fontId == 5)
return 19;
if (fontId == 6)
return 24;
if (fontId == 7)
return 29;
else
return textHeightFont(fontId);
}
public int textHeightFont(int fontId) {
if (fontId == 0)
return gameFonts[fontId][8] - 2;
else
return gameFonts[fontId][8] - 1;
}
public int textWidth(String text, int fontId) {
int total = 0;
byte font[] = gameFonts[fontId];
for (int idx = 0; idx < text.length(); idx++)
if (text.charAt(idx) == '@' && idx + 4 < text.length() && text.charAt(idx + 4) == '@')
idx += 4;
else if (text.charAt(idx) == '~' && idx + 4 < text.length() && text.charAt(idx + 4) == '~')
idx += 4;
else
total += font[characterWidth[text.charAt(idx)] + 7];
return total;
}
/*public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) {
return true;
}*/
}