예제 #1
0
        /**
         * Initialise a GameFont.
         *
         * @param name      The name of the font.
         *
         * @param archive   The archive containing the information about the font.
         *
         * @param monospace Is the font monospace?
         */
        public GameFont(String name, Archive archive, bool monospace)
        {
            glyphPixels       = new byte[256][];
            glyphWidth        = new int[256];
            glyphHeight       = new int[256];
            horizontalKerning = new int[256];
            verticalKerning   = new int[256];
            glyphDisplayWidth = new int[256];
            random            = new Random();
            strikethrough     = false;

            /*
             * The buffer containing data about this specific font. The position of the font
             * within the parent archive (index.dat) and the pixel data for the glyph.
             */
            Default317Buffer glyphData = new Default317Buffer(archive.decompressFile(name + ".dat"));

            /*
             * Stores the information about the glyphs, such as the kerning and the
             * dimensons.
             */
            Default317Buffer glyphInformation = new Default317Buffer(archive.decompressFile("index.dat"));

            /*
             * Find the glyph information within the parent archive.
             */
            glyphInformation.position = glyphData.getUnsignedLEShort() + 4;

            /*
             * Find the glyph data for this font within the parent archive.
             */
            int startPosition = glyphInformation.getUnsignedByte();

            if (startPosition > 0)
            {
                glyphInformation.position += 3 * (startPosition - 1);
            }

            /*
             * Get the data for each glyph.
             */
            for (int g = 0; g < 256; g++)
            {
                horizontalKerning[g] = glyphInformation.getUnsignedByte();
                verticalKerning[g]   = glyphInformation.getUnsignedByte();
                int width  = glyphWidth[g] = glyphInformation.getUnsignedLEShort();
                int height = glyphHeight[g] = glyphInformation.getUnsignedLEShort();

                /*
                 * Is the glyph rectangular?
                 */
                int rectangular = glyphInformation.getUnsignedByte();

                /*
                 * Get the area of the glyph.
                 */
                int area = width * height;

                /*
                 * Initialise the pixels for this glyph.
                 */
                glyphPixels[g] = new byte[area];

                /*
                 * Set the pixels for the glyph based on whether it is square or rectangular.
                 */
                if (rectangular == 0)
                {
                    for (int p = 0; p < area; p++)
                    {
                        glyphPixels[g][p] = glyphData.get();
                    }
                }
                else if (rectangular == 1)
                {
                    for (int w = 0; w < width; w++)
                    {
                        for (int h = 0; h < height; h++)
                        {
                            glyphPixels[g][w + h * width] = glyphData.get();
                        }
                    }
                }

                /*
                 * If the height of this glyph is higher than the highest glyph we've currently
                 * processed for this font, store this glyph's height as the highest.
                 *
                 * 126 is the last visible character used in this client (~). No support for
                 * accented characters!
                 */
                if (height > fontHeight && g < 128)
                {
                    fontHeight = height;
                }

                horizontalKerning[g] = 1;
                glyphDisplayWidth[g] = width + 2;

                int activePixels = 0;
                for (int h = height / 7; h < height; h++)
                {
                    activePixels += glyphPixels[g][h * width];
                }

                if (activePixels <= height / 7)
                {
                    glyphDisplayWidth[g]--;
                    horizontalKerning[g] = 0;
                }

                activePixels = 0;
                for (int h = height / 7; h < height; h++)
                {
                    activePixels += glyphPixels[g][(width - 1) + h * width];
                }

                if (activePixels <= height / 7)
                {
                    glyphDisplayWidth[g]--;
                }
            }

            /*
             * Character 32 is space, character 73 is uppercase I and character 105 is
             * lowercase i.
             */
            if (monospace)
            {
                glyphDisplayWidth[32] = glyphDisplayWidth[73];
            }
            else
            {
                glyphDisplayWidth[32] = glyphDisplayWidth[105];
            }
        }
예제 #2
0
        public static void unpack(Archive streamLoader, GameFont[] fonts, Archive mediaArchive)
        {
            spriteCache = new Cache(50000);
            Default317Buffer stream = new Default317Buffer(streamLoader.decompressFile("data"));
            int parentId            = -1;
            int interfaceCount      = stream.getUnsignedLEShort();

            cache = new RSInterface[interfaceCount];
            while (stream.position < stream.buffer.Length)
            {
                int id = stream.getUnsignedLEShort();
                if (id == 65535)
                {
                    parentId = stream.getUnsignedLEShort();
                    id       = stream.getUnsignedLEShort();
                }

                RSInterface rsInterface = cache[id] = new RSInterface();
                rsInterface.id           = id;
                rsInterface.parentID     = parentId;
                rsInterface.type         = stream.getUnsignedByte();
                rsInterface.actionType   = stream.getUnsignedByte();
                rsInterface.contentType  = stream.getUnsignedLEShort();
                rsInterface.width        = stream.getUnsignedLEShort();
                rsInterface.height       = stream.getUnsignedLEShort();
                rsInterface.alpha        = (byte)stream.getUnsignedByte();
                rsInterface.hoveredPopup = stream.getUnsignedByte();
                if (rsInterface.hoveredPopup != 0)
                {
                    rsInterface.hoveredPopup = (rsInterface.hoveredPopup - 1 << 8) + stream.getUnsignedByte();
                }
                else
                {
                    rsInterface.hoveredPopup = -1;
                }
                int conditionCount = stream.getUnsignedByte();
                if (conditionCount > 0)
                {
                    rsInterface.conditionType  = new int[conditionCount];
                    rsInterface.conditionValue = new int[conditionCount];
                    for (int c = 0; c < conditionCount; c++)
                    {
                        rsInterface.conditionType[c]  = stream.getUnsignedByte();
                        rsInterface.conditionValue[c] = stream.getUnsignedLEShort();
                    }
                }

                int opcodeCount = stream.getUnsignedByte();
                if (opcodeCount > 0)
                {
                    rsInterface.opcodes = new int[opcodeCount][];
                    for (int c = 0; c < opcodeCount; c++)
                    {
                        int subOpcodeCount = stream.getUnsignedLEShort();
                        rsInterface.opcodes[c] = new int[subOpcodeCount];
                        for (int s = 0; s < subOpcodeCount; s++)
                        {
                            rsInterface.opcodes[c][s] = stream.getUnsignedLEShort();
                        }
                    }
                }

                if (rsInterface.type == 0)
                {
                    rsInterface.scrollMax = stream.getUnsignedLEShort();
                    rsInterface.hoverOnly = stream.getUnsignedByte() == 1;
                    int childCount = stream.getUnsignedLEShort();
                    rsInterface.children = new int[childCount];
                    rsInterface.childX   = new int[childCount];
                    rsInterface.childY   = new int[childCount];
                    for (int child = 0; child < childCount; child++)
                    {
                        rsInterface.children[child] = stream.getUnsignedLEShort();
                        rsInterface.childX[child]   = stream.getShort();
                        rsInterface.childY[child]   = stream.getShort();
                    }
                }

                if (rsInterface.type == 1)
                {
                    stream.getUnsignedLEShort();
                    stream.getUnsignedByte();
                }

                if (rsInterface.type == 2)
                {
                    rsInterface.inventoryItemId              = new int[rsInterface.width * rsInterface.height];
                    rsInterface.inventoryStackSize           = new int[rsInterface.width * rsInterface.height];
                    rsInterface.itemSwappable                = stream.getUnsignedByte() == 1;
                    rsInterface.inventory                    = stream.getUnsignedByte() == 1;
                    rsInterface.usableItemInterface          = stream.getUnsignedByte() == 1;
                    rsInterface.itemDeletesDragged           = stream.getUnsignedByte() == 1;
                    rsInterface.inventorySpritePaddingColumn = stream.getUnsignedByte();
                    rsInterface.inventorySpritePaddingRow    = stream.getUnsignedByte();
                    rsInterface.spritesX = new int[20];
                    rsInterface.spritesY = new int[20];
                    rsInterface.sprites  = new Sprite[20];
                    for (int sprite = 0; sprite < 20; sprite++)
                    {
                        int spriteExists = stream.getUnsignedByte();
                        if (spriteExists == 1)
                        {
                            rsInterface.spritesX[sprite] = stream.getShort();
                            rsInterface.spritesY[sprite] = stream.getShort();
                            String name = stream.getString();
                            if (mediaArchive != null && name.Length > 0)
                            {
                                int spriteId = name.LastIndexOf(',');
                                rsInterface.sprites[sprite] = getImage(int.Parse(name.Substring(spriteId + 1)),
                                                                       mediaArchive, name.Substring(0, spriteId));
                            }
                        }
                    }

                    rsInterface.actions = new String[5];
                    for (int action = 0; action < 5; action++)
                    {
                        rsInterface.actions[action] = stream.getString();
                        if (rsInterface.actions[action].Length == 0)
                        {
                            rsInterface.actions[action] = null;
                        }
                    }
                }

                if (rsInterface.type == 3)
                {
                    rsInterface.filled = stream.getUnsignedByte() == 1;
                }
                if (rsInterface.type == 4 || rsInterface.type == 1)
                {
                    rsInterface.textCentred = stream.getUnsignedByte() == 1;
                    int font = stream.getUnsignedByte();
                    if (fonts != null)
                    {
                        rsInterface.textDrawingAreas = fonts[font];
                    }
                    rsInterface.textShadowed = stream.getUnsignedByte() == 1;
                }

                if (rsInterface.type == 4)
                {
                    rsInterface.textDefault = stream.getString();
                    rsInterface.textActive  = stream.getString();
                }

                if (rsInterface.type == 1 || rsInterface.type == 3 || rsInterface.type == 4)
                {
                    rsInterface.colourDefault = stream.getInt();
                }
                if (rsInterface.type == 3 || rsInterface.type == 4)
                {
                    rsInterface.colourActive       = stream.getInt();
                    rsInterface.colourDefaultHover = stream.getInt();
                    rsInterface.colourActiveHover  = stream.getInt();
                }

                if (rsInterface.type == 5)
                {
                    String spriteName = stream.getString();
                    if (mediaArchive != null && spriteName.Length > 0)
                    {
                        int spriteId = spriteName.LastIndexOf(",");
                        rsInterface.spriteDefault = getImage(int.Parse(spriteName.Substring(spriteId + 1)),
                                                             mediaArchive, spriteName.Substring(0, spriteId));
                    }

                    spriteName = stream.getString();
                    if (mediaArchive != null && spriteName.Length > 0)
                    {
                        int spriteId = spriteName.LastIndexOf(",");
                        rsInterface.spriteActive = getImage(int.Parse(spriteName.Substring(spriteId + 1)),
                                                            mediaArchive, spriteName.Substring(0, spriteId));
                    }
                }

                if (rsInterface.type == 6)
                {
                    int interfaceId = stream.getUnsignedByte();
                    if (interfaceId != 0)
                    {
                        rsInterface.modelTypeDefault = 1;
                        rsInterface.modelIdDefault   = (interfaceId - 1 << 8) + stream.getUnsignedByte();
                    }

                    interfaceId = stream.getUnsignedByte();
                    if (interfaceId != 0)
                    {
                        rsInterface.modelTypeActive = 1;
                        rsInterface.modelIdActive   = (interfaceId - 1 << 8) + stream.getUnsignedByte();
                    }

                    interfaceId = stream.getUnsignedByte();
                    if (interfaceId != 0)
                    {
                        rsInterface.animationIdDefault = (interfaceId - 1 << 8) + stream.getUnsignedByte();
                    }
                    else
                    {
                        rsInterface.animationIdDefault = -1;
                    }
                    interfaceId = stream.getUnsignedByte();
                    if (interfaceId != 0)
                    {
                        rsInterface.animationIdActive = (interfaceId - 1 << 8) + stream.getUnsignedByte();
                    }
                    else
                    {
                        rsInterface.animationIdActive = -1;
                    }
                    rsInterface.modelZoom      = stream.getUnsignedLEShort();
                    rsInterface.modelRotationX = stream.getUnsignedLEShort();
                    rsInterface.modelRotationY = stream.getUnsignedLEShort();
                }

                if (rsInterface.type == 7)
                {
                    rsInterface.inventoryItemId    = new int[rsInterface.width * rsInterface.height];
                    rsInterface.inventoryStackSize = new int[rsInterface.width * rsInterface.height];
                    rsInterface.textCentred        = stream.getUnsignedByte() == 1;
                    int font = stream.getUnsignedByte();
                    if (fonts != null)
                    {
                        rsInterface.textDrawingAreas = fonts[font];
                    }
                    rsInterface.textShadowed  = stream.getUnsignedByte() == 1;
                    rsInterface.colourDefault = stream.getInt();
                    rsInterface.inventorySpritePaddingColumn = stream.getShort();
                    rsInterface.inventorySpritePaddingRow    = stream.getShort();
                    rsInterface.inventory = stream.getUnsignedByte() == 1;
                    rsInterface.actions   = new String[5];
                    for (int active = 0; active < 5; active++)
                    {
                        rsInterface.actions[active] = stream.getString();
                        if (rsInterface.actions[active].Length == 0)
                        {
                            rsInterface.actions[active] = null;
                        }
                    }
                }

                if (rsInterface.actionType == 2 || rsInterface.type == 2)
                {
                    rsInterface.selectedActionName = stream.getString();
                    rsInterface.spellName          = stream.getString();
                    rsInterface.spellUsableOn      = stream.getUnsignedLEShort();
                }

                if (rsInterface.type == 8)
                {
                    rsInterface.textDefault = stream.getString();
                }

                if (rsInterface.actionType == 1 || rsInterface.actionType == 4 || rsInterface.actionType == 5 ||
                    rsInterface.actionType == 6)
                {
                    rsInterface.tooltip = stream.getString();
                    if (rsInterface.tooltip.Length == 0)
                    {
                        if (rsInterface.actionType == 1)
                        {
                            rsInterface.tooltip = "Ok";
                        }
                        if (rsInterface.actionType == 4)
                        {
                            rsInterface.tooltip = "Select";
                        }
                        if (rsInterface.actionType == 5)
                        {
                            rsInterface.tooltip = "Select";
                        }
                        if (rsInterface.actionType == 6)
                        {
                            rsInterface.tooltip = "Continue";
                        }
                    }
                }
            }

            spriteCache = null;
        }
예제 #3
0
        public IndexedImage(Archive archive, String name, int id, Default317Buffer optionalMetaDataBuffer = null)
        {
            try
            {
                Default317Buffer imageBuffer    = new Default317Buffer(archive.decompressFile(name + ".dat"));
                Default317Buffer metadataBuffer = optionalMetaDataBuffer != null ? optionalMetaDataBuffer : new Default317Buffer(archive.decompressFile("index.dat"));

                metadataBuffer.position = imageBuffer.getUnsignedLEShort();
                resizeWidth             = metadataBuffer.getUnsignedLEShort();
                resizeHeight            = metadataBuffer.getUnsignedLEShort();

                int colourCount = metadataBuffer.getUnsignedByte();
                palette = new int[colourCount];
                for (int c = 0; c < colourCount - 1; c++)
                {
                    palette[c + 1] = metadataBuffer.get3Bytes();
                }

                for (int i = 0; i < id; i++)
                {
                    metadataBuffer.position += 2;
                    imageBuffer.position    += metadataBuffer.getUnsignedLEShort() * metadataBuffer.getUnsignedLEShort();
                    metadataBuffer.position++;
                }

                drawOffsetX = metadataBuffer.getUnsignedByte();
                drawOffsetY = metadataBuffer.getUnsignedByte();
                width       = metadataBuffer.getUnsignedLEShort();
                height      = metadataBuffer.getUnsignedLEShort();
                int type       = metadataBuffer.getUnsignedByte();
                int pixelCount = width * height;

                //Custom: Below are some sanity checks that are custom but help guard against known clean cache data issues.
                bool isEnoughDataAvailable = pixelCount <= (imageBuffer.buffer.Length - imageBuffer.position);

                //Don't let corrupt image data, in default cache, cause BIG allocation (bad for WebGL)
                //or allocate/read for empty images.
                if (pixelCount <= 0 || pixelCount > int.MaxValue / 100 || !isEnoughDataAvailable || imageBuffer.position < 0)                //sometimes happens!!
                {
                    width       = 0;
                    height      = 0;
                    this.pixels = Array.Empty <byte>();
                    return;
                }

                pixels = new byte[pixelCount];

                if (type == 0)
                {
                    for (int i = 0; i < pixelCount; i++)
                    {
                        pixels[i] = imageBuffer.get();
                    }

                    return;
                }

                if (type == 1)
                {
                    for (int x = 0; x < width; x++)
                    {
                        for (int y = 0; y < height; y++)
                        {
                            pixels[x + y * width] = imageBuffer.get();
                        }
                    }
                }
            }
            catch (Exception e)
            {
                isValid = false;

                //Don't throw, this is just a data error. Not an engine fault.
                throw new InvalidOperationException($"Failed to generate IndexedImage for: {name} id: {id}. Reason: {e.Message}\nStack: {e.StackTrace}", e);
            }
        }
예제 #4
0
        internal async Task LoadMediaContentAsync()
        {
            Archive          archiveMedia   = requestArchive(4, "2d graphics", "media", 0, 40);
            Default317Buffer metadataBuffer = new Default317Buffer(archiveMedia.decompressFile("index.dat"));

            inventoryBackgroundImage = new IndexedImage(archiveMedia, "invback", 0, metadataBuffer);
            chatBackgroundImage      = new IndexedImage(archiveMedia, "chatback", 0, metadataBuffer);
            minimapBackgroundImage   = new IndexedImage(archiveMedia, "mapback", 0, metadataBuffer);
            backBase1Image           = new IndexedImage(archiveMedia, "backbase1", 0, metadataBuffer);
            backBase2Image           = new IndexedImage(archiveMedia, "backbase2", 0, metadataBuffer);
            backHmid1Image           = new IndexedImage(archiveMedia, "backhmid1", 0, metadataBuffer);
            for (int icon = 0; icon < 13; icon++)
            {
                sideIconImage[icon] = new IndexedImage(archiveMedia, "sideicons", icon, metadataBuffer);
            }

            minimapCompassImage = new Sprite(archiveMedia, "compass", 0, metadataBuffer);
            minimapEdgeImage    = new Sprite(archiveMedia, "mapedge", 0, metadataBuffer);
            minimapEdgeImage.trim();

            await TaskDelayFactory.Create(1);

            try
            {
                for (int i = 0; i < 100; i++)
                {
                    mapSceneImage[i] = new IndexedImage(archiveMedia, "mapscene", i, metadataBuffer);
                }

                await TaskDelayFactory.Create(1);
            }
            catch (Exception _ex)
            {
                signlink.reporterror($"Unexpected Exception: {_ex.Message} \n\n Stack: {_ex.StackTrace}");
            }

            try
            {
                for (int i = 0; i < 100; i++)
                {
                    mapFunctionImage[i] = new Sprite(archiveMedia, "mapfunction", i, metadataBuffer);
                }

                await TaskDelayFactory.Create(1);
            }
            catch (Exception _ex)
            {
                signlink.reporterror($"Unexpected Exception: {_ex.Message} \n\n Stack: {_ex.StackTrace}");
            }

            try
            {
                for (int i = 0; i < 20; i++)
                {
                    hitMarkImage[i] = new Sprite(archiveMedia, "hitmarks", i, metadataBuffer);
                }

                await TaskDelayFactory.Create(1);
            }
            catch (Exception _ex)
            {
                signlink.reporterror($"Unexpected Exception: {_ex.Message} \n\n Stack: {_ex.StackTrace}");
            }

            try
            {
                for (int i = 0; i < 20; i++)
                {
                    headIcons[i] = new Sprite(archiveMedia, "headicons", i, metadataBuffer);
                }

                await TaskDelayFactory.Create(1);
            }
            catch (Exception _ex)
            {
                signlink.reporterror($"Unexpected Exception: {_ex.Message} \n\n Stack: {_ex.StackTrace}");
                throw;
            }

            mapFlag   = new Sprite(archiveMedia, "mapmarker", 0, metadataBuffer);
            mapMarker = new Sprite(archiveMedia, "mapmarker", 1, metadataBuffer);
            for (int i = 0; i < 8; i++)
            {
                crosses[i] = new Sprite(archiveMedia, "cross", i, metadataBuffer);
            }

            mapDotItem    = new Sprite(archiveMedia, "mapdots", 0, metadataBuffer);
            mapDotNPC     = new Sprite(archiveMedia, "mapdots", 1, metadataBuffer);
            mapDotPlayer  = new Sprite(archiveMedia, "mapdots", 2, metadataBuffer);
            mapDotFriend  = new Sprite(archiveMedia, "mapdots", 3, metadataBuffer);
            mapDotTeam    = new Sprite(archiveMedia, "mapdots", 4, metadataBuffer);
            scrollBarUp   = new IndexedImage(archiveMedia, "scrollbar", 0, metadataBuffer);
            scrollBarDown = new IndexedImage(archiveMedia, "scrollbar", 1, metadataBuffer);
            redStone1     = new IndexedImage(archiveMedia, "redstone1", 0, metadataBuffer);
            redStone2     = new IndexedImage(archiveMedia, "redstone2", 0, metadataBuffer);
            redStone3     = new IndexedImage(archiveMedia, "redstone3", 0, metadataBuffer);
            redStone1_2   = new IndexedImage(archiveMedia, "redstone1", 0, metadataBuffer);
            redStone1_2.flipHorizontally();
            redStone2_2 = new IndexedImage(archiveMedia, "redstone2", 0, metadataBuffer);
            redStone2_2.flipHorizontally();
            redStone1_3 = new IndexedImage(archiveMedia, "redstone1", 0, metadataBuffer);
            redStone1_3.flipVertically();
            redStone2_3 = new IndexedImage(archiveMedia, "redstone2", 0, metadataBuffer);
            redStone2_3.flipVertically();
            redStone3_2 = new IndexedImage(archiveMedia, "redstone3", 0, metadataBuffer);
            redStone3_2.flipVertically();
            redStone1_4 = new IndexedImage(archiveMedia, "redstone1", 0, metadataBuffer);
            redStone1_4.flipHorizontally();
            redStone1_4.flipVertically();
            redStone2_4 = new IndexedImage(archiveMedia, "redstone2", 0, metadataBuffer);
            redStone2_4.flipHorizontally();
            redStone2_4.flipVertically();
            for (int i = 0; i < 2; i++)
            {
                modIcons[i] = new IndexedImage(archiveMedia, "mod_icons", i, metadataBuffer);
            }

            await TaskDelayFactory.Create(1);

            Sprite sprite = new Sprite(archiveMedia, "backleft1", 0, metadataBuffer);

            backLeftIP1 = CreateNewImageProducer(sprite.width, sprite.height, nameof(backLeftIP1));
            sprite.drawInverse(0, 0);
            sprite      = new Sprite(archiveMedia, "backleft2", 0, metadataBuffer);
            backLeftIP2 = CreateNewImageProducer(sprite.width, sprite.height, nameof(backLeftIP2));
            sprite.drawInverse(0, 0);
            sprite       = new Sprite(archiveMedia, "backright1", 0, metadataBuffer);
            backRightIP1 = CreateNewImageProducer(sprite.width, sprite.height, nameof(backRightIP1));
            sprite.drawInverse(0, 0);
            sprite       = new Sprite(archiveMedia, "backright2", 0, metadataBuffer);
            backRightIP2 = CreateNewImageProducer(sprite.width, sprite.height, nameof(backRightIP2));
            sprite.drawInverse(0, 0);
            sprite     = new Sprite(archiveMedia, "backtop1", 0, metadataBuffer);
            backTopIP1 = CreateNewImageProducer(sprite.width, sprite.height, nameof(backTopIP1));
            sprite.drawInverse(0, 0);
            sprite      = new Sprite(archiveMedia, "backvmid1", 0, metadataBuffer);
            backVmidIP1 = CreateNewImageProducer(sprite.width, sprite.height, nameof(backVmidIP1));
            sprite.drawInverse(0, 0);
            sprite      = new Sprite(archiveMedia, "backvmid2", 0, metadataBuffer);
            backVmidIP2 = CreateNewImageProducer(sprite.width, sprite.height, nameof(backVmidIP2));
            sprite.drawInverse(0, 0);
            sprite      = new Sprite(archiveMedia, "backvmid3", 0, metadataBuffer);
            backVmidIP3 = CreateNewImageProducer(sprite.width, sprite.height, nameof(backVmidIP3));
            sprite.drawInverse(0, 0);
            sprite        = new Sprite(archiveMedia, "backhmid2", 0, metadataBuffer);
            backVmidIP2_2 = CreateNewImageProducer(sprite.width, sprite.height, nameof(backVmidIP2_2));
            sprite.drawInverse(0, 0);

            await TaskDelayFactory.Create(1);

            int randomRed    = (int)(StaticRandomGenerator.Next() * 21D) - 10;
            int randomGreen  = (int)(StaticRandomGenerator.Next() * 21D) - 10;
            int randomBlue   = (int)(StaticRandomGenerator.Next() * 21D) - 10;
            int randomColour = (int)(StaticRandomGenerator.Next() * 41D) - 20;

            for (int i = 0; i < 100; i++)
            {
                if (mapFunctionImage[i] != null)
                {
                    mapFunctionImage[i].adjustRGB(randomRed + randomColour, randomGreen + randomColour,
                                                  randomBlue + randomColour);
                }
                if (mapSceneImage[i] != null)
                {
                    mapSceneImage[i].mixPalette(randomRed + randomColour, randomGreen + randomColour,
                                                randomBlue + randomColour);
                }
            }
        }
예제 #5
0
        public async Task StartupCoroutine()
        {
            if (!wasClientStartupCalled)
            {
                wasClientStartupCalled = true;
            }
            else
            {
                throw new InvalidOperationException($"Failed. Cannot call startup on Client multiple times.");
            }

            drawLoadingText(20, "Starting up");

            if (clientRunning)
            {
                rsAlreadyLoaded = true;
                return;
            }

            clientRunning = true;
            bool   validHost = true;
            String s         = getDocumentBaseHost();

            if (s.EndsWith("jagex.com"))
            {
                validHost = true;
            }
            if (s.EndsWith("runescape.com"))
            {
                validHost = true;
            }
            if (s.EndsWith("192.168.1.2"))
            {
                validHost = true;
            }
            if (s.EndsWith("192.168.1.229"))
            {
                validHost = true;
            }
            if (s.EndsWith("192.168.1.228"))
            {
                validHost = true;
            }
            if (s.EndsWith("192.168.1.227"))
            {
                validHost = true;
            }
            if (s.EndsWith("192.168.1.226"))
            {
                validHost = true;
            }
            if (s.EndsWith("127.0.0.1"))
            {
                validHost = true;
            }
            if (!validHost)
            {
                genericLoadingError = true;
                return;
            }

            if (signlink.cache_dat != null)
            {
                for (int i = 0; i < 5; i++)
                {
                    caches[i] = new FileCache(signlink.cache_dat, signlink.cache_idx[i], i + 1);
                }
            }

            connectServer();
            archiveTitle = requestArchive(1, "title screen", "title", expectedCRCs[1], 25);
            fontSmall    = new GameFont("p11_full", archiveTitle, false);
            fontPlain    = new GameFont("p12_full", archiveTitle, false);
            fontBold     = new GameFont("b12_full", archiveTitle, false);
            drawLogo();
            loadTitleScreen();
            Archive archiveConfig   = requestArchive(2, "config", "config", expectedCRCs[2], 30);
            Archive archiveTextures = requestArchive(6, "textures", "textures", expectedCRCs[6], 45);
            //Archive archiveWord = requestArchive(7, "chat system", "wordenc", expectedCRCs[7], 50);
            Archive archiveSounds = requestArchive(8, "sound effects", "sounds", expectedCRCs[8], 55);

            tileFlags       = new byte[4, 104, 104];
            intGroundArray  = CollectionUtilities.Create3DJaggedArray <int>(4, 105, 105);
            worldController = new WorldController(intGroundArray);
            for (int z = 0; z < 4; z++)
            {
                currentCollisionMap[z] = new CollisionMap();
            }

            minimapImage = new Sprite(512, 512);
            Archive archiveVersions = requestArchive(5, "update list", "versionlist", expectedCRCs[5], 60);

            drawLoadingText(60, "Connecting to update server");
            StartOnDemandFetcher(archiveVersions);
            Animation.init(onDemandFetcher.getAnimCount());
            Model.init(onDemandFetcher.fileCount(0), onDemandFetcher);

            songChanging = true;
            onDemandFetcher.request(2, nextSong);
            while (onDemandFetcher.immediateRequestCount() > 0)
            {
                processOnDemandQueue(false);

                await TaskDelayFactory.Create(1);

                if (onDemandFetcher.failedRequests > 3)
                {
                    loadError();
                    return;
                }
            }

            drawLoadingText(65, "Requesting animations");
            int fileRequestCount = onDemandFetcher.fileCount(1);

            for (int id = 0; id < fileRequestCount; id++)
            {
                onDemandFetcher.request(1, id);
            }

            if (!await ProcessAnimationsAsync(fileRequestCount))
            {
                return;
            }

            drawLoadingText(70, "Requesting models");
            fileRequestCount = onDemandFetcher.fileCount(0);
            for (int id = 0; id < fileRequestCount; id++)
            {
                int modelId = onDemandFetcher.getModelId(id);
                if ((modelId & 1) != 0)
                {
                    onDemandFetcher.request(0, id);
                }
            }

            fileRequestCount = onDemandFetcher.immediateRequestCount();
            while (onDemandFetcher.immediateRequestCount() > 0)
            {
                int remaining = fileRequestCount - onDemandFetcher.immediateRequestCount();
                if (remaining > 0)
                {
                    drawLoadingText(70, "Loading models - " + (remaining * 100) / fileRequestCount + "%");
                }
                processOnDemandQueue();

                await TaskDelayFactory.Create(1);
            }

            if (caches[0] != null)
            {
                drawLoadingText(75, "Requesting maps");
                onDemandFetcher.request(3, onDemandFetcher.getMapId(0, 47, 48));
                onDemandFetcher.request(3, onDemandFetcher.getMapId(1, 47, 48));
                onDemandFetcher.request(3, onDemandFetcher.getMapId(0, 48, 48));
                onDemandFetcher.request(3, onDemandFetcher.getMapId(1, 48, 48));
                onDemandFetcher.request(3, onDemandFetcher.getMapId(0, 49, 48));
                onDemandFetcher.request(3, onDemandFetcher.getMapId(1, 49, 48));
                onDemandFetcher.request(3, onDemandFetcher.getMapId(0, 47, 47));
                onDemandFetcher.request(3, onDemandFetcher.getMapId(1, 47, 47));
                onDemandFetcher.request(3, onDemandFetcher.getMapId(0, 48, 47));
                onDemandFetcher.request(3, onDemandFetcher.getMapId(1, 48, 47));
                onDemandFetcher.request(3, onDemandFetcher.getMapId(0, 48, 148));
                onDemandFetcher.request(3, onDemandFetcher.getMapId(1, 48, 148));
                fileRequestCount = onDemandFetcher.immediateRequestCount();
                while (onDemandFetcher.immediateRequestCount() > 0)
                {
                    int remaining = fileRequestCount - onDemandFetcher.immediateRequestCount();
                    if (remaining > 0)
                    {
                        drawLoadingText(75, "Loading maps - " + (remaining * 100) / fileRequestCount + "%");
                    }
                    processOnDemandQueue(false);

                    await TaskDelayFactory.Create(1);
                }
            }

            fileRequestCount = onDemandFetcher.fileCount(0);
            for (int id = 0; id < fileRequestCount; id++)
            {
                int  modelId  = onDemandFetcher.getModelId(id);
                byte priority = 0;
                if ((modelId & 8) != 0)
                {
                    priority = 10;
                }
                else if ((modelId & 0x20) != 0)
                {
                    priority = 9;
                }
                else if ((modelId & 0x10) != 0)
                {
                    priority = 8;
                }
                else if ((modelId & 0x40) != 0)
                {
                    priority = 7;
                }
                else if ((modelId & 0x80) != 0)
                {
                    priority = 6;
                }
                else if ((modelId & 2) != 0)
                {
                    priority = 5;
                }
                else if ((modelId & 4) != 0)
                {
                    priority = 4;
                }
                if ((modelId & 1) != 0)
                {
                    priority = 3;
                }
                if (priority != 0)
                {
                    onDemandFetcher.setPriority(priority, 0, id);
                }
            }

            //Don't need to even preload.
            await((WebGLOnDemandFetcher)onDemandFetcher).preloadRegionsAsync(membersWorld);

            //Remove low memory check.
            int count = onDemandFetcher.fileCount(2);

            for (int id = 1; id < count; id++)
            {
                if (onDemandFetcher.midiIdEqualsOne(id))
                {
                    onDemandFetcher.setPriority((byte)1, 2, id);
                }
            }

            //We don't unpack media here on WebGL because it
            //causes memory problems.

            drawLoadingText(83, "Unpacking textures");
            Rasterizer.unpackTextures(archiveTextures);
            Rasterizer.calculatePalette(0.80000000000000004D);
            Rasterizer.resetTextures();
            drawLoadingText(86, "Unpacking config");
            AnimationSequence.unpackConfig(archiveConfig);
            GameObjectDefinition.load(archiveConfig);
            FloorDefinition.load(archiveConfig);
            ItemDefinition.load(archiveConfig);
            EntityDefinition.load(archiveConfig);
            IdentityKit.load(archiveConfig);
            SpotAnimation.load(archiveConfig);
            Varp.load(archiveConfig);
            VarBit.load(archiveConfig);
            ItemDefinition.membersWorld = membersWorld;

            //Removed low memory check
            drawLoadingText(90, "Unpacking sounds");

            //Sound loading disabled in WebGL.
            byte[] soundData = archiveSounds.decompressFile("sounds.dat");
            Effect.load(new Default317Buffer(soundData));
        }
예제 #6
0
        public IndexedImage(Archive archive, String name, int id)
        {
            try
            {
                Default317Buffer imageBuffer    = new Default317Buffer(archive.decompressFile(name + ".dat"));
                Default317Buffer metadataBuffer = new Default317Buffer(archive.decompressFile("index.dat"));

                metadataBuffer.position = imageBuffer.getUnsignedLEShort();
                resizeWidth             = metadataBuffer.getUnsignedLEShort();
                resizeHeight            = metadataBuffer.getUnsignedLEShort();

                int colourCount = metadataBuffer.getUnsignedByte();
                palette = new int[colourCount];
                for (int c = 0; c < colourCount - 1; c++)
                {
                    palette[c + 1] = metadataBuffer.get3Bytes();
                }

                for (int i = 0; i < id; i++)
                {
                    metadataBuffer.position += 2;
                    imageBuffer.position    += metadataBuffer.getUnsignedLEShort() * metadataBuffer.getUnsignedLEShort();
                    metadataBuffer.position++;
                }

                drawOffsetX = metadataBuffer.getUnsignedByte();
                drawOffsetY = metadataBuffer.getUnsignedByte();
                width       = metadataBuffer.getUnsignedLEShort();
                height      = metadataBuffer.getUnsignedLEShort();
                int type       = metadataBuffer.getUnsignedByte();
                int pixelCount = width * height;
                pixels = new byte[pixelCount];

                if (type == 0)
                {
                    for (int i = 0; i < pixelCount; i++)
                    {
                        pixels[i] = imageBuffer.get();
                    }

                    return;
                }

                if (type == 1)
                {
                    for (int x = 0; x < width; x++)
                    {
                        for (int y = 0; y < height; y++)
                        {
                            pixels[x + y * width] = imageBuffer.get();
                        }
                    }
                }
            }
            catch (Exception e)
            {
                isValid = false;

                //Don't throw, this is just a data error. Not an engine fault.
                throw new InvalidOperationException($"Failed to generate IndexedImage for: {name} id: {id}. Reason: {e.Message}\nStack: {e.StackTrace}", e);
            }
        }
예제 #7
0
        public void start(Archive streamLoader, IBaseClient client1)
        {
            String[] strings = { "model_version", "anim_version", "midi_version", "map_version" };
            for (int i = 0; i < 4; i++)
            {
                byte[]           abyte0 = streamLoader.decompressFile(strings[i]);
                int              j      = abyte0.Length / 2;
                Default317Buffer stream = new Default317Buffer(abyte0);
                versions[i]       = new int[j];
                filePriorities[i] = new byte[j];
                for (int l = 0; l < j; l++)
                {
                    versions[i][l] = stream.getUnsignedLEShort();
                }
            }

            String[] strings2 = { "model_crc", "anim_crc", "midi_crc", "map_crc" };
            for (int k = 0; k < 4; k++)
            {
                byte[]           abyte1   = streamLoader.decompressFile(strings2[k]);
                int              i1       = abyte1.Length / 4;
                Default317Buffer stream_1 = new Default317Buffer(abyte1);
                crcs[k] = new int[i1];
                for (int l1 = 0; l1 < i1; l1++)
                {
                    crcs[k][l1] = stream_1.getInt();
                }
            }

            byte[] abyte2 = streamLoader.decompressFile("model_index");
            int    j1     = versions[0].Length;

            modelIndices = new byte[j1];
            for (int k1 = 0; k1 < j1; k1++)
            {
                if (k1 < abyte2.Length)
                {
                    modelIndices[k1] = abyte2[k1];
                }
                else
                {
                    modelIndices[k1] = 0;
                }
            }

            MapIndexArchiveDeserializer mapIndexDeserializer = new MapIndexArchiveDeserializer(streamLoader);

            MapIndices = mapIndexDeserializer.Deserialize();

            abyte2 = streamLoader.decompressFile("anim_index");
            Default317Buffer stream2 = new Default317Buffer(abyte2);

            j1     = abyte2.Length / 2;
            frames = new int[j1];
            for (int j2 = 0; j2 < j1; j2++)
            {
                frames[j2] = stream2.getUnsignedLEShort();
            }

            abyte2          = streamLoader.decompressFile("midi_index");
            stream2         = new Default317Buffer(abyte2);
            j1              = abyte2.Length;
            musicPriorities = new int[j1];
            for (int k2 = 0; k2 < j1; k2++)
            {
                musicPriorities[k2] = stream2.getUnsignedByte();
            }

            clientInstance = client1;
            running        = true;
            clientInstance.startRunnable(this, 2);
        }