mirror of
https://github.com/2003scape/deep-c-rsc.git
synced 2024-03-22 05:49:51 -04:00
2016 lines
70 KiB
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;
|
|
}*/
|
|
}
|