public static short getAnimFrameDuration(int animID, int frameID)
    {
        animID &= -16385;
        AnimationManagerData animManData = AppEngine.getCanvas().getAnimManData();

        return(animManData.frameDuration[(int)animManData.animFrameOffset[animID] + frameID]);
    }
    private static int getPrimitiveY(int primitiveShortIndex)
    {
        AnimationManagerData animManData = AppEngine.getCanvas().getAnimManData();

        switch (animManData.primitiveData[primitiveShortIndex])
        {
        case 0:
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
        case 6:
        case 7:
        case 9:
        case 11:
        case 12:
            return((int)animManData.primitiveData[primitiveShortIndex + 2]);

        case 8:
            int num1 = (int)animManData.primitiveData[primitiveShortIndex + 2];
            int num2 = (int)animManData.primitiveData[primitiveShortIndex + 4];
            return(num1 >= num2 ? num2 : num1);

        default:
            return(0);
        }
    }
    public static int getAnimFrameCount(int animID)
    {
        animID &= -16385;
        AnimationManagerData animManData = AppEngine.getCanvas().getAnimManData();

        return(animID < 0 || animID >= 18 ? -1 : (int)animManData.animNumFrames[animID]);
    }
    public static int getAnimFrameHeight(int animID, int frameID)
    {
        animID &= -16385;
        AnimationManagerData animManData = AppEngine.getCanvas().getAnimManData();
        int index1 = (int)animManData.animFrameOffset[animID] + frameID;
        int primitiveShortIndex = animManData.framePrimitiveOffset[index1];
        int frameNumPrimitive   = (int)animManData.frameNumPrimitives[index1];

        if (frameNumPrimitive == 0)
        {
            return(0);
        }
        int num1 = int.MaxValue;
        int num2 = int.MinValue;

        for (int index2 = 0; index2 != frameNumPrimitive; ++index2)
        {
            int primitiveType = (int)animManData.primitiveData[primitiveShortIndex];
            if (primitiveType != 10)
            {
                int primitiveY = AnimationManager.getPrimitiveY(primitiveShortIndex);
                int num3       = primitiveY + AnimationManager.getPrimitiveHeight(primitiveShortIndex);
                if (primitiveY < num1)
                {
                    num1 = primitiveY;
                }
                if (num3 > num2)
                {
                    num2 = num3;
                }
            }
            primitiveShortIndex += AnimationManager.getNumAttributes(primitiveType);
        }
        return(num2 - num1);
    }
    private static int getPrimitiveHeight(int primitiveShortIndex)
    {
        AnimationManagerData animManData = AppEngine.getCanvas().getAnimManData();

        switch (animManData.primitiveData[primitiveShortIndex])
        {
        case 0:
        case 11:
            int index = (int)animManData.primitiveData[primitiveShortIndex + 3] & (int)ushort.MaxValue;
            return((int)animManData.m_subImages[index][4]);

        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
        case 6:
            return((int)animManData.primitiveData[primitiveShortIndex + 4]);

        case 8:
            int num = (int)animManData.primitiveData[primitiveShortIndex + 2] - (int)animManData.primitiveData[primitiveShortIndex + 4];
            return(num >= 0 ? num : -num);

        case 9:
            return(0);

        case 12:
            return((int)animManData.primitiveData[4] - (int)animManData.primitiveData[2]);

        default:
            return(0);
        }
    }
    public static bool startAnim(int animID, int bitFlag)
    {
        AnimationManagerData animManData = AppEngine.getCanvas().getAnimManData();
        int index1 = -1;

        for (int index2 = 0; index2 < 48; ++index2)
        {
            if (animManData.m_animPlayerPool[index2].isAnimating())
            {
                if (animManData.m_animPlayerPool[index2].getAnimID() == animID)
                {
                    return(true);
                }
            }
            else if (index1 < 0)
            {
                index1 = index2;
            }
        }
        if (index1 < 0)
        {
            return(false);
        }
        animManData.m_animPlayerPool[index1].startAnim(animID, bitFlag);
        animManData.m_animPlayerPool[index1].setReverse(false);
        return(true);
    }
    public static void stopAllAnims()
    {
        AnimationManagerData animManData = AppEngine.getCanvas().getAnimManData();

        for (int index = 0; index < 48; ++index)
        {
            animManData.m_animPlayerPool[index].setAnimating(false);
        }
    }
    public static void updateAnims(int timeStep)
    {
        AnimationManagerData animManData = AppEngine.getCanvas().getAnimManData();

        for (int index = 0; index < 48; ++index)
        {
            animManData.m_animPlayerPool[index].updateAnim(timeStep);
        }
    }
    public static bool loadColorsFile(ref AnimationManagerData thisData, ref ResourceManager resMgr)
    {
        InputStream inputStream = ResourceManager.loadBinaryFile(5);

        thisData.colourData = new sbyte[ResourceManager.RESOURCE_FILESIZE_LIST[5]];
        inputStream.read(thisData.colourData);
        inputStream.close();
        return(true);
    }
    public static void setColor(Graphics g, int index)
    {
        AnimationManagerData animManData = AppEngine.getCanvas().getAnimManData();
        int index1 = index * 3;
        int R      = (int)(byte)animManData.colourData[index1];
        int G      = (int)(byte)animManData.colourData[index1 + 1];
        int B      = (int)(byte)animManData.colourData[index1 + 2];

        g.setColor(R, G, B);
    }
    public static Image getImage(int imageIndex)
    {
        AnimationManagerData animManData = AppEngine.getCanvas().getAnimManData();

        if (imageIndex < 0 || imageIndex >= 0)
        {
            return((Image)null);
        }
        Image image = animManData.m_animImageArray[animManData.m_curBank][imageIndex];

        return(animManData.m_animImageArray[animManData.m_curBank][imageIndex]);
    }
    public static bool loadSubimageFile(ref AnimationManagerData thisData, ref ResourceManager resMgr)
    {
        DataInputStream dataInputStream = new DataInputStream(ResourceManager.loadBinaryFile(24));

        for (int index = 0; index < 0; ++index)
        {
            thisData.m_subImages[index][0] = (short)dataInputStream.readUnsignedShort();
            thisData.m_subImages[index][1] = dataInputStream.readShort();
            thisData.m_subImages[index][2] = dataInputStream.readShort();
            thisData.m_subImages[index][3] = (short)dataInputStream.readUnsignedShort();
            thisData.m_subImages[index][4] = (short)dataInputStream.readUnsignedShort();
        }
        return(true);
    }
    public static bool drawAnim(Graphics g, int animID, int x, int y)
    {
        AnimationManagerData animManData = AppEngine.getCanvas().getAnimManData();

        for (int index = 0; index < 48; ++index)
        {
            AnimPlayer animPlayer = animManData.m_animPlayerPool[index];
            if (animPlayer.getAnimID() == animID)
            {
                AnimationManager.drawAnimFrame(g, animID, animPlayer.getCurrAnimFrame(), x, y);
                return(true);
            }
        }
        return(false);
    }
    public static bool getAnimFrameCollisionBox(
        ref int[] result,
        int animID,
        int frameID,
        int boxID)
    {
        bool flag = false;

        if ((animID & 16384) != 0)
        {
            animID &= -16385;
            flag    = true;
        }
        AnimationManagerData animManData = AppEngine.getCanvas().getAnimManData();

        if (animID != -1)
        {
            int index1            = (int)animManData.animFrameOffset[animID] + frameID;
            int index2            = animManData.framePrimitiveOffset[index1];
            int frameNumPrimitive = (int)animManData.frameNumPrimitives[index1];
            int num1 = 0;
            for (int index3 = 0; index3 != frameNumPrimitive; ++index3)
            {
                int primitiveType = (int)animManData.primitiveData[index2];
                if (primitiveType == 2)
                {
                    if (num1 == boxID)
                    {
                        result[0] = (int)animManData.primitiveData[index2 + 1];
                        result[1] = (int)animManData.primitiveData[index2 + 2];
                        result[2] = (int)animManData.primitiveData[index2 + 3];
                        result[3] = (int)animManData.primitiveData[index2 + 4];
                        int num2 = flag ? 1 : 0;
                        return(true);
                    }
                    ++num1;
                }
                index2 += AnimationManager.getNumAttributes(primitiveType);
            }
        }
        result[0] = 0;
        result[1] = 0;
        result[2] = 0;
        result[3] = 0;
        return(false);
    }
    public static bool unloadImage(int resID, int bank)
    {
        AnimationManagerData animManData = AppEngine.getCanvas().getAnimManData();
        int index = 0;

        while (index < 0 && resID != (int)GlobalConstants.IMAGE_RES_IDS[index])
        {
            ++index;
        }
        if (index == 0)
        {
            return(false);
        }
        Image image = animManData.m_animImageArray[bank][index];

        animManData.m_animImageArray[bank][index] = (Image)null;
        return(true);
    }
 public static void constructAnimationManager(ref AnimationManagerData thisData)
 {
     for (int index = 0; index < 48; ++index)
     {
         thisData.m_animPlayerPool[index] = new AnimPlayer();
     }
     thisData.colourData           = (sbyte[])null;
     thisData.animNumFrames        = new sbyte[18];
     thisData.animFrameOffset      = new short[18];
     thisData.frameDuration        = new short[201];
     thisData.frameNumPrimitives   = new sbyte[201];
     thisData.framePrimitiveOffset = new int[201];
     thisData.primitiveData        = new short[538];
     thisData.m_animImageArray     = new Image[1][];
     for (int index = 0; index < 1; ++index)
     {
         thisData.m_animImageArray[index] = new Image[0];
     }
 }
    public static bool getAnimFrameFirePoint(
        ref int[] result,
        int animID,
        int frameID,
        int firePointIDConst)
    {
        bool flag = false;

        if ((animID & 16384) != 0)
        {
            animID &= -16385;
            flag    = true;
        }
        AnimationManagerData animManData = AppEngine.getCanvas().getAnimManData();
        int num               = firePointIDConst;
        int index1            = (int)animManData.animFrameOffset[animID] + frameID;
        int index2            = animManData.framePrimitiveOffset[index1];
        int frameNumPrimitive = (int)animManData.frameNumPrimitives[index1];

        for (int index3 = 0; index3 != frameNumPrimitive; ++index3)
        {
            int primitiveType = (int)animManData.primitiveData[index2];
            if (primitiveType == 7)
            {
                if (num == 0)
                {
                    result[0] = (int)animManData.primitiveData[index2 + 1];
                    result[1] = (int)animManData.primitiveData[index2 + 2];
                    if (flag)
                    {
                        result[0] = -result[0];
                    }
                    return(true);
                }
                --num;
            }
            index2 += AnimationManager.getNumAttributes(primitiveType);
        }
        result[0] = 0;
        result[1] = 0;
        return(false);
    }
    public static int getAnimFrameFirePointCount(int animID, int frameID)
    {
        animID &= -16385;
        AnimationManagerData animManData = AppEngine.getCanvas().getAnimManData();
        int index1            = (int)animManData.animFrameOffset[animID] + frameID;
        int index2            = animManData.framePrimitiveOffset[index1];
        int frameNumPrimitive = (int)animManData.frameNumPrimitives[index1];
        int num = 0;

        for (int index3 = 0; index3 != frameNumPrimitive; ++index3)
        {
            int primitiveType = (int)animManData.primitiveData[index2];
            if (primitiveType == 7)
            {
                ++num;
            }
            index2 += AnimationManager.getNumAttributes(primitiveType);
        }
        return(num);
    }
    public static bool loadImage(
        AnimationManagerData thisData,
        ResourceManager resourceManager,
        int resID)
    {
        int imageIndex = AnimationManager.getImageIndex(resID);

        if (imageIndex == 0)
        {
            return(false);
        }
        int index = 0;

        if (thisData.m_animImageArray[index][imageIndex] == null)
        {
            Image image = ResourceManager.loadImage(resID);
            thisData.m_animImageArray[index][imageIndex] = image;
        }
        return(true);
    }
    private static void drawNormalAnimFrame(Graphics g, int animID, int frameID, int x, int y)
    {
        int clipX      = g.getClipX();
        int clipY      = g.getClipY();
        int clipWidth  = g.getClipWidth();
        int clipHeight = g.getClipHeight();
        AnimationManagerData animManData = AppEngine.getCanvas().getAnimManData();
        int index1            = (int)animManData.animFrameOffset[animID] + frameID;
        int primitiveIndex    = animManData.framePrimitiveOffset[index1];
        int frameNumPrimitive = (int)animManData.frameNumPrimitives[index1];

        for (int index2 = 0; index2 != frameNumPrimitive; ++index2)
        {
            short num = animManData.primitiveData[primitiveIndex];
            switch (num)
            {
            case 0:
            case 11:
                int     x1       = x + (int)animManData.primitiveData[primitiveIndex + 1];
                int     y1       = y + (int)animManData.primitiveData[primitiveIndex + 2];
                short[] subImage = animManData.m_subImages[(int)animManData.primitiveData[primitiveIndex + 3]];
                int     index3   = (int)subImage[0];
                g.clipRect(x1, y1, (int)subImage[3], (int)subImage[4]);
                g.drawImage(animManData.m_animImageArray[animManData.m_curBank][index3], (float)(x1 - (int)subImage[1]), (float)(y1 - (int)subImage[2]), 9);
                g.setClip(clipX, clipY, clipWidth, clipHeight);
                goto case 2;

            case 2:
            case 7:
                primitiveIndex += AnimationManager.getNumAttributes((int)num);
                continue;

            default:
                AnimationManager.drawPrimitive(g, x, y, primitiveIndex, (int)num);
                goto case 2;
            }
        }
        g.setClip(clipX, clipY, clipWidth, clipHeight);
    }
    private static bool drawXFlippedPrimitive(
        Graphics g,
        int x,
        int y,
        int primitiveIndex,
        int primitiveType)
    {
        AnimationManagerData animManData = AppEngine.getCanvas().getAnimManData();

        switch (primitiveType)
        {
        case 3:
        case 4:
        case 5:
        case 6:
            int num1 = (int)animManData.primitiveData[primitiveIndex + 3];
            int num2 = (int)animManData.primitiveData[primitiveIndex + 4];
            int num3 = x - ((int)animManData.primitiveData[primitiveIndex + 1] + num1);
            int num4 = y + (int)animManData.primitiveData[primitiveIndex + 2];
            switch (primitiveType - 3)
            {
            case 0:
                g.drawRect((float)num3, (float)num4, (float)(num1 - 1), (float)(num2 - 1));
                break;

            case 1:
                g.fillRect(num3, num4, num1, num2);
                break;

            case 2:
                g.drawArc(num3, num4, num1, num2, 0, 360);
                break;

            case 3:
                g.fillArc(num3, num4, num1, num2, 0, 360);
                break;
            }
            break;

        case 8:
            int num5 = x - (int)animManData.primitiveData[primitiveIndex + 1];
            int num6 = y + (int)animManData.primitiveData[primitiveIndex + 2];
            int num7 = x - (int)animManData.primitiveData[primitiveIndex + 3];
            int num8 = y + (int)animManData.primitiveData[primitiveIndex + 4];
            g.drawLine((float)num5, (float)num6, (float)num7, (float)num8);
            break;

        case 10:
            AnimationManager.setColor(g, (int)animManData.primitiveData[primitiveIndex + 1]);
            break;

        case 12:
            int num9  = x + (int)animManData.primitiveData[1];
            int posY1 = y + (int)animManData.primitiveData[2];
            int posX2 = x + (int)animManData.primitiveData[3];
            int num10 = y + (int)animManData.primitiveData[4];
            g.fillTriangle(num9, posY1, posX2, num10, num9, num10);
            break;
        }
        return(false);
    }
    private static bool drawNormalAnimFrameExt(
        Graphics g,
        int animID,
        int frameID,
        int x,
        int y,
        int extraAnimId,
        int extraIndex,
        int[] firepoint)
    {
        int clipX      = g.getClipX();
        int clipY      = g.getClipY();
        int clipWidth  = g.getClipWidth();
        int clipHeight = g.getClipHeight();
        AnimationManagerData animManData = AppEngine.getCanvas().getAnimManData();
        bool flag               = false;
        int  num1               = extraAnimId >= 0 ? (int)animManData.animFrameOffset[extraAnimId] : -1;
        int  index1             = (int)animManData.animFrameOffset[animID] + frameID;
        int  primitiveIndex     = animManData.framePrimitiveOffset[index1];
        int  frameNumPrimitive1 = (int)animManData.frameNumPrimitives[index1];

        for (int index2 = 0; index2 != frameNumPrimitive1; ++index2)
        {
            short num2 = animManData.primitiveData[primitiveIndex];
            switch (num2)
            {
            case 0:
            case 11:
                int     x1        = x + (int)animManData.primitiveData[primitiveIndex + 1];
                int     y1        = y + (int)animManData.primitiveData[primitiveIndex + 2];
                int     index3    = (int)animManData.primitiveData[primitiveIndex + 3];
                short[] subImage1 = animManData.m_subImages[index3];
                int     index4    = (int)subImage1[0];
                Image   image1    = animManData.m_animImageArray[animManData.m_curBank][index4];
                g.clipRect(x1, y1, (int)subImage1[3], (int)subImage1[4]);
                g.drawImage(image1, (float)(x1 - (int)subImage1[1]), (float)(y1 - (int)subImage1[2]), 9);
                g.setClip(clipX, clipY, clipWidth, clipHeight);
                if (num1 >= 0)
                {
                    int     animNumFrame  = (int)animManData.animNumFrames[extraAnimId];
                    short[] primitiveData = animManData.primitiveData;
                    for (int index5 = 0; index5 < animNumFrame; ++index5)
                    {
                        int index6 = animManData.framePrimitiveOffset[num1 + index5];
                        AppEngine.ASSERT(primitiveData[index6] == (short)0, "non-sprite in extras anim");
                        int num3 = (int)primitiveData[index6 + 3] & (int)ushort.MaxValue;
                        if (index3 == num3)
                        {
                            int num4 = (int)primitiveData[index6 + 1];
                            int num5 = (int)primitiveData[index6 + 2];
                            int frameNumPrimitive2 = (int)animManData.frameNumPrimitives[num1 + index5];
                            if (firepoint != null)
                            {
                                flag = true;
                                int index7 = index6;
                                int num6   = frameNumPrimitive2 - 1;
                                for (int index8 = 0; index8 < num6; ++index8)
                                {
                                    int primitiveType = (int)primitiveData[index7];
                                    index7 += AnimationManager.getNumAttributes(primitiveType);
                                }
                                AppEngine.ASSERT(primitiveData[index7] == (short)7, "non-firepoint at end of extras anim");
                                firepoint[0] = x1 + (int)primitiveData[index7 + 1] - num4;
                                firepoint[1] = y1 + (int)primitiveData[index7 + 2] - num5;
                            }
                            if (extraIndex < frameNumPrimitive2 - 1)
                            {
                                for (int index7 = 0; index7 < extraIndex; ++index7)
                                {
                                    int primitiveType = (int)primitiveData[index6];
                                    index6 += AnimationManager.getNumAttributes(primitiveType);
                                }
                                int     x2        = (int)primitiveData[index6 + 1] - num4;
                                int     y2        = (int)primitiveData[index6 + 2] - num5;
                                short[] subImage2 = animManData.m_subImages[(int)primitiveData[index6 + 3]];
                                int     index8    = (int)subImage2[0] & (int)ushort.MaxValue;
                                Image   image2    = animManData.m_animImageArray[animManData.m_curBank][index8];
                                if (image1 != null)
                                {
                                    g.clipRect(x2, y2, (int)subImage2[3], (int)subImage2[4]);
                                    g.drawImage(image2, (float)(x2 - (int)subImage2[1]), (float)(y2 - (int)subImage2[2]), 9);
                                    g.setClip(clipX, clipY, clipWidth, clipHeight);
                                    break;
                                }
                                break;
                            }
                            break;
                        }
                    }
                    goto case 2;
                }
                else
                {
                    goto case 2;
                }

            case 2:
            case 7:
                primitiveIndex += AnimationManager.getNumAttributes((int)num2);
                continue;

            default:
                AnimationManager.drawPrimitive(g, x, y, primitiveIndex, (int)num2);
                goto case 2;
            }
        }
        g.setClip(clipX, clipY, clipWidth, clipHeight);
        return(flag);
    }
    public static bool loadAnimFile(ref AnimationManagerData thisData, ref ResourceManager resMgr)
    {
        DataInputStream dataInputStream = new DataInputStream(ResourceManager.loadBinaryFile(3));
        int             index1          = 0;
        int             num1            = 0;

        for (int index2 = 0; index2 != 18; ++index2)
        {
            int num2 = dataInputStream.readUnsignedByte();
            thisData.animNumFrames[index2]   = (sbyte)num2;
            thisData.animFrameOffset[index2] = (short)index1;
            int num3 = 0;
            while (num3 != num2)
            {
                thisData.frameDuration[index1] = dataInputStream.readShort();
                int num4 = dataInputStream.readUnsignedByte();
                thisData.frameNumPrimitives[index1]   = (sbyte)num4;
                thisData.framePrimitiveOffset[index1] = num1;
                for (int index3 = 0; index3 != num4; ++index3)
                {
                    int num5 = dataInputStream.readUnsignedByte();
                    thisData.primitiveData[num1++] = (short)num5;
                    switch (num5)
                    {
                    case 0:
                    case 11:
                        int num6 = num1 - 1;
                        thisData.primitiveData[num6 + 3] = dataInputStream.readShort();
                        thisData.primitiveData[num6 + 1] = dataInputStream.readShort();
                        thisData.primitiveData[num6 + 2] = dataInputStream.readShort();
                        num1 = num6 + 4;
                        break;

                    case 1:
                    case 2:
                    case 3:
                    case 4:
                    case 5:
                    case 6:
                    case 8:
                        short[] primitiveData1 = thisData.primitiveData;
                        int     index4         = num1;
                        int     num7           = index4 + 1;
                        int     num8           = (int)dataInputStream.readShort();
                        primitiveData1[index4] = (short)num8;
                        short[] primitiveData2 = thisData.primitiveData;
                        int     index5         = num7;
                        int     num9           = index5 + 1;
                        int     num10          = (int)dataInputStream.readShort();
                        primitiveData2[index5] = (short)num10;
                        short[] primitiveData3 = thisData.primitiveData;
                        int     index6         = num9;
                        int     num11          = index6 + 1;
                        int     num12          = (int)dataInputStream.readShort();
                        primitiveData3[index6] = (short)num12;
                        short[] primitiveData4 = thisData.primitiveData;
                        int     index7         = num11;
                        num1 = index7 + 1;
                        int num13 = (int)dataInputStream.readShort();
                        primitiveData4[index7] = (short)num13;
                        break;

                    case 7:
                        short[] primitiveData5 = thisData.primitiveData;
                        int     index8         = num1;
                        int     num14          = index8 + 1;
                        int     num15          = (int)dataInputStream.readShort();
                        primitiveData5[index8] = (short)num15;
                        short[] primitiveData6 = thisData.primitiveData;
                        int     index9         = num14;
                        num1 = index9 + 1;
                        int num16 = (int)dataInputStream.readShort();
                        primitiveData6[index9] = (short)num16;
                        break;

                    case 10:
                        thisData.primitiveData[num1++] = (short)dataInputStream.readUnsignedByte();
                        break;

                    case 12:
                        short[] primitiveData7 = thisData.primitiveData;
                        int     index10        = num1;
                        int     num17          = index10 + 1;
                        int     num18          = (int)dataInputStream.readShort();
                        primitiveData7[index10] = (short)num18;
                        short[] primitiveData8 = thisData.primitiveData;
                        int     index11        = num17;
                        int     num19          = index11 + 1;
                        int     num20          = (int)dataInputStream.readShort();
                        primitiveData8[index11] = (short)num20;
                        short[] primitiveData9 = thisData.primitiveData;
                        int     index12        = num19;
                        int     num21          = index12 + 1;
                        int     num22          = (int)dataInputStream.readShort();
                        primitiveData9[index12] = (short)num22;
                        short[] primitiveData10 = thisData.primitiveData;
                        int     index13         = num21;
                        num1 = index13 + 1;
                        int num23 = (int)dataInputStream.readShort();
                        primitiveData10[index13] = (short)num23;
                        break;
                    }
                }
                ++num3;
                ++index1;
            }
        }
        return(true);
    }
    public static void drawScaledPrimitives(
        Graphics g,
        int animID,
        int frameID,
        int x,
        int y,
        int scaleXF,
        int scaleYF,
        bool flipX)
    {
        if (animID < 0)
        {
            return;
        }
        AnimationManagerData animManData = AppEngine.getCanvas().getAnimManData();
        int clipX             = g.getClipX();
        int clipY             = g.getClipY();
        int clipWidth         = g.getClipWidth();
        int clipHeight        = g.getClipHeight();
        int index1            = (int)animManData.animFrameOffset[animID] + frameID;
        int index2            = animManData.framePrimitiveOffset[index1];
        int frameNumPrimitive = (int)animManData.frameNumPrimitives[index1];
        int num1 = 0;

        for (int index3 = 0; index3 != frameNumPrimitive; ++index3)
        {
            index2 += num1;
            short num2 = animManData.primitiveData[index2];
            switch (num2)
            {
            case 0:
            case 2:
            case 7:
            case 11:
label_16:
                num1 = AnimationManager.getNumAttributes((int)num2);
                continue;

            case 10:
                AnimationManager.setColor(g, (int)animManData.primitiveData[index2 + 1]);
                goto case 0;

            default:
                int num3 = MathExt.Fmul((int)animManData.primitiveData[index2 + 1] << 16, scaleXF) + (int)ushort.MaxValue >> 16;
                int num4 = MathExt.Fmul((int)animManData.primitiveData[index2 + 2] << 16, scaleYF) + (int)ushort.MaxValue >> 16;
                int num5 = MathExt.Fmul((int)animManData.primitiveData[index2 + 3] << 16, scaleXF) + (int)ushort.MaxValue >> 16;
                int num6 = MathExt.Fmul((int)animManData.primitiveData[index2 + 4] << 16, scaleYF) + (int)ushort.MaxValue >> 16;
                if (flipX)
                {
                    if (num2 == (short)8 || num2 == (short)12)
                    {
                        num3 = -num3;
                        num5 = -num5;
                    }
                    else
                    {
                        num3 = -num3 - num5;
                    }
                }
                switch (num2)
                {
                case 3:
                    g.drawRect((float)(x + num3), (float)(y + num4), (float)num5, (float)num6);
                    goto label_16;

                case 4:
                    g.fillRect(x + num3, y + num4, num5, num6);
                    goto label_16;

                case 5:
                    g.drawArc(x + num3, y + num4, num5, num6, 0, 360);
                    goto label_16;

                case 6:
                    g.fillArc(x + num3, y + num4, num5, num6, 0, 360);
                    goto label_16;

                case 8:
                    g.drawLine((float)(x + num3), (float)(y + num4), (float)(x + num3 + num5), (float)(y + num4 + num6));
                    goto label_16;

                case 12:
                    g.fillTriangle(x + num3, y + num4, x + num5, y + num6, x + num3, y + num6);
                    goto label_16;

                default:
                    goto label_16;
                }
            }
        }
        g.setClip(clipX, clipY, clipWidth, clipHeight);
    }