// Decompiled by DJ v3.0.0.63 Copyright 2002 Atanas Neshkov  Date: 11/09/2002 18:13:46
// Home Page : http://members.fortunecity.com/neshkov/dj.html  - Check often for new version!
// Decompiler options: packimports(3) 
// Source File Name:   SpaceImpact.java

import com.lumomedia.nokiagdk.*;
import java.awt.Container;
import java.io.InputStream;

public class SpaceImpact extends Engine
    implements Playable, SpaceImpactConstant
{

    public SpaceImpact(InputStream inputstream, Container container)
    {
        game = new GameData();
        playerInvSpr = new Sprite(bitm_ship_inv, null, 10, 7);
        playerSpr = (new Sprite[] {
            new Sprite(bitm_ship, null, 10, 7)
        });
        enemySpr = new Sprite(rocket11, null, 9, 5);
        rocket = (new Sprite[] {
            new Sprite(rocket11, null, 9, 5)
        });
        enemy1 = (new Sprite[] {
            new Sprite(bitm_ene01a, null, 11, 5), new Sprite(bitm_ene01b, null, 11, 5)
        });
        enemy2 = (new Sprite[] {
            new Sprite(bitm_ene02a, null, 6, 6), new Sprite(bitm_ene02b, null, 6, 6)
        });
        homer = (new Sprite[] {
            new Sprite(bitm_homer01, null, 5, 3)
        });
        Lhomer = (new Sprite[] {
            new Sprite(bitm_Lhomer, null, 5, 3)
        });
        beam = (new Sprite[] {
            new Sprite(bitm_beam01a, null, 5, 5), new Sprite(bitm_beam01b, null, 5, 5), new Sprite(bitm_beam01c, null, 54, 5), new Sprite(bitm_beam01c, null, 54, 5), new Sprite(bitm_beam01c, null, 54, 5), new Sprite(bitm_beam01b, null, 5, 5), new Sprite(bitm_beam01a, null, 5, 5)
        });
        bullet = (new Sprite[] {
            new Sprite(bitm_bullet, null, 2, 1)
        });
        crasch = (new Sprite[] {
            new Sprite(bitm_exp01b, null, 7, 7), new Sprite(bitm_exp01c, null, 7, 7), new Sprite(bitm_exp01b, null, 7, 7), new Sprite(bitm_exp01a, null, 7, 7), new Sprite(bitm_exp01a, null, 7, 7)
        });
        subBoss = (new Sprite[] {
            new Sprite(bitm_sub_boss1, null, 19, 21), new Sprite(bitm_sub_boss1, null, 19, 21), new Sprite(bitm_sub_boss1a, null, 19, 21), new Sprite(bitm_sub_boss1a, null, 19, 21)
        });
        level1Boss = (new Sprite[] {
            new Sprite(bitm_boss02a, null, 20, 23), new Sprite(bitm_boss02a, null, 20, 23), new Sprite(bitm_boss02b, null, 20, 23), new Sprite(bitm_boss02b, null, 20, 23)
        });
        level2Boss = (new Sprite[] {
            new Sprite(bitm_boss03a, null, 23, 21), new Sprite(bitm_boss03a, null, 23, 21), new Sprite(bitm_boss03b, null, 23, 21), new Sprite(bitm_boss03b, null, 23, 21)
        });
        level3Boss = (new Sprite[] {
            new Sprite(bitm_boss04a, null, 22, 20), new Sprite(bitm_boss04a, null, 22, 20), new Sprite(bitm_boss04b, null, 22, 20), new Sprite(bitm_boss04b, null, 22, 20)
        });
        level4Boss = (new Sprite[] {
            new Sprite(bitm_boss05a, null, 15, 25), new Sprite(bitm_boss05a, null, 15, 25), new Sprite(bitm_boss05b, null, 15, 25), new Sprite(bitm_boss05b, null, 15, 25)
        });
        level6Boss = (new Sprite[] {
            new Sprite(bitm_boss06a, null, 18, 19), new Sprite(bitm_boss06a, null, 18, 19), new Sprite(bitm_boss06b, null, 18, 19), new Sprite(bitm_boss06b, null, 18, 19)
        });
        level7Boss = (new Sprite[] {
            new Sprite(bitm_boss07a, null, 30, 25), new Sprite(bitm_boss07a, null, 30, 25), new Sprite(bitm_boss07b, null, 30, 25), new Sprite(bitm_boss07b, null, 30, 25)
        });
        level8Boss = (new Sprite[] {
            new Sprite(bitm_boss08a, null, 38, 38), new Sprite(bitm_boss08a, null, 38, 38), new Sprite(bitm_boss08b, null, 38, 38), new Sprite(bitm_boss08b, null, 38, 38)
        });
        level8BossPod = (new Sprite[] {
            new Sprite(bitm_boss08c, null, 7, 5)
        });
        shield = (new Sprite[] {
            new Sprite(bitm_shield, null, 13, 11), new Sprite(bitm_shielda, null, 13, 11)
        });
        bonus = (new Sprite[] {
            new Sprite(bitm_bonus01a, null, 8, 7), new Sprite(bitm_bonus01b, null, 8, 7)
        });
        enemy3 = (new Sprite[] {
            new Sprite(bitm_ene03, null, 7, 7)
        });
        enemy4 = (new Sprite[] {
            new Sprite(bitm_ene04, null, 8, 5)
        });
        enemy5 = (new Sprite[] {
            new Sprite(bitm_ene05a, null, 9, 5), new Sprite(bitm_ene05b, null, 9, 5)
        });
        enemy6 = (new Sprite[] {
            new Sprite(bitm_ene06a, null, 9, 5), new Sprite(bitm_ene06b, null, 9, 5)
        });
        enemy7 = (new Sprite[] {
            new Sprite(bitm_ene07a, null, 9, 5), new Sprite(bitm_ene07b, null, 9, 5)
        });
        enemy8 = (new Sprite[] {
            new Sprite(bitm_ene08, null, 7, 7)
        });
        enemy10 = (new Sprite[] {
            new Sprite(bitm_ene10a, null, 6, 7), new Sprite(bitm_ene10b, null, 6, 7)
        });
        enemy11 = (new Sprite[] {
            new Sprite(bitm_ene11a, null, 8, 5), new Sprite(bitm_ene11b, null, 8, 5)
        });
        enemy12 = (new Sprite[] {
            new Sprite(bitm_ene12a, null, 10, 5), new Sprite(bitm_ene12b, null, 10, 5)
        });
        enemy13 = (new Sprite[] {
            new Sprite(bitm_ene13a, null, 5, 5)
        });
        linked1 = (new Sprite[] {
            new Sprite(bitm_ene09a, null, 5, 5)
        });
        linked2 = (new Sprite[] {
            new Sprite(bitm_ene09b, null, 5, 5)
        });
        linked3 = (new Sprite[] {
            new Sprite(bitm_ene09c, null, 5, 5)
        });
        status_heart = new Sprite(bitm_sym_life, null, 5, 4);
        status_ammo = new Sprite(bitm_sym_ammo, null, 5, 4);
        status_homer = new Sprite(bitm_sym_homer, null, 5, 4);
        status_beam = new Sprite(bitm_sym_laser, null, 5, 4);
        status_smart = new Sprite(bitm_sym_smart, null, 5, 4);
        level1 = new LevelStruct(20, level1_waves, x, 0, 4, 0, 0);
        level2 = new LevelStruct(24, level2_waves, x, 0, 2, 0, 0);
        level3 = new LevelStruct(23, level3_waves, x, 0, 2, 0, 0);
        level4 = new LevelStruct(20, level4_waves, x, 0, 2, 0, 0);
        level5 = new LevelStruct(19, level5_waves, x, 0, 4, 0, 0);
        level6 = new LevelStruct(38, level6_waves, x, 0, 4, 0, 0);
        level7 = new LevelStruct(28, level7_waves, x, 0, 2, 0, 0);
        level8 = new LevelStruct(6, level8_waves, x, 0, 2, 0, 0);
        levelData = (new LevelStruct[] {
            level1, level2, level3, level4, level5, level6, level7, level8
        });
        pattern = miniSinWaveVectored;
        spritesByType = (new Sprite[][] {
            playerSpr, bullet, crasch, rocket, bullet, enemy1, enemy2, subBoss, shield, beam, 
            homer, linked1, linked2, linked3, enemy5, enemy6, enemy7, bonus, level3Boss, level1Boss, 
            level2Boss, Lhomer, null, level4Boss, level6Boss, level7Boss, enemy3, enemy4, enemy8, enemy10, 
            enemy11, enemy12, enemy13, bonus, level8Boss, level8BossPod, crasch
        });
        setTopLevel(container);
        loadPropertiesFromFile(inputstream);
        registerGame(this);
    }

    void Game_Invaders_Set_Number(Index index, int i, int j)
    {
        int ai[] = new int[5];
        int i1 = i;
        int k;
        for(k = 4; i1 > 9 && k >= 0; k--)
        {
            ai[k] = i1 % 10;
            i1 = (i1 - i1 % 10) / 10;
        }

        ai[k] = i1;
        for(int l = 5 - j; l < 5; l++)
        {
            Game_SetSpriteImage(index, super.P[ai[l]]);
            index = Game_NextObj(index);
        }

    }

    public int Game_space2_Init(int i, GameOptions gameoptions)
    {
        if(!Game_Init(60))
            return 2;
        game.to_do = 0;
        game.continueCounter = 5;
        approachingCity_tiles[0] = bitm_level1_block1;
        approachingCity_tiles[1] = bitm_level1_block2;
        approachingCity_tiles[2] = bitm_level1_block3a;
        approachingCity_tiles[3] = bitm_level1_block3b;
        city_tiles[0] = bitm_city01a;
        city_tiles[1] = bitm_city02a;
        city_tiles[2] = bitm_city03a;
        city_tiles[3] = bitm_city03b;
        aboveThePlanet_tiles[0] = bitm_space01a;
        aboveThePlanet_tiles[1] = bitm_space02a;
        aboveThePlanet_tiles[2] = bitm_space02b;
        atmos_tiles[0] = bitm_atmos03a;
        atmos_tiles[1] = bitm_atmos03b;
        atmos_tiles[2] = bitm_atmos04a;
        atmos_tiles[3] = bitm_atmos05a;
        subway_tiles[0] = bitm_tsub01;
        subway_tiles[1] = bitm_tsub02;
        subway_tiles[2] = bitm_tsub03;
        subway_tiles[3] = bitm_tsub03a;
        approachingPalace_tiles[0] = bitm_pala01a;
        approachingPalace_tiles[1] = bitm_pala02a;
        approachingPalace_tiles[2] = bitm_pala03a;
        approachingPalace_tiles[3] = bitm_pala04a;
        approachingPalace_tiles[4] = bitm_pala04b;
        approachingPalace_tiles[5] = bitm_pala05a;
        alienBase_tiles[0] = bitm_pala03a;
        alienBase_tiles[1] = bitm_pala08a;
        alienBase_tiles[2] = bitm_pala06a;
        alienBase_tiles[3] = bitm_pala06b;
        alienBase_tiles[4] = bitm_pala07a;
        tileImages[0] = aboveThePlanet_tiles;
        tileImages[1] = atmos_tiles;
        tileImages[2] = approachingCity_tiles;
        tileImages[3] = city_tiles;
        tileImages[4] = subway_tiles;
        tileImages[5] = subway_tiles;
        tileImages[6] = approachingPalace_tiles;
        tileImages[7] = alienBase_tiles;
        levelMaps[0] = aboveThePlanet;
        levelMaps[1] = atmosphere;
        levelMaps[2] = cityAndDesert;
        levelMaps[3] = cityAndDesert;
        levelMaps[4] = intoSubway;
        levelMaps[5] = outOfSubway;
        levelMaps[6] = approachingPalace;
        levelMaps[7] = alienBase;
        game.player.score = 0;
        game.player.justFired = 0;
        game.player.lives = 3;
        game.player.credits = 4;
        game.player.target = null;
        game.player.weapon = 1;
        game.player.secondaryWeapon = 10;
        game.player.secondaryAmmo = 3;
        game.activeMap.image = null;
        game.space2_Level = 0;
        if(initLevel(levelData[game.space2_Level]) == 0)
        {
            return 2;
        } else
        {
            initPlayer(gameoptions, 10);
            return 1;
        }
    }

    int Game_space2_Play(int i, GameOptions gameoptions)
    {
        boolean flag = false;
        int j = 1;
        switch(game.gameState)
        {
        case 10: // '\n'
            updatePlayer(i, gameoptions);
            break;

        case 20: // '\024'
            if(continueYesNo(i, gameoptions) != 0)
                game.continueCounter = 5;
            break;
        }
        if(game.to_do != 0 && i != 65)
        {
            j = game.to_do;
            game.to_do = 0;
            return j;
        }
        switch(i)
        {
        case 35: // '#'
        case 42: // '*'
        case 48: // '0'
        case 49: // '1'
        case 50: // '2'
        case 51: // '3'
        case 52: // '4'
        case 53: // '5'
        case 54: // '6'
        case 55: // '7'
        case 56: // '8'
        case 57: // '9'
        case 62: // '>'
        case 80: // 'P'
        case 81: // 'Q'
        case 82: // 'R'
        case 83: // 'S'
        default:
            break;

        case 64: // '@'
            if(game.gameState == 20)
            {
                game.continueCounter--;
                if(game.continueCounter < 0)
                {
                    gameoptions.score = game.player.score;
                    return 11;
                } else
                {
                    Game_Invaders_Set_Number(game.bgIndex, game.continueCounter, 2);
                    return 16;
                }
            }
            if(game.gameState == 30)
                if(game.player.accel == 0)
                {
                    if(Game_SpriteY(game.player.index) > game.ceiling)
                        Game_MoveSprite(game.player.index, Game_SpriteX(game.player.index), Game_SpriteY(game.player.index) - 1);
                    else
                    if(Game_SpriteY(game.player.index) < game.ceiling)
                        Game_MoveSprite(game.player.index, Game_SpriteX(game.player.index), Game_SpriteY(game.player.index) + 1);
                    else
                        game.player.accel = 1;
                } else
                {
                    Game_MoveSprite(game.player.index, Game_SpriteX(game.player.index) + game.player.accel, Game_SpriteY(game.player.index));
                    if(Game_SpriteX(game.player.index) % 3 == 0)
                        game.player.accel++;
                    if(Game_SpriteX(game.player.index) > 104)
                        if(game.space2_Level < 7)
                        {
                            game.space2_Level++;
                            initLevel(levelData[game.space2_Level]);
                            initPlayer(gameoptions, 10);
                        } else
                        {
                            gameoptions.score = game.player.score;
                            return 11;
                        }
                }
            scrollImage(game.activeMap, game.xOffset);
            if(game.currentLevel.tickCount > 0 && game.currentLevel.attackWavesLeft != 0 && game.space2_Level != 7)
            {
                game.xOffset++;
                game.xOffset %= game.activeMap.width * 32;
            } else
            if(game.space2_Level == 7)
            {
                if(game.bossState == 0 && game.xOffset != 122 && game.xOffset != 314 && game.xOffset != 442)
                    game.xOffset++;
                else
                if(game.bossState == 0)
                    space2_SpawnFinalBoss();
                if(game.bossState == 1)
                    if(scrollLeft != 0)
                    {
                        game.xOffset++;
                        scrollLeft--;
                    } else
                    {
                        game.bossState++;
                    }
            }
            updateLevel();
            updateObjects(gameoptions);
            space2_handleCollisions(gameoptions);
            if(game.player.justFired != 0)
                if(game.player.justFired == 2)
                    game.player.justFired = 0;
                else
                    game.player.justFired++;
            j = 16;
            break;

        case 65: // 'A'
            if(game.player.shield != null)
            {
                removeObject(game.player.shield);
                game.player.shield = null;
            }
            if(game.bossState == 127)
                game.gameState = 30;
            break;

        case 17: // '\021'
        case 19: // '\023'
        case 21: // '\025'
        case 24: // '\030'
        case 29: // '\035'
        case 30: // '\036'
        case 112: // 'p'
            j = 5;
            break;
        }
        return j;
    }

    Index addObject(int i, int j, int k, int l)
    {
        if(game.objectsOnScreen < 40)
        {
            Sprite sprite = spritesByType[i][0];
            Index index = Game_AddSprite(sprite, j, 2 - (i != 8 ? 0 : 1), k, l);
            game.objList[index.toInt()] = new SpaceObject(objectsByType[i]);
            game.objectsOnScreen++;
            return index;
        } else
        {
            return null;
        }
    }

    Index aquireTarget()
    {
        int i = -99;
        Index index1 = null;
        for(Index index = Game_NextObj(game.player.index); index != null; index = Game_NextObj(index))
            if(game.objList[index.toInt()].type != 50 && game.objList[index.toInt()].type != 0 && !isFriendly(index) && game.objList[index.toInt()].hitsLeft > i)
            {
                i = game.objList[index.toInt()].hitsLeft;
                index1 = index;
            }

        return index1;
    }

    void awardItem(int i, int j, GameOptions gameoptions)
    {
label0:
        switch(i)
        {
        default:
            break;

        case 17: // '\021'
            gameoptions.tune = 4;
            int k;
            do
                k = Game_Random() % 4;
            while(game.player.lives == 5 && k == 0);
            switch(k)
            {
            default:
                break;

            case 0: // '\0'
                game.player.lives++;
                break label0;

            case 1: // '\001'
                if(game.player.secondaryWeapon != 10)
                {
                    game.player.secondaryWeapon = 10;
                    Game_SetSpriteImage(game.secondaryWeaponIndex, status_homer);
                    game.player.secondaryAmmo = 3;
                } else
                {
                    game.player.secondaryAmmo += 3;
                    Game_ChangeStyle(game.secondaryWeaponIndex, 4);
                }
                break label0;

            case 2: // '\002'
                if(game.player.secondaryWeapon != 9)
                {
                    game.player.secondaryWeapon = 9;
                    Game_SetSpriteImage(game.secondaryWeaponIndex, status_beam);
                    game.player.secondaryAmmo = 3;
                } else
                {
                    game.player.secondaryAmmo += 3;
                }
                break label0;

            case 3: // '\003'
                if(game.player.secondaryWeapon != 22)
                {
                    game.player.secondaryWeapon = 22;
                    Game_SetSpriteImage(game.secondaryWeaponIndex, status_smart);
                    game.player.secondaryAmmo = 1;
                } else
                {
                    game.player.secondaryAmmo++;
                }
                break;
            }
            break;

        case 33: // '!'
            game.player.secondaryAmmo += 3;
            break;

        case 49: // '1'
            if(game.player.score < 31500 - j)
                game.player.score += j;
            Game_Invaders_Set_Number(game.scoreIndex, game.player.score, 5);
            break;
        }
        space2_updateStatusDisplay();
    }

    boolean checkMapCollision(TileMap tilemap, Index index, int i)
    {
        int l = Game_SpriteH(index);
        if(tilemap.position == 43 && i > Game_SpriteY(tilemap.index) + Game_SpriteH(tilemap.index) || tilemap.position == 0 && i + l < Game_SpriteY(tilemap.index))
            return false;
        int j = Game_SpriteX(index);
        int k = Game_SpriteW(index);
        if(tilemap.position == 0)
        {
            int k1 = Game_SpriteY(tilemap.index) - i;
            for(int k2 = 0; k1 < l; k2++)
            {
                int i1 = 0;
                for(int i2 = j; i1 < k; i2++)
                {
                    int i3 = getPixelOffW(Game_SpriteImg(index), k, i1, k1);
                    int k3 = getPixelOffW(tilemap.image, 84, i2, k2);
                    if(i3 != 0 && k3 != 0)
                        return true;
                    i1++;
                }

                k1++;
            }

        } else
        {
            int l1 = 0;
            for(int l2 = i; l2 < Game_SpriteH(tilemap.index) && l1 < l; l2++)
            {
                int j1 = 0;
                for(int j2 = j; j1 < k; j2++)
                {
                    int j3 = getPixelOffW(Game_SpriteImg(index), k, j1, l1);
                    int l3 = getPixelOffW(tilemap.image, 84, j2, l2);
                    if(j3 != 0 && l3 != 0)
                        return true;
                    j1++;
                }

                l1++;
            }

        }
        return false;
    }

    void checkSmartCollisions(GameOptions gameoptions)
    {
        Index index1;
        for(Index index = Game_NextObj(game.player.index); index != null; index = index1)
        {
            int j = index.toInt();
            index1 = Game_NextObj(index);
            if(!isFriendly(index))
            {
                int i = Game_SpriteX(index);
                if(i == game.smartX || i == game.smartX + 1 || i == game.smartX + 2 || i == game.smartX + 3 || i == game.smartX - 1 || i == game.smartX - 2 || i == game.smartX - 3)
                {
                    if(game.objList[j].type == 17 || game.objList[j].type == 33)
                        awardItem(game.objList[j].type, 1, gameoptions);
                    if(!isBoss(index) && index != game.podIndex[0] && index != game.podIndex[1])
                    {
                        game.objList[j] = new SpaceObject(objectsByType[2]);
                        awardItem(49, 2, gameoptions);
                    } else
                    if(game.objList[j].hitsLeft <= 2)
                    {
                        if(isBoss(index))
                            explodeBoss(index, gameoptions);
                    } else
                    {
                        game.objList[j].hitsLeft -= 2;
                        awardItem(49, 2, gameoptions);
                    }
                }
            }
        }

    }

    Index checkSpriteCollisions(Index index)
    {
        for(Index index1 = Game_NextObj(game.player.index); index1 != null; index1 = Game_NextObj(index1))
            if(!isFriendly(index1) && space2_checkOverlap(index, index1))
                return index1;

        return null;
    }

    boolean clipEnemy_left(Index index)
    {
        if(Game_SpriteX(index) < 1 || Game_SpriteX(index) > 250)
        {
            removeObject(index);
            return true;
        } else
        {
            return false;
        }
    }

    boolean clipEnemy_right(Index index)
    {
        if(Game_SpriteX(index) + Game_SpriteW(index) > 84)
        {
            removeObject(index);
            return true;
        } else
        {
            return false;
        }
    }

    int continueYesNo(int i, GameOptions gameoptions)
    {
        switch(i)
        {
        case 49: // '1'
        case 51: // '3'
        case 52: // '4'
        case 54: // '6'
            game.player.justFired = 0;
            game.player.burstFire = 0;
            game.player.lives = 3;
            game.player.target = null;
            game.player.weapon = 1;
            game.player.secondaryWeapon = 10;
            game.player.secondaryAmmo = 3;
            initLevel(game.currentLevel);
            initPlayer(gameoptions, 10);
            if(game.currentLevel.continueFrom > 0)
                game.currentLevel.attackWavesLeft = game.currentLevel.continueFrom;
            else
                game.currentLevel.attackWavesLeft = game.currentLevel.numAttackWaves;
            game.currentLevel.tickCount = 20;
            game.gameState = 10;
            return 1;

        case 50: // '2'
        case 53: // '5'
        default:
            return 0;
        }
    }

    void enemyFire(Index index, int i, int j)
    {
        if(!isBoss(index) && game.objList[index.toInt()].shotsLeft == 0)
            return;
        if(Game_SpriteX(index) > 84)
        {
            return;
        } else
        {
            addObject(i, j, Game_SpriteX(index) - 2, Game_SpriteY(index) + (Game_SpriteH(index) >> 1));
            game.objList[index.toInt()].shotsLeft--;
            return;
        }
    }

    boolean enemyWillFire(Index index)
    {
        int i = 0;
        int j = index.toInt();
        if(game.objList[j].aggression == 0 || game.objList[j].aggression == 127)
            return false;
        if(Game_Random() % game.objList[j].aggression == 0)
        {
            if(game.objList[j].attackMethod != 20)
                return true;
            if(i < 1)
            {
                i = Game_Random() % 3 + 2;
                return true;
            }
            i--;
        }
        return false;
    }

    void explodeBoss(Index index, GameOptions gameoptions)
    {
        int j = Game_SpriteX(index);
        int k = Game_SpriteY(index);
        int l = Game_SpriteW(index);
        int i1 = Game_SpriteH(index);
        removeObject(index);
        game.bossState = 127;
        gameoptions.constant = 3000;
        game.to_do = 27;
        int j1 = j + (l >> 1);
        int k1 = k + (i1 >> 1);
        byte byte0;
        if(game.space2_Level == 7)
            byte0 = 36;
        else
            byte0 = 2;
        Index index1 = addObject(byte0, game.currentLevel.drawStyle, j1, k1);
        game.objList[index1.toInt()].frame = Game_Random() % game.objList[index1.toInt()].numFrames;
        for(int i = 0; i < 5 + (game.space2_Level != 7 ? 0 : 1); i++)
        {
            int l1;
            int i2;
            if(game.space2_Level == 7)
            {
                l1 = Game_Random() % 20 + 1;
                i2 = Game_Random() % 13 + 1;
            } else
            {
                l1 = Game_Random() % 4 + 1;
                i2 = 6;
            }
            Index index2 = addObject(byte0, game.currentLevel.drawStyle, j1 + l1, k1 + i2);
            game.objList[index2.toInt()].frame = Game_Random() % game.objList[index2.toInt()].numFrames;
            index2 = addObject(byte0, game.currentLevel.drawStyle, j1 - l1, k1 - i2);
            game.objList[index2.toInt()].frame = Game_Random() % game.objList[index2.toInt()].numFrames;
        }

        if(game.space2_Level == 7)
        {
            if(game.podIndex[0] != null)
                removeObject(game.podIndex[0]);
            if(game.podIndex[1] != null)
                removeObject(game.podIndex[1]);
        }
        awardItem(49, 30, gameoptions);
    }

    void followPreset(Index index, int i, int j, int k)
    {
        int i1 = Game_SpriteX(index);
        boolean flag = false;
        int j1;
        if(j == 0)
        {
            if(game.ceiling == 16)
                j1 = 10;
            else
                j1 = 0;
        } else
        {
            j1 = k;
        }
        i1 -= i;
        if(i1 < 0)
            i1 = 0;
        int l = pattern[i1 % pattern.length] + j1;
        if(l < game.ceiling)
            l = game.ceiling;
        Game_MoveSprite(index, i1, l);
        if(!clipEnemy_left(index))
        {
            switch(game.objList[index.toInt()].attackMethod)
            {
            case 1: // '\001'
                if(l == 27 || l == 9)
                    flag = true;
                break;

            case 10: // '\n'
            case 11: // '\013'
            case 12: // '\f'
            case 13: // '\r'
                if(pattern[i1 % pattern.length] == 4 || pattern[i1 % pattern.length] == -4)
                    flag = true;
                break;

            case 15: // '\017'
            case 16: // '\020'
                flag = true;
                break;
            }
            if(flag && enemyWillFire(index))
                enemyFire(index, 4, game.currentLevel.drawStyle);
        }
    }

    int getPixelOffW(short aword0[][], int i, int j, int k)
    {
        if(j < 0 || k < 0 || j >= i)
            return 0;
        else
            return aword0[k >> 3][j] & 1 << k % 8;
    }

    void initContinue(GameOptions gameoptions)
    {
        Game_ClearObjs();
        space2_clearObjectList();
        if(game.currentLevel.drawStyle == 4)
            game.darkBlock = Game_AddBlock(16, 0, 0, 0, 84, 48);
        for(int i = 0; i < 4; i++)
            game.continueCreditIndex[i] = Game_AddSprite(status_smart, 4, 3, i * 6, 0);

        for(int j = 3; j >= game.player.credits; j--)
            Game_ChangeStyle(game.continueCreditIndex[j], 64);

        game.bgIndex = Game_AddSprite(super.P[0], 4, 3, 36, 20);
        Game_AddSprite(super.P[0], 4, 3, 40, 20);
        Game_Invaders_Set_Number(game.bgIndex, 5, 2);
        game.gameState = 20;
        gameoptions.repeat = 800;
        game.to_do = 28;
    }

    int initLevel(LevelStruct levelstruct)
    {
        game.currentLevel = levelstruct;
        game.currentLevel.attackWavesLeft = game.currentLevel.numAttackWaves;
        game.currentLevel.continueFrom = 0;
        game.currentLevel.tickCount = 20;
        Game_ClearObjs();
        space2_clearObjectList();
        game.smartX = 0;
        game.xOffset = 0;
        game.podIndex[0] = null;
        game.podIndex[1] = null;
        space2_setupDisplay();
        game.bossState = 0;
        game.gameState = 10;
        game.to_do = 0;
        return 1;
    }

    void initPlayer(GameOptions gameoptions, int i)
    {
        game.player.state = 0;
        game.player.accel = 0;
        if(i == 10)
        {
            game.player.index = addObject(0, game.currentLevel.drawStyle, 5, 20);
            game.player.shield = null;
            game.player.target = null;
        } else
        {
            game.objList[game.player.index.toInt()] = new SpaceObject(objectsByType[0]);
            Game_SetSpriteImage(game.player.index, spritesByType[0][0]);
            Game_MoveSprite(game.player.index, 5, 20);
        }
        byte byte0;
        if(game.currentLevel.drawStyle == 4)
            byte0 = 4;
        else
            byte0 = 2;
        if(game.player.shield != null)
        {
            Game_MoveSprite(game.player.shield, 3, 18);
            Game_ChangeStyle(game.player.shield, byte0);
        } else
        {
            game.player.shield = addObject(8, byte0, 3, 18);
        }
        gameoptions.constant = 3000;
        gameoptions.repeat = 100;
        game.to_do = 23;
        space2_updateStatusDisplay();
        int _tmp = game.space2_Level;
    }

    Index initTileMap(TileMap tilemap, int i, int j, short aword0[], int k, short aword1[][], int l)
    {
        tilemap.width = i;
        tilemap.height = j;
        tilemap.map = aword0;
        tilemap.image = new short[j][84];
        tilemap.sprite = new Sprite(tilemap.image, null, 84, tilemap.height * 8);
        tilemap.position = k;
        tilemap.tileSet = aword1;
        if(k == 0)
            tilemap.index = Game_AddSprite(tilemap.sprite, l, 1, 0, 48 - tilemap.height * 8);
        else
            tilemap.index = Game_AddSprite(tilemap.sprite, l, 1, 0, 0);
        return tilemap.index;
    }

    void init_floorAndCeiling(int i)
    {
        if(i == 43)
        {
            game.ceiling = 16;
            game.floor = 42;
        } else
        {
            game.ceiling = 6;
            game.floor = 32;
        }
    }

    boolean isBoss(Index index)
    {
        int i = index.toInt();
        return game.objList[i].type == 7 || game.objList[i].type == 19 || game.objList[i].type == 20 || game.objList[i].type == 18 || game.objList[i].type == 23 || game.objList[i].type == 24 || game.objList[i].type == 25 || game.objList[i].type == 34;
    }

    boolean isFriendly(Index index)
    {
        int i = index.toInt();
        return game.objList[i].type == 0 || game.objList[i].type == 2 || game.objList[i].type == 1 || game.objList[i].type == 8 || game.objList[i].type == 9 || game.objList[i].type == 10 || game.objList[i].type == 22 || game.objList[i].type == 36;
    }

    void removeObject(Index index)
    {
        Game_RemoveObj(index);
        if(game.objectsOnScreen != 0)
            game.objectsOnScreen--;
        game.objList[index.toInt()].type = 50;
        if(index == game.player.target)
            game.player.target = null;
        if(index == game.podIndex[0])
            game.podIndex[0] = null;
        if(index == game.podIndex[1])
            game.podIndex[1] = null;
    }

    void scrollImage(TileMap tilemap, int i)
    {
        short aword0[][] = tilemap.image;
        for(int j1 = 0; j1 < tilemap.height; j1++)
        {
            for(int k1 = 0; k1 < 84; k1++)
                aword0[j1][k1] = 0;

        }

        for(int i1 = 0; i1 < tilemap.height; i1++)
        {
            int k = (i / 32) % tilemap.width;
            k += tilemap.width * i1;
            int j = i % 32;
            for(int l = 0; l < 84; l++)
            {
                short word0;
                for(word0 = tilemap.map[k]; word0 == 0 && l < 84; word0 = tilemap.map[k])
                {
                    k++;
                    l += 32 - j;
                    if(k % tilemap.width == 0)
                        k = tilemap.width * i1;
                    j = 0;
                }

                if(l >= 84)
                    break;
                if(j > 31)
                {
                    if(++k % tilemap.width == 0)
                        k = tilemap.width * i1;
                    j = 0;
                }
                aword0[i1][l] |= tilemap.tileSet[word0 - 1][j];
                j++;
            }

        }

        tilemap.sprite.setData(aword0);
        Game_SetSpriteImage(tilemap.index, tilemap.sprite);
    }

    void space2_SpawnFinalBoss()
    {
        byte byte0 = 90;
        int i = game.ceiling - 1;
        game.bossIndex = addObject(34, game.currentLevel.drawStyle, byte0, i);
        game.bossState = 1;
        AttackWave attackwave = game.currentLevel.waves[game.currentLevel.numAttackWaves - 1];
        game.objList[game.bossIndex.toInt()].aggression = attackwave.aggression;
        game.objList[game.bossIndex.toInt()].frame = 0;
        game.objList[game.bossIndex.toInt()].hitsLeft = attackwave.hitsLeft;
        game.objList[game.bossIndex.toInt()].shotsLeft = attackwave.ammo;
        game.podIndex[0] = addObject(35, game.currentLevel.drawStyle, byte0 + 6, i + 16);
        game.podIndex[1] = addObject(35, game.currentLevel.drawStyle, byte0 + 4, i + 23);
        scrollLeft = 44;
    }

    void space2_WigglePods(Index index)
    {
        if(game.objList[game.bossIndex.toInt()].frame <= 1)
            Game_MoveSprite(index, Game_SpriteX(index), Game_SpriteY(index) + 1);
        else
            Game_MoveSprite(index, Game_SpriteX(index), Game_SpriteY(index) - 1);
    }

    void space2_attack_BossBasic(Index index, int i, int j)
    {
        int k = Game_SpriteX(index);
        int l = Game_SpriteY(index);
        l += direction;
        if(checkMapCollision(game.activeMap, index, l))
            if(game.activeMap.position == 0)
                direction = -1;
            else
                direction = 1;
        if(game.activeMap.position == 0 && l <= game.ceiling || game.activeMap.position == 43 && l + Game_SpriteH(index) >= game.floor)
            direction = -direction;
        if(game.space2_Level == 0 && l + Game_SpriteH(index) >= 48)
            direction = -direction;
        if(enemyWillFire(index) && j != 0)
            enemyFire(index, j, game.currentLevel.drawStyle);
        if(isBoss(index))
            game.bossState = 30;
        Game_MoveSprite(index, k, l);
    }

    void space2_attack_BossFinalAfterPods(Index index)
    {
        int i = Game_SpriteX(index);
        int j = Game_SpriteY(index);
        boolean flag = false;
        switch(game.bossState)
        {
        case 50: // '2'
            if(i < 99)
            {
                i++;
                flag = true;
            } else
            {
                game.bossState = 60;
            }
            break;

        case 60: // '<'
            for(int l = game.ceiling; l < game.floor - spritesByType[31][0].getHeight(); l += spritesByType[31][0].getHeight() + 1)
            {
                int i1 = 0;
                for(int k = 84 + 2 * spritesByType[31][0].getWidth(); i1 < 2; k -= spritesByType[31][0].getWidth())
                {
                    addObject(31, game.currentLevel.drawStyle, k, l);
                    i1++;
                }

            }

            game.bossState = 70;
            break;

        case 70: // 'F'
            if(space2_bossMoveOntoScreen(index))
                game.bossState = 80;
            break;

        default:
            space2_attack_BossSpawn(index, 29, 6, 14);
            if(++ticker > 20)
            {
                game.bossState = 50;
                ticker = 0;
            }
            if(game.objList[game.bossIndex.toInt()].hitsLeft < 2)
                ticker = 0;
            break;
        }
        if(flag)
            Game_MoveSprite(index, i, j);
    }

    void space2_attack_BossRush(Index index, int i, int j)
    {
        int k = Game_SpriteX(index);
        int l = Game_SpriteY(index);
        boolean flag = false;
        switch(game.bossState)
        {
        case 20: // '\024'
            if(k > 10)
            {
                if(j == 100)
                    k -= 2;
                else
                    k -= 4;
                if(checkMapCollision(game.activeMap, index, l))
                    if(game.activeMap.position == 0)
                        l--;
                    else
                        l++;
                flag = true;
            } else
            {
                game.bossState = 10;
            }
            break;

        case 10: // '\n'
            if(k < 84 - Game_SpriteW(index) - 10)
            {
                k++;
                flag = true;
            } else
            {
                game.bossState = 30;
            }
            break;

        case 40: // '('
            if(k < 84)
            {
                k++;
                flag = true;
            } else
            {
                game.bossState = 20;
            }
            break;

        default:
            space2_attack_BossBasic(index, 1, i);
            if(Game_Random() % 50 == 0 && l < game.floor && l > game.ceiling && k <= 56)
                if(j == 100)
                    game.bossState = 20;
                else
                    game.bossState = 40;
            break;
        }
        if(flag)
            Game_MoveSprite(index, k, l);
    }

    void space2_attack_BossSpawn(Index index, int i, int j, int k)
    {
        j = (Game_SpriteX(index) + j) - spritesByType[i][0].getWidth();
        k = Game_SpriteY(index) + k;
        if(enemyWillFire(index) && spawnCount == 0)
        {
            Index index1 = addObject(i, game.currentLevel.drawStyle, j, k);
            spawnCount = 6;
        } else
        if(spawnCount > 0)
            spawnCount--;
    }

    void space2_attack_DiveBomb(Index index, int i)
    {
        int j = Game_SpriteX(index);
        int k = Game_SpriteY(index);
        boolean flag = false;
        j -= i;
        if(j > 56)
            k = game.ceiling;
        else
        if(j > 28 && k < game.floor - Game_SpriteH(index))
        {
            k += i;
            flag = true;
        }
        Game_MoveSprite(index, j, k);
        if(!clipEnemy_left(index) && flag && enemyWillFire(index))
            enemyFire(index, 4, game.currentLevel.drawStyle);
    }

    void space2_attack_HalfDiveBomb(Index index, int i, int j)
    {
        int k = Game_SpriteX(index);
        int l = Game_SpriteY(index);
        boolean flag = false;
        k -= i;
        switch(j)
        {
        default:
            break;

        case 43: // '+'
            if(k > 84)
            {
                l = game.ceiling;
                break;
            }
            if(l < 9)
            {
                l++;
                flag = true;
            }
            break;

        case 0: // '\0'
            if(k > 84)
            {
                l = game.floor;
                break;
            }
            if(l > 27)
            {
                l--;
                flag = true;
            }
            break;
        }
        Game_MoveSprite(index, k, l);
        if(!clipEnemy_left(index) && flag && enemyWillFire(index))
            enemyFire(index, 4, game.currentLevel.drawStyle);
    }

    void space2_attack_Homing(Index index, int i)
    {
        int j = Game_SpriteX(index);
        int k = Game_SpriteY(index);
        j -= i;
        if(k < Game_SpriteY(game.player.index))
            k++;
        else
        if(k > Game_SpriteY(game.player.index))
            k--;
        Game_MoveSprite(index, j, k);
        clipEnemy_left(index);
    }

    void space2_attack_InvDiveBomb(Index index, int i)
    {
        int j = Game_SpriteX(index);
        int k = Game_SpriteY(index);
        boolean flag = false;
        j -= i;
        if(j > 56)
            k = game.floor - Game_SpriteH(index);
        else
        if(j > 28 && k > game.ceiling + i)
        {
            k -= i;
            flag = true;
        }
        Game_MoveSprite(index, j, k);
        if(!clipEnemy_left(index) && flag && enemyWillFire(index))
            enemyFire(index, 4, game.currentLevel.drawStyle);
    }

    void space2_attack_LR(Index index, int i)
    {
        int j = Game_SpriteX(index);
        int k = Game_SpriteY(index);
        if(!clipEnemy_right(index))
        {
            j += i;
            Game_MoveSprite(index, j, k);
        } else
        {
            removeObject(index);
        }
    }

    void space2_attack_PlayerHomer(Index index, int i)
    {
        int j = Game_SpriteX(index);
        int k = Game_SpriteY(index);
        if(game.player.target == null || Game_SpriteX(game.player.target) < Game_SpriteX(index))
            game.player.target = aquireTarget();
        else
        if(game.objList[game.player.target.toInt()].type == 50 || game.objList[game.player.target.toInt()].type == 0)
            game.player.target = aquireTarget();
        if(game.player.target == null)
        {
            int j1 = Game_SpriteX(index);
            Game_MoveSprite(index, ++j1, Game_SpriteY(index));
            return;
        }
        int l = Game_SpriteX(game.player.target) + 5;
        int i1 = Game_SpriteY(game.player.target) + (Game_SpriteH(game.player.target) >> 1);
        j += 2;
        if(k < i1 && k < game.floor)
            k++;
        else
        if(k > i1 && k > game.ceiling)
            k--;
        Game_MoveSprite(index, j, k);
        if(clipEnemy_right(index))
            return;
        else
            return;
    }

    void space2_attack_RL(Index index, int i)
    {
        int j = Game_SpriteX(index);
        int k = Game_SpriteY(index);
        if(!clipEnemy_left(index))
        {
            j -= i;
            Game_MoveSprite(index, j, k);
        }
    }

    void space2_attack_ZigZag(Index index, int i)
    {
        int j = Game_SpriteX(index);
        int k = Game_SpriteY(index);
        if(clipEnemy_left(index))
            return;
        if(j > 42)
        {
            if(j > 84 - Game_SpriteW(index))
            {
                j -= i;
                k = game.ceiling;
            } else
            {
                j -= i;
                if(k < game.floor - Game_SpriteH(index))
                    k += i;
            }
        } else
        if(j == 42 || j == 41 || j == 40)
        {
            if(k > game.ceiling)
            {
                k -= i;
                if(k == Game_SpriteY(game.player.index))
                    enemyFire(index, 4, game.currentLevel.drawStyle);
            } else
            {
                j -= i;
            }
        } else
        {
            j -= i;
            if(k < game.floor)
                k += i;
        }
        if(k > game.floor - Game_SpriteH(index))
            k = game.floor - Game_SpriteH(index);
        Game_MoveSprite(index, j, k);
    }

    boolean space2_bossMoveOntoScreen(Index index)
    {
        if(game.bossState == 40 || game.bossState == 20)
            return true;
        if(Game_SpriteX(index) > 56)
        {
            Game_MoveSprite(index, Game_SpriteX(index) - 1, Game_SpriteY(index));
            return false;
        } else
        {
            return true;
        }
    }

    boolean space2_checkANYPixelOverlap(Index index, Index index1)
    {
        int l;
        int j1;
        if(Game_SpriteY(index) >= Game_SpriteY(index1))
        {
            l = 0;
            j1 = Game_SpriteY(index) - Game_SpriteY(index1);
        } else
        {
            j1 = 0;
            l = Game_SpriteY(index1) - Game_SpriteY(index);
        }
        int k;
        int i1;
        if(Game_SpriteX(index) >= Game_SpriteX(index1))
        {
            k = 0;
            i1 = Game_SpriteX(index) - Game_SpriteX(index1);
        } else
        {
            i1 = 0;
            k = Game_SpriteX(index1) - Game_SpriteX(index);
        }
        int k1;
        if(Game_SpriteX(index) + Game_SpriteW(index) >= Game_SpriteX(index1) + Game_SpriteW(index1))
            k1 = Game_SpriteW(index1) - i1;
        else
            k1 = Game_SpriteW(index) - k;
        int l1;
        if(Game_SpriteY(index) + Game_SpriteH(index) >= Game_SpriteY(index1) + Game_SpriteH(index1))
            l1 = Game_SpriteH(index1) - j1;
        else
            l1 = Game_SpriteH(index) - l;
        int j2 = 0;
        int l2 = l;
        for(int j3 = j1; j2 < l1; j3++)
        {
            int i2 = 0;
            int k2 = k;
            for(int i3 = i1; i2 < k1; i3++)
            {
                int i = getPixelOffW(Game_SpriteImg(index), Game_SpriteW(index), k2, l2);
                int j = getPixelOffW(Game_SpriteImg(index1), Game_SpriteW(index1), i3, j3);
                if(game.currentLevel.drawStyle == 4 && i == 0 && j == 0 || game.currentLevel.drawStyle == 2 && i != 0 && j != 0)
                    return true;
                i2++;
                k2++;
            }

            j2++;
            l2++;
        }

        return false;
    }

    boolean space2_checkOverlap(Index index, Index index1)
    {
        int i = Game_SpriteX(index1);
        int j = Game_SpriteY(index1);
        int k = Game_SpriteW(index1);
        int l = Game_SpriteH(index1);
        return Game_SpriteX(index) <= i + k && Game_SpriteX(index) + Game_SpriteW(index) >= i && Game_SpriteY(index) <= j + l && Game_SpriteY(index) + Game_SpriteH(index) >= j;
    }

    int space2_checkPixelOverlap(Index index, Index index1)
    {
        int j = Math.abs(Game_SpriteY(index) - Game_SpriteY(index1));
        for(int l = 0; l < Game_SpriteW(index) + 1; l++)
        {
            int i = Math.abs(Game_SpriteX(index) - Game_SpriteX(index1)) + l;
            int k = getPixelOffW(Game_SpriteImg(index1), Game_SpriteW(index1), i, j);
            if(game.currentLevel.drawStyle == 4 && k == 0 || game.currentLevel.drawStyle == 2 && k != 0)
                return j;
        }

        return 0;
    }

    void space2_clearObjectList()
    {
        for(int i = 0; i < 60; i++)
        {
            game.objList[i].type = 50;
            game.objList[i].numFrames = 0;
            game.objList[i].frame = 0;
        }

        game.objectsOnScreen = 0;
    }

    void space2_flashOff(Index index)
    {
        if(flashCheck != index)
        {
            Game_ChangeStyle(index, 64);
            flashCheck = index;
        } else
        {
            flashCheck = null;
        }
    }

    void space2_flashOn(Index index)
    {
        if(game.currentLevel.drawStyle == 4)
            Game_ChangeStyle(index, 16);
        else
            Game_ChangeStyle(index, 2);
    }

    void space2_handleBossAttack(Index index)
    {
        int i = game.objList[index.toInt()].speed;
        if(game.bossState == 0 || game.bossState == 127)
            return;
        if(game.space2_Level != 7)
        {
            if(space2_bossMoveOntoScreen(index))
                switch(game.space2_Level)
                {
                case 0: // '\0'
                case 1: // '\001'
                    space2_attack_BossBasic(index, i, 4);
                    break;

                case 2: // '\002'
                    space2_attack_BossRush(index, 4, 100);
                    break;

                case 3: // '\003'
                    space2_attack_BossBasic(index, i, 4);
                    space2_attack_BossSpawn(index, 21, 7, 6);
                    break;

                case 4: // '\004'
                    space2_attack_BossRush(index, 4, 100);
                    if(game.bossState == 10 || game.bossState == 30)
                        space2_attack_BossSpawn(index, 16, 0, 12);
                    break;

                case 5: // '\005'
                    space2_attack_BossRush(index, 4, 150);
                    if(game.bossState != 40)
                        if(game.objList[index.toInt()].frame <= 1)
                            space2_attack_BossSpawn(index, 14, 4, 6);
                        else
                            space2_attack_BossSpawn(index, 14, 1, 10);
                    break;

                case 6: // '\006'
                    space2_attack_BossRush(index, 4, 150);
                    if(game.bossState == 10 || game.bossState == 30)
                        space2_attack_BossSpawn(index, 6, 6, 14);
                    break;
                }
        } else
        if(game.podIndex[0] == null && game.podIndex[1] == null)
        {
            space2_attack_BossFinalAfterPods(index);
        } else
        {
            if(Game_SpriteX(index) > 84 - Game_SpriteW(index))
            {
                Game_MoveSprite(index, Game_SpriteX(index) - 1, Game_SpriteY(index));
                Game_MoveSprite(game.podIndex[0], Game_SpriteX(game.podIndex[0]) - 1, Game_SpriteY(game.podIndex[0]));
                Game_MoveSprite(game.podIndex[1], Game_SpriteX(game.podIndex[1]) - 1, Game_SpriteY(game.podIndex[1]));
            }
            space2_attack_BossSpawn(index, 29, 6, 14);
        }
        space2_flashOn(index);
    }

    void space2_handleCollisions(GameOptions gameoptions)
    {
        boolean flag = false;
        if(game.player.state != 1)
        {
            if(game.space2_Level != 1 && checkMapCollision(game.activeMap, game.player.index, Game_SpriteY(game.player.index)))
            {
                game.player.state = 1;
                game.objList[game.player.index.toInt()] = new SpaceObject(objectsByType[2]);
                Game_ChangeStyle(game.player.index, game.currentLevel.drawStyle);
                Game_SetSpriteImage(game.player.index, spritesByType[2][0]);
                gameoptions.tune = 2;
                if(game.to_do == 0)
                    game.to_do = 10;
            }
            if(game.player.shield == null)
            {
                Index index1 = checkSpriteCollisions(game.player.index);
                if(index1 != null && (game.objList[index1.toInt()].type == 4 || space2_checkANYPixelOverlap(game.player.index, index1)))
                    if(game.objList[index1.toInt()].type == 17 || game.objList[index1.toInt()].type == 33)
                    {
                        awardItem(game.objList[index1.toInt()].type, 1, gameoptions);
                        removeObject(index1);
                    } else
                    {
                        if(--game.objList[index1.toInt()].hitsLeft == 0)
                            if(isBoss(index1))
                            {
                                explodeBoss(index1, gameoptions);
                            } else
                            {
                                game.objList[index1.toInt()] = new SpaceObject(objectsByType[2]);
                                awardItem(49, 2, gameoptions);
                            }
                        game.objList[game.player.index.toInt()] = new SpaceObject(objectsByType[2]);
                        Game_ChangeStyle(game.player.index, game.currentLevel.drawStyle);
                        Game_SetSpriteImage(game.player.index, spritesByType[2][0]);
                        game.player.state = 1;
                        gameoptions.tune = 2;
                        if(game.to_do == 0)
                            game.to_do = 10;
                    }
            }
        }
        Index index3;
        for(Index index = Game_NextObj(Index.getIndexByInt(game.player.index.toInt() - 1)); index != null; index = index3)
        {
            index3 = Game_NextObj(index);
            if(game.objList[index.toInt()].type == 1 || game.objList[index.toInt()].type == 8 || game.objList[index.toInt()].type == 9 || game.objList[index.toInt()].type == 10)
                if(checkMapCollision(game.activeMap, index, Game_SpriteY(index)))
                {
                    if(index != game.player.shield)
                        removeObject(index);
                    else
                    if(game.space2_Level != 1)
                    {
                        byte byte0;
                        if(game.activeMap.position == 0)
                            byte0 = -2;
                        else
                            byte0 = 2;
                        Game_MoveSprite(game.player.index, Game_SpriteX(game.player.index), Game_SpriteY(game.player.index) + byte0);
                        Game_MoveSprite(game.player.shield, Game_SpriteX(game.player.shield), Game_SpriteY(game.player.shield) + byte0);
                    }
                } else
                {
                    Index index2 = checkSpriteCollisions(index);
                    if(index2 != null)
                        if(!isBoss(index2) || isBoss(index2) && space2_checkPixelOverlap(index, index2) != 0 && game.space2_Level != 7 || game.space2_Level == 7 && space2_checkPixelOverlap(index, index2) < 24 && space2_checkPixelOverlap(index, index2) > 18)
                        {
                            if(isBoss(index2))
                                space2_flashOff(index2);
                            switch(game.objList[index.toInt()].type)
                            {
                            case 1: // '\001'
                                game.objList[index2.toInt()].hitsLeft--;
                                break;

                            case 9: // '\t'
                            case 10: // '\n'
                                if(game.objList[index2.toInt()].hitsLeft >= 4)
                                    game.objList[index2.toInt()].hitsLeft -= 4;
                                else
                                    game.objList[index2.toInt()].hitsLeft = 0;
                                if(index2 == game.player.target)
                                    game.objList[index.toInt()].type = 2;
                                break;

                            case 8: // '\b'
                                if(!isBoss(index2))
                                    game.objList[index2.toInt()].hitsLeft = 0;
                                else
                                    game.objList[index2.toInt()].hitsLeft--;
                                break;
                            }
                            if(game.objList[index2.toInt()].hitsLeft == 0)
                            {
                                if(isBoss(index2))
                                    explodeBoss(index2, gameoptions);
                                else
                                if(game.objList[index2.toInt()].type != 17 && game.objList[index2.toInt()].type != 33)
                                {
                                    game.objList[index2.toInt()] = new SpaceObject(objectsByType[2]);
                                    awardItem(49, 2, gameoptions);
                                } else
                                {
                                    awardItem(game.objList[index2.toInt()].type, 1, gameoptions);
                                    if(index3 == index2)
                                        index3 = Game_NextObj(index2);
                                    removeObject(index2);
                                }
                            } else
                            {
                                awardItem(49, 1, gameoptions);
                            }
                            if(index != game.player.shield && game.objList[index.toInt()].type != 9 && game.objList[index.toInt()].type != 10)
                                removeObject(index);
                        } else
                        {
                            if(isBoss(index2) && space2_checkPixelOverlap(index, index2) == 0 && game.space2_Level == 7)
                            {
                                for(int i = 0; i < 2; i++)
                                {
                                    Index index4 = game.podIndex[i];
                                    if(index4 != null && game.objList[index4.toInt()].type == 35 && space2_checkOverlap(index, index4))
                                    {
                                        boolean flag1 = true;
                                        game.objList[index4.toInt()].hitsLeft--;
                                        removeObject(index);
                                        if(game.objList[index4.toInt()].attackMethod == 22)
                                            space2_flashOff(index4);
                                        if(game.objList[index4.toInt()].hitsLeft == 0)
                                        {
                                            game.objList[index4.toInt()].hitsLeft = 50;
                                            game.objList[index4.toInt()].attackMethod = 6;
                                            game.objList[index4.toInt()].speed = 3;
                                            space2_flashOn(index4);
                                        }
                                    }
                                }

                            }
                            if(isBoss(index2) && space2_checkPixelOverlap(index, index2) != 0 && game.space2_Level == 7)
                                removeObject(index);
                        }
                }
        }

    }

    void space2_setupDisplay()
    {
        if(game.currentLevel.drawStyle == 4)
            game.darkBlock = Game_AddBlock(16, 0, 0, 0, 84, 48);
        else
            game.darkBlock = null;
        byte byte0;
        if(game.space2_Level == 4 || game.space2_Level == 5)
            byte0 = 43;
        else
            byte0 = 0;
        for(int i = 0; i < 5; i++)
            game.livesIndex[i] = Game_AddSprite(status_heart, 4, 0, i * 6, byte0);

        for(int j = 4; j >= 3; j--)
            Game_ChangeStyle(game.livesIndex[j], 64);

        Sprite sprite;
        switch(game.player.secondaryWeapon)
        {
        case 9: // '\t'
            sprite = status_beam;
            break;

        case 10: // '\n'
            sprite = status_homer;
            break;

        case 22: // '\026'
            sprite = status_smart;
            break;

        default:
            sprite = status_beam;
            break;
        }
        game.secondaryWeaponIndex = Game_AddSprite(sprite, 4, 0, 36, byte0);
        game.ammoIndex = Game_AddSprite(super.P[0], 4, 0, 42, byte0);
        for(int k = 1; k < 2; k++)
            Game_AddSprite(super.P[0], 4, 0, 42 + k * 4, byte0);

        Game_Invaders_Set_Number(game.ammoIndex, game.player.secondaryAmmo, 2);
        game.scoreIndex = Game_AddSprite(super.P[0], 4, 0, 56, byte0);
        for(int l = 1; l <= 4; l++)
            Game_AddSprite(super.P[0], 4, 0, 56 + l * 4, byte0);

        Game_Invaders_Set_Number(game.scoreIndex, game.player.score, 5);
        game.bgIndex = initTileMap(game.activeMap, 16, 2, levelMaps[game.space2_Level], byte0, tileImages[game.space2_Level], game.currentLevel.drawStyle);
        scrollImage(game.activeMap, game.xOffset);
        init_floorAndCeiling(byte0);
    }

    void space2_updateStatusDisplay()
    {
        Game_Invaders_Set_Number(game.ammoIndex, game.player.secondaryAmmo, 2);
        Game_Invaders_Set_Number(game.scoreIndex, game.player.score, 5);
        for(int i = 0; i < 5; i++)
            if(i < game.player.lives)
                Game_ChangeStyle(game.livesIndex[i], 4);
            else
                Game_ChangeStyle(game.livesIndex[i], 64);

    }

    public synchronized int updateGameState(int i, GameOptions gameoptions)
    {
        switch(i)
        {
        case 32: // ' '
        case 33: // '!'
            gameoptions.repeat = 100;
            gameoptions.constant = 0;
            return Game_space2_Init(i, gameoptions);
        }
        return Game_space2_Play(i, gameoptions);
    }

    void updateLevel()
    {
        if(game.currentLevel.tickCount != 0)
            game.currentLevel.tickCount--;
        for(; game.currentLevel.tickCount < 1 && game.currentLevel.attackWavesLeft != 0; game.currentLevel.attackWavesLeft--)
        {
            for(int i = 0; i < 4; i++)
                if(game.currentLevel.numAttackWaves - game.currentLevel.attackWavesLeft == game.currentLevel.continuePoints[i])
                    game.currentLevel.continueFrom = game.currentLevel.attackWavesLeft;

            AttackWave attackwave = game.currentLevel.waves[game.currentLevel.numAttackWaves - game.currentLevel.attackWavesLeft];
            if(attackwave.type == 34)
            {
                game.currentLevel.attackWavesLeft--;
                return;
            }
            game.currentLevel.tickCount = attackwave.ticksUntilNextWave;
            int k;
            if(attackwave.type == 7 || attackwave.type == 19 || attackwave.type == 24)
                k = 16;
            else
                k = game.currentLevel.drawStyle;
            for(int j = 0; j < attackwave.numEnemies; j++)
            {
                int l;
                if(attackwave.yVal == 63)
                {
                    l = Game_Random() % (48 - (48 - game.floor)) + game.ceiling;
                    if(l < game.ceiling)
                        l = game.ceiling;
                    if(l > game.floor - spritesByType[attackwave.type][0].getHeight())
                        l = game.floor - spritesByType[attackwave.type][0].getHeight();
                } else
                {
                    l = attackwave.yVal;
                }
                Index index;
                if(attackwave.attackPattern != 5)
                    index = addObject(attackwave.type, k, 84 + attackwave.spacing * j, l);
                else
                    index = addObject(attackwave.type, k, -(attackwave.spacing * j), l);
                game.objList[index.toInt()].attackMethod = attackwave.attackPattern;
                game.objList[index.toInt()].speed = attackwave.speed;
                game.objList[index.toInt()].shotsLeft = attackwave.ammo;
                game.objList[index.toInt()].hitsLeft = attackwave.hitsLeft;
                game.objList[index.toInt()].aggression = attackwave.aggression;
                if(isBoss(index))
                {
                    game.bossState = 1;
                    game.bossIndex = index;
                }
            }

        }

    }

    void updateObjects(GameOptions gameoptions)
    {
        Index index1;
        for(Index index = Game_NextObj(game.bgIndex); index != null && game.objList[index.toInt()].type != 50; index = index1)
        {
            int j = index.toInt();
            index1 = Game_NextObj(index);
            if(game.objList[j].numFrames > 1)
            {
                game.objList[j].frame++;
                game.objList[j].frame %= game.objList[j].numFrames;
                Game_SetSpriteImage(index, spritesByType[game.objList[j].type][game.objList[j].frame]);
            }
label0:
            switch(game.objList[j].type)
            {
            case 0: // '\0'
            case 50: // '2'
                break;

            case 9: // '\t'
                Game_MoveSprite(index, Game_SpriteX(game.player.index) + Game_SpriteW(game.player.index) + 2, (Game_SpriteY(game.player.index) + 3) - (Game_SpriteH(index) >> 1));
                if(game.objList[j].frame == game.objList[j].numFrames - 1)
                    removeObject(index);
                break;

            case 36: // '$'
                if(game.objList[j].frame != game.objList[j].numFrames - 1)
                    break;
                if(Game_Random() % 10 != 1)
                    game.objList[j].frame = Game_Random() % game.objList[j].numFrames + 1;
                else
                    removeObject(index);
                break;

            case 2: // '\002'
                if(game.objList[j].frame != game.objList[j].numFrames - 1)
                    break;
                if(index != game.player.index)
                {
                    removeObject(index);
                    break;
                }
                game.player.lives--;
                if(game.player.lives <= 0)
                {
                    if(game.player.credits > 1)
                    {
                        game.player.credits--;
                        initContinue(gameoptions);
                    } else
                    {
                        gameoptions.score = game.player.score;
                        game.to_do = 11;
                        return;
                    }
                } else
                {
                    initPlayer(gameoptions, 20);
                }
                break;

            case 22: // '\026'
                if(game.smartX < 84)
                {
                    if(game.ceiling == 16)
                        Game_MoveLine(index, game.smartX, 0, game.smartX, game.floor);
                    else
                        Game_MoveLine(index, game.smartX, game.ceiling, game.smartX, 48);
                    checkSmartCollisions(gameoptions);
                    game.smartX += 2;
                } else
                {
                    Game_RemoveObj(index);
                    game.objList[j].type = 50;
                    game.smartX = 0;
                }
                break;

            default:
                int i = game.objList[j].speed;
                switch(game.objList[j].attackMethod)
                {
                case 8: // '\b'
                case 19: // '\023'
                case 20: // '\024'
                case 21: // '\025'
                default:
                    break;

                case 1: // '\001'
                    pattern = sinWavePatternHigh;
                    followPreset(index, i, 0, 18);
                    break label0;

                case 15: // '\017'
                    pattern = diagonalTRBL;
                    followPreset(index, i, 0, 18);
                    break label0;

                case 16: // '\020'
                    pattern = diagonalBRTL;
                    followPreset(index, i, 0, 18);
                    break label0;

                case 10: // '\n'
                    pattern = miniSinWaveVectored;
                    followPreset(index, i, 128, 35);
                    break label0;

                case 14: // '\016'
                    pattern = miniSinWaveVectored;
                    followPreset(index, i, 128, 18);
                    break label0;

                case 11: // '\013'
                    pattern = miniSinWaveVectored;
                    followPreset(index, i, 128, 11);
                    break label0;

                case 12: // '\f'
                    pattern = miniSinWaveVectored;
                    followPreset(index, i, 128, 14);
                    break label0;

                case 13: // '\r'
                    pattern = miniSinWaveVectored;
                    followPreset(index, i, 128, 25);
                    break label0;

                case 2: // '\002'
                    space2_attack_DiveBomb(index, i);
                    break label0;

                case 17: // '\021'
                    space2_attack_HalfDiveBomb(index, i, 43);
                    break label0;

                case 18: // '\022'
                    space2_attack_HalfDiveBomb(index, i, 0);
                    break label0;

                case 3: // '\003'
                    space2_attack_Homing(index, i);
                    break label0;

                case 4: // '\004'
                    space2_attack_InvDiveBomb(index, i);
                    break label0;

                case 5: // '\005'
                    space2_attack_LR(index, i);
                    break label0;

                case 6: // '\006'
                    space2_attack_RL(index, i);
                    break label0;

                case 7: // '\007'
                    space2_attack_ZigZag(index, i);
                    break label0;

                case 24: // '\030'
                    if(Game_SpriteX(index) > 56)
                        Game_MoveSprite(index, Game_SpriteX(index) - 1, Game_SpriteY(index));
                    else
                        space2_attack_BossBasic(index, i, 4);
                    if(game.bossState != 0)
                    {
                        game.objList[j].attackMethod = 3;
                        game.objList[j].speed = 1;
                    }
                    break;

                case 23: // '\027'
                    space2_handleBossAttack(index);
                    break;

                case 22: // '\026'
                    space2_WigglePods(index);
                    space2_flashOn(index);
                    break;

                case 9: // '\t'
                    space2_attack_PlayerHomer(index, i);
                    break;
                }
                break;
            }
        }

    }

    void updatePlayer(int i, GameOptions gameoptions)
    {
        boolean flag = false;
        int j = 0;
        boolean flag1 = false;
        boolean flag2 = false;
        if(game.player.state == 1)
            return;
        switch(i)
        {
        case 303: 
            j = 1;
            // fall through

        case 48: // '0'
            if(game.activeMap.position == 0 && Game_SpriteY(game.player.index) + 2 < (game.floor + 16) - 7 - j || game.activeMap.position == 43 && Game_SpriteY(game.player.index) + 1 < game.floor - 7 - j)
            {
                Game_MoveSprite(game.player.index, Game_SpriteX(game.player.index), Game_SpriteY(game.player.index) + 1 + j);
                flag = true;
            }
            break;

        case 311: 
            j = 1;
            // fall through

        case 56: // '8'
            if(game.activeMap.position == 43 && Game_SpriteY(game.player.index) - 2 > 1 + j || game.activeMap.position == 0 && Game_SpriteY(game.player.index) - 1 > game.ceiling + j)
            {
                Game_MoveSprite(game.player.index, Game_SpriteX(game.player.index), Game_SpriteY(game.player.index) - 1 - j);
                flag = true;
            }
            break;

        case 297: 
            j = 1;
            // fall through

        case 42: // '*'
            if(Game_SpriteX(game.player.index) > 2 + j)
            {
                Game_MoveSprite(game.player.index, Game_SpriteX(game.player.index) - 1 - j, Game_SpriteY(game.player.index));
                flag = true;
            }
            break;

        case 49: // '1'
        case 51: // '3'
            if(game.player.justFired == 0)
            {
                addObject(game.player.weapon, game.currentLevel.drawStyle, Game_SpriteX(game.player.index) + 6, Game_SpriteY(game.player.index) + 3);
                game.player.justFired = 1;
                game.player.burstFire = 0;
                gameoptions.tune = 0;
                if(game.to_do == 0)
                    game.to_do = 10;
            }
            break;

        case 304: 
        case 306: 
            if(game.player.burstFire < 5)
            {
                if(game.player.justFired == 0)
                {
                    addObject(game.player.weapon, game.currentLevel.drawStyle, Game_SpriteX(game.player.index) + 6, Game_SpriteY(game.player.index) + 3);
                    game.player.justFired = 1;
                }
                game.player.burstFire++;
            }
            break;

        case 52: // '4'
        case 54: // '6'
            if(game.player.justFired == 0 && game.player.secondaryAmmo > 0)
            {
                if(game.player.secondaryWeapon != 22)
                {
                    if(game.player.secondaryWeapon == 9)
                        addObject(game.player.secondaryWeapon, game.currentLevel.drawStyle, Game_SpriteX(game.player.index) + 10, (Game_SpriteY(game.player.index) + 3) - 2);
                    else
                        addObject(game.player.secondaryWeapon, game.currentLevel.drawStyle, Game_SpriteX(game.player.index) + 8, (Game_SpriteY(game.player.index) + 3) - 1);
                    game.player.secondaryAmmo--;
                    gameoptions.tune = 1;
                    if(game.to_do == 0)
                        game.to_do = 10;
                } else
                if(game.smartX == 0)
                {
                    game.smartX = Game_SpriteX(game.player.index) + Game_SpriteW(game.player.index);
                    if(game.ceiling == 16)
                        game.smartIdx = Game_AddLine(game.currentLevel.drawStyle, 2, game.smartX, 0, game.smartX, game.floor);
                    else
                        game.smartIdx = Game_AddLine(game.currentLevel.drawStyle, 2, game.smartX, game.ceiling, game.smartX, 48);
                    game.objList[game.smartIdx.toInt()] = new SpaceObject(objectsByType[22]);
                    game.player.secondaryAmmo--;
                    gameoptions.tune = 3;
                    if(game.to_do == 0)
                        game.to_do = 10;
                }
                game.player.justFired = 1;
                Game_Invaders_Set_Number(game.ammoIndex, game.player.secondaryAmmo, 2);
            }
            break;

        case 290: 
            j = 1;
            // fall through

        case 35: // '#'
            if(Game_SpriteX(game.player.index) < 73 - j)
            {
                Game_MoveSprite(game.player.index, Game_SpriteX(game.player.index) + 1 + j, Game_SpriteY(game.player.index));
                flag = true;
            }
            break;
        }
        if(flag && game.player.shield != null)
            Game_MoveSprite(game.player.shield, Game_SpriteX(game.player.index) - 2, Game_SpriteY(game.player.index) - 2);
    }

    GameData game;
    private final short bitm_tsub01[] = {
        3, 13, 18, 21, 27, 15, 18, 21, 27, 15, 
        18, 21, 27, 15, 18, 21, 27, 15, 18, 21, 
        27, 15, 18, 21, 27, 14, 18, 21, 27, 13, 
        5, 3
    };
    private final short bitm_tsub02[] = {
        3, 29, 99, 221, 147, 173, 89, 219, 173, 89, 
        219, 173, 89, 219, 173, 89, 219, 173, 89, 219, 
        173, 89, 219, 173, 89, 219, 173, 89, 157, 99, 
        31, 3
    };
    private final short bitm_tsub03[] = {
        3, 253, 3, 231, 185, 31, 7, 97, 185, 31, 
        7, 97, 185, 31, 7, 97, 185, 31, 7, 97, 
        185, 31, 7, 97, 185, 31, 7, 113, 157, 13, 
        241, 15
    };
    private final short bitm_tsub03a[] = {
        0, 0, 113, 158, 109, 115, 222, 136, 97, 115, 
        222, 136, 97, 115, 222, 136, 97, 115, 222, 136, 
        97, 115, 222, 136, 97, 115, 222, 136, 113, 39, 
        28, 0
    };
    private final short bitm_ene01a[][] = {
        {
            14, 31, 27, 21, 10, 17, 10, 5, 16, 2, 
            0
        }
    };
    private final short bitm_ene01b[][] = {
        {
            14, 31, 27, 21, 10, 21, 18, 5, 21, 18, 
            2
        }
    };
    private final short bitm_ene02a[][] = {
        {
            44, 20, 35, 49, 10, 13
        }
    };
    private final short bitm_ene02b[][] = {
        {
            13, 10, 49, 35, 20, 44
        }
    };
    private final short bitm_ene03[][] = {
        {
            108, 46, 31, 127, 25, 42, 108
        }
    };
    private final short bitm_ene04[][] = {
        {
            4, 10, 21, 31, 31, 10, 21, 21
        }
    };
    private final short enterprise1[][] = {
        {
            93, 255, 255, 93, 93, 85, 8
        }
    };
    private final short rocket11[][] = {
        {
            4, 10, 14, 14, 14, 21, 31, 31, 21
        }
    };
    private final short bitm_ene05a[][] = {
        {
            7, 5, 5, 13, 13, 14, 8, 24, 16
        }
    };
    private final short bitm_ene05b[][] = {
        {
            7, 5, 5, 13, 13, 14, 8, 12, 4
        }
    };
    private final short bitm_ene06a[][] = {
        {
            4, 14, 14, 10, 27, 27, 27, 10, 4
        }
    };
    private final short bitm_ene06b[][] = {
        {
            4, 14, 14, 26, 27, 27, 27, 10, 4
        }
    };
    private final short bitm_ene07a[][] = {
        {
            17, 17, 10, 31, 21, 27, 10, 4, 0
        }
    };
    private final short bitm_ene07b[][] = {
        {
            10, 17, 10, 31, 21, 27, 10, 4, 4
        }
    };
    private final short bitm_ene08[][] = {
        {
            93, 34, 85, 107, 127, 62, 93
        }
    };
    private final short bitm_boss02a[][] = {
        {
            223, 191, 191, 207, 243, 29, 198, 178, 136, 196, 
            230, 50, 222, 106, 206, 29, 251, 231, 31, 255
        }, {
            255, 255, 255, 255, 255, 254, 249, 2, 245, 202, 
            57, 255, 254, 189, 94, 175, 23, 195, 240, 7
        }, {
            127, 119, 123, 123, 119, 111, 95, 60, 59, 59, 
            48, 55, 91, 90, 93, 110, 119, 123, 124, 127
        }
    };
    private final short bitm_boss02b[][] = {
        {
            159, 239, 239, 247, 251, 29, 198, 178, 136, 196, 
            230, 50, 222, 170, 206, 29, 251, 231, 31, 255
        }, {
            255, 255, 255, 255, 255, 254, 249, 2, 229, 154, 
            57, 255, 254, 189, 94, 175, 23, 195, 240, 7
        }, {
            127, 111, 95, 95, 95, 111, 111, 92, 59, 59, 
            48, 55, 91, 90, 93, 110, 119, 123, 124, 127
        }
    };
    private final short bitm_boss03a[][] = {
        {
            32, 80, 100, 170, 180, 200, 100, 50, 146, 218, 
            73, 73, 73, 153, 145, 74, 74, 121, 49, 129, 
            82, 170, 124
        }, {
            0, 0, 0, 0, 0, 120, 214, 43, 1, 112, 
            56, 20, 28, 142, 194, 96, 84, 234, 21, 10, 
            207, 177, 254
        }, {
            0, 0, 0, 0, 0, 0, 1, 6, 10, 10, 
            10, 10, 9, 5, 4, 2, 1, 0, 0, 0, 
            2, 1, 2
        }
    };
    private final short bitm_boss03b[][] = {
        {
            0, 0, 168, 152, 240, 200, 100, 50, 146, 218, 
            73, 73, 73, 153, 145, 74, 74, 121, 49, 129, 
            82, 170, 124
        }, {
            0, 1, 2, 1, 0, 120, 214, 43, 1, 112, 
            56, 28, 20, 142, 194, 96, 84, 234, 21, 10, 
            207, 177, 254
        }, {
            0, 0, 0, 0, 0, 0, 1, 2, 14, 22, 
            30, 22, 11, 5, 6, 2, 1, 0, 0, 1, 
            2, 1, 0
        }
    };
    private final short tile1[] = {
        55, 30, 108, 28, 108, 63, 11, 63, 74, 39, 
        16, 3, 36, 0, 32, 84, 42, 84, 62, 124, 
        120, 96, 80, 96, 0, 0, 0, 0, 106, 0, 
        85, 42
    };
    private final short tile2[] = {
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 
        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 
        255, 255
    };
    private final short bitm_level1_block1[] = {
        192, 64, 32, 16, 144, 72, 132, 66, 170, 86, 
        170, 86, 172, 124, 248, 224, 192, 128, 224, 240, 
        216, 236, 180, 148, 148, 228, 140, 152, 240, 192, 
        192, 192
    };
    private final short bitm_level1_block2[] = {
        192, 224, 184, 134, 171, 213, 174, 248, 240, 224, 
        192, 192, 192, 160, 160, 144, 208, 136, 196, 170, 
        214, 172, 216, 176, 240, 224, 176, 136, 216, 240, 
        224, 192
    };
    private final short bitm_level1_block3a[] = {
        192, 160, 16, 136, 196, 131, 208, 170, 213, 170, 
        213, 255, 255, 255, 245, 234, 223, 240, 224, 192, 
        192, 160, 160, 152, 198, 225, 213, 234, 247, 252, 
        240, 192
    };
    private final short bitm_level1_block3b[] = {
        0, 0, 0, 0, 0, 128, 64, 48, 8, 166, 
        81, 171, 246, 252, 248, 244, 122, 252, 120, 56, 
        48, 0, 0, 0, 48, 208, 112, 224, 192, 0, 
        0, 0
    };
    private final short bitm_ship[][] = {
        {
            65, 107, 54, 8, 62, 62, 42, 20, 8, 8
        }
    };
    private final short bitm_ship_inv[][] = {
        {
            62, 20, 73, 119, 65, 65, 85, 107, 119, 119
        }
    };
    private final short crasch1[][] = {
        {
            36, 17, 8, 92, 41, 0, 20
        }, {
            21, 10, 4, 10, 21, 0, 0
        }, {
            5, 2, 5, 0, 5, 2, 5
        }, {
            1, 0, 0, 0, 0, 0, 1
        }
    };
    private final short bitm_bullet[][] = {
        {
            3, 3
        }
    };
    private final short bitm_sub_boss1[][] = {
        {
            255, 255, 127, 63, 31, 142, 76, 194, 205, 67, 
            7, 13, 29, 33, 155, 199, 127, 95, 63
        }, {
            235, 200, 36, 232, 209, 169, 209, 169, 212, 232, 
            84, 106, 181, 234, 244, 24, 116, 252, 254
        }, {
            31, 31, 15, 6, 9, 23, 19, 26, 26, 10, 
            7, 17, 29, 30, 22, 19, 24, 28, 31
        }
    };
    private final short bitm_sub_boss1a[][] = {
        {
            255, 255, 127, 63, 31, 139, 205, 66, 205, 67, 
            7, 15, 27, 35, 155, 199, 255, 191, 63
        }, {
            251, 216, 44, 232, 209, 169, 209, 169, 212, 232, 
            84, 106, 181, 234, 244, 25, 116, 252, 254
        }, {
            31, 31, 27, 22, 9, 23, 19, 26, 18, 10, 
            23, 17, 29, 30, 26, 27, 24, 28, 31
        }
    };
    private final short bitm_shield[][] = {
        {
            4, 81, 0, 1, 0, 2, 0, 2, 0, 2, 
            0, 4, 80
        }, {
            1, 4, 0, 4, 0, 2, 0, 2, 0, 2, 
            0, 1, 0
        }
    };
    private final short bitm_shielda[][] = {
        {
            138, 32, 1, 0, 1, 0, 2, 0, 2, 0, 
            2, 0, 136
        }, {
            2, 0, 4, 0, 4, 0, 2, 0, 2, 0, 
            2, 0, 0
        }
    };
    private final short bitm_exp01a[][] = {
        {
            0, 0, 20, 8, 20, 0, 0
        }
    };
    private final short bitm_exp01b[][] = {
        {
            0, 52, 42, 20, 42, 52, 0
        }
    };
    private final short bitm_exp01c[][] = {
        {
            54, 105, 85, 0, 85, 105, 54
        }
    };
    private final short bitm_beam01a[][] = {
        {
            4, 10, 21, 10, 4
        }
    };
    private final short bitm_beam01b[][] = {
        {
            4, 10, 21, 10, 4, 10, 4, 10, 4
        }
    };
    private final short bitm_beam01c[][] = {
        {
            4, 10, 21, 10, 4, 10, 4, 10, 4, 4, 
            4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
            4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
            4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
            4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
            4, 4, 4, 4
        }
    };
    private final short bitm_homer01[][] = {
        {
            7, 2, 7, 7, 2
        }
    };
    private final short bitm_Lhomer[][] = {
        {
            2, 7, 7, 2, 7
        }
    };
    private final short bitm_ene09a[][] = {
        {
            10, 31, 25, 31, 14
        }
    };
    private final short bitm_ene09b[][] = {
        {
            6, 13, 15, 6
        }
    };
    private final short bitm_ene09c[][] = {
        {
            2, 5, 7, 7, 2
        }
    };
    private final short bitm_bonus01a[][] = {
        {
            8, 34, 8, 85, 93, 8, 34, 8
        }
    };
    private final short bitm_bonus01b[][] = {
        {
            20, 0, 73, 92, 21, 73, 0, 20
        }
    };
    private final short bitm_city01a[] = {
        192, 194, 189, 129, 253, 162, 188, 132, 252, 144, 
        240, 136, 136, 248, 224, 184, 228, 132, 172, 212, 
        172, 252, 136, 240, 152, 244, 148, 244, 132, 136, 
        176, 192
    };
    private final short bitm_city02a[] = {
        192, 160, 144, 136, 132, 252, 130, 130, 254, 144, 
        254, 130, 250, 170, 170, 174, 248, 240, 144, 144, 
        159, 145, 191, 224, 160, 240, 152, 244, 148, 148, 
        188, 192
    };
    private final short bitm_city03a[] = {
        192, 160, 144, 144, 144, 160, 252, 132, 254, 130, 
        255, 128, 128, 170, 213, 255, 144, 144, 232, 164, 
        228, 190, 162, 162, 190, 164, 164, 168, 176, 160, 
        192, 192
    };
    private final short bitm_city03b[] = {
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
        255, 1, 2, 172, 88, 240, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0
    };
    private final short bitm_sym_ammo[][] = {
        {
            3, 3, 3, 3, 3
        }
    };
    private final short bitm_sym_homer[][] = {
        {
            15, 6, 15, 15, 6
        }
    };
    private final short bitm_sym_laser[][] = {
        {
            15, 6, 6, 6, 6
        }
    };
    private final short bitm_sym_life[][] = {
        {
            3, 7, 14, 7, 3
        }
    };
    private final short bitm_sym_smart[][] = {
        {
            6, 15, 9, 15, 6
        }
    };
    private final short bitm_space01a[] = {
        208, 160, 192, 160, 208, 160, 192, 160, 192, 160, 
        208, 160, 192, 160, 208, 160, 192, 160, 192, 160, 
        208, 160, 192, 160, 192, 160, 208, 160, 192, 160, 
        192, 160
    };
    private final short bitm_space02a[] = {
        128, 208, 160, 192, 160, 208, 160, 192, 160, 192, 
        160, 208, 160, 192, 160, 208, 160, 192, 160, 192, 
        160, 209, 162, 195, 162, 195, 161, 193, 160, 208, 
        160, 192
    };
    private final short bitm_space02b[] = {
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 
        132, 2, 129, 65, 169, 85, 170, 214, 120, 0, 
        0, 0
    };
    private final short bitm_atmos03a[] = {
        0, 128, 64, 32, 32, 64, 65, 129, 14, 17, 
        32, 64, 64, 64, 64, 64, 64, 32, 32, 32, 
        32, 64, 64, 64, 64, 32, 32, 32, 32, 16, 
        9, 6
    };
    private final short bitm_atmos03b[] = {
        0, 0, 0, 48, 72, 132, 4, 2, 1, 1, 
        130, 66, 36, 36, 40, 16, 8, 8, 4, 4, 
        8, 16, 96, 128, 64, 32, 32, 32, 32, 64, 
        128, 0
    };
    private final short bitm_atmos04a[] = {
        0, 24, 36, 34, 34, 65, 65, 66, 66, 36, 
        40, 40, 16, 0, 0, 128, 64, 64, 32, 32, 
        32, 64, 64, 128, 12, 18, 18, 33, 33, 34, 
        28, 0
    };
    private final short bitm_atmos05a[] = {
        0, 128, 64, 64, 32, 16, 16, 16, 8, 8, 
        16, 32, 64, 64, 128, 0, 0, 192, 48, 8, 
        4, 4, 8, 16, 16, 32, 32, 16, 16, 32, 
        192, 0
    };
    private final short bitm_pala01a[] = {
        160, 224, 160, 224, 160, 224, 160, 224, 160, 224, 
        160, 224, 160, 224, 160, 224, 184, 228, 195, 153, 
        166, 224, 160, 224, 160, 224, 160, 224, 160, 224, 
        160, 224
    };
    private final short bitm_pala02a[] = {
        160, 227, 165, 233, 178, 228, 136, 136, 228, 242, 
        185, 237, 167, 227, 160, 224, 160, 224, 160, 224, 
        160, 224, 160, 224, 184, 228, 195, 153, 166, 224, 
        160, 224
    };
    private final short bitm_pala03a[] = {
        184, 235, 189, 233, 178, 228, 136, 136, 228, 242, 
        185, 237, 191, 235, 184, 232, 184, 232, 184, 232, 
        184, 232, 184, 232, 184, 228, 195, 153, 190, 232, 
        184, 232
    };
    private final short bitm_pala04a[] = {
        184, 232, 184, 232, 184, 232, 184, 236, 190, 234, 
        187, 234, 186, 234, 187, 235, 190, 236, 184, 232, 
        184, 232, 184, 232, 184, 228, 195, 153, 190, 232, 
        184, 224
    };
    private final short bitm_pala04b[] = {
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
        192, 35, 29, 195, 254, 124, 0, 0, 0, 0, 
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0
    };
    private final short bitm_pala05a[] = {
        184, 232, 184, 237, 191, 237, 187, 237, 187, 237, 
        187, 237, 187, 237, 187, 237, 187, 237, 187, 237, 
        187, 237, 187, 237, 187, 237, 191, 237, 184, 232, 
        184, 232
    };
    private final short bitm_pala06a[] = {
        184, 232, 184, 232, 184, 232, 184, 233, 57, 26, 
        76, 161, 83, 171, 246, 252, 248, 107, 60, 152, 
        69, 170, 85, 186, 127, 252, 184, 120, 248, 232, 
        248, 232
    };
    private final short bitm_pala06b[] = {
        0, 0, 0, 0, 0, 64, 192, 64, 64, 128, 
        128, 128, 0, 0, 0, 1, 3, 5, 133, 74, 
        50, 134, 92, 172, 216, 112, 0, 0, 0, 0, 
        0, 0
    };
    private final short bitm_pala07a[] = {
        184, 232, 184, 232, 184, 233, 187, 237, 185, 130, 
        214, 172, 216, 184, 248, 248, 233, 187, 237, 185, 
        130, 214, 172, 216, 184, 232, 248, 232, 184, 232, 
        184, 232
    };
    private final short bitm_pala08a[] = {
        184, 232, 184, 232, 184, 232, 184, 232, 184, 232, 
        184, 232, 184, 232, 184, 232, 184, 232, 184, 232, 
        184, 232, 184, 232, 184, 232, 184, 232, 184, 232, 
        184, 232
    };
    private final short bitm_boss04a[][] = {
        {
            24, 104, 136, 144, 112, 80, 40, 28, 170, 153, 
            173, 147, 49, 24, 100, 162, 122, 198, 2, 0, 
            0, 128
        }, {
            0, 254, 225, 16, 224, 160, 230, 173, 78, 8, 
            9, 143, 7, 64, 144, 162, 228, 60, 51, 26, 
            13, 7
        }, {
            0, 3, 4, 5, 4, 9, 8, 8, 4, 8, 
            10, 4, 3, 2, 7, 12, 8, 11, 12, 0, 
            0, 0
        }
    };
    private final short bitm_boss04b[][] = {
        {
            0, 124, 136, 144, 112, 80, 40, 29, 171, 153, 
            173, 146, 48, 24, 100, 162, 125, 195, 0, 0, 
            0, 0
        }, {
            0, 190, 165, 28, 168, 144, 230, 139, 78, 8, 
            9, 143, 7, 64, 144, 162, 228, 60, 51, 26, 
            12, 24
        }, {
            0, 3, 4, 5, 4, 9, 8, 8, 4, 8, 
            10, 4, 3, 2, 3, 4, 4, 5, 2, 0, 
            0, 0
        }
    };
    private final short bitm_boss05a[][] = {
        {
            28, 38, 101, 101, 101, 101, 229, 145, 81, 145, 
            81, 145, 73, 142, 240
        }, {
            0, 0, 0, 0, 0, 0, 225, 51, 251, 95, 
            47, 23, 15, 5, 0
        }, {
            0, 0, 0, 0, 78, 145, 95, 31, 81, 159, 
            78, 0, 0, 0, 0
        }, new short[15]
    };
    private final short bitm_boss05b[][] = {
        {
            28, 38, 101, 101, 229, 149, 85, 145, 81, 145, 
            81, 145, 73, 142, 240
        }, {
            0, 0, 0, 0, 1, 3, 227, 51, 251, 95, 
            47, 23, 15, 5, 0
        }, {
            0, 0, 0, 0, 142, 17, 159, 31, 145, 31, 
            142, 0, 0, 0, 0
        }, {
            0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 
            0, 0, 1, 0, 0
        }
    };
    private final short bitm_boss06a[][] = {
        {
            255, 255, 191, 59, 57, 52, 56, 52, 56, 180, 
            40, 209, 227, 119, 55, 55, 239, 31
        }, {
            223, 47, 71, 135, 67, 131, 67, 131, 67, 135, 
            78, 165, 195, 243, 26, 227, 253, 254
        }, {
            7, 7, 6, 5, 5, 3, 3, 3, 3, 3, 
            3, 5, 6, 6, 7, 7, 7, 7
        }
    };
    private final short bitm_boss06b[][] = {
        {
            255, 255, 167, 179, 105, 113, 105, 113, 105, 177, 
            41, 211, 231, 119, 183, 55, 239, 31
        }, {
            127, 111, 103, 231, 99, 227, 67, 195, 67, 135, 
            78, 165, 195, 243, 26, 227, 253, 254
        }, {
            6, 5, 3, 2, 3, 2, 3, 2, 3, 2, 
            3, 5, 6, 6, 7, 7, 7, 7
        }
    };
    private final short bitm_boss07a[][] = {
        {
            240, 32, 66, 134, 140, 138, 138, 82, 84, 52, 
            52, 52, 18, 146, 18, 148, 25, 153, 19, 53, 
            121, 210, 162, 132, 200, 248, 8, 144, 96, 192
        }, {
            0, 1, 2, 4, 4, 10, 12, 26, 20, 26, 
            12, 10, 133, 246, 143, 6, 55, 98, 123, 182, 
            141, 250, 116, 0, 0, 85, 171, 71, 252, 243
        }, {
            48, 80, 160, 144, 72, 72, 40, 72, 152, 156, 
            190, 49, 176, 55, 191, 179, 179, 159, 151, 19, 
            137, 64, 160, 212, 234, 117, 58, 29, 7, 1
        }, {
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
            0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 
            1, 1, 1, 0, 0, 0, 0, 0, 0, 0
        }
    };
    private final short bitm_boss07b[][] = {
        {
            0, 0, 6, 12, 20, 146, 138, 73, 69, 37, 
            37, 45, 26, 146, 20, 148, 24, 152, 16, 22, 
            121, 211, 165, 132, 200, 248, 16, 32, 192, 128
        }, {
            24, 12, 10, 5, 5, 8, 12, 26, 20, 26, 
            12, 202, 69, 246, 143, 182, 103, 122, 51, 134, 
            141, 250, 116, 0, 0, 68, 169, 67, 252, 243
        }, {
            0, 192, 160, 160, 80, 80, 80, 208, 144, 188, 
            183, 48, 176, 51, 191, 177, 179, 159, 151, 19, 
            137, 64, 160, 212, 234, 117, 58, 29, 7, 1
        }, {
            1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 
            0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 
            1, 1, 1, 0, 0, 0, 0, 0, 0, 0
        }
    };
    private final short bitm_boss08a[][] = {
        {
            0, 0, 0, 0, 16, 48, 96, 160, 32, 160, 
            192, 192, 64, 32, 16, 144, 136, 200, 200, 136, 
            72, 144, 40, 68, 100, 162, 50, 49, 153, 153, 
            121, 49, 226, 194, 68, 132, 8, 144
        }, {
            24, 12, 10, 10, 5, 5, 9, 9, 9, 8, 
            8, 4, 6, 3, 1, 1, 128, 128, 128, 64, 
            161, 162, 165, 250, 116, 232, 213, 171, 86, 172, 
            118, 231, 115, 184, 159, 198, 253, 50
        }, {
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
            0, 128, 132, 138, 138, 133, 132, 130, 130, 1, 
            0, 62, 65, 152, 52, 188, 152, 193, 255, 124, 
            1, 131, 127, 13, 201, 57, 204, 206
        }, {
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
            1, 130, 130, 66, 66, 66, 66, 66, 132, 137, 
            18, 20, 164, 104, 175, 109, 170, 105, 168, 84, 
            50, 89, 44, 22, 11, 128, 12, 153
        }, {
            0, 0, 0, 0, 0, 28, 40, 40, 36, 50, 
            25, 28, 12, 14, 13, 14, 29, 58, 52, 40, 
            49, 41, 48, 41, 48, 40, 52, 40, 52, 40, 
            52, 56, 52, 26, 28, 26, 53, 58
        }
    };
    private final short bitm_boss08b[][] = {
        {
            64, 192, 128, 128, 128, 8, 8, 24, 40, 200, 
            144, 160, 96, 32, 16, 144, 136, 200, 200, 144, 
            80, 168, 72, 196, 100, 100, 180, 178, 146, 146, 
            114, 50, 228, 196, 68, 132, 8, 144
        }, {
            0, 0, 1, 2, 4, 5, 9, 9, 9, 8, 
            8, 4, 6, 3, 1, 129, 64, 64, 64, 161, 
            163, 166, 173, 250, 117, 234, 212, 170, 86, 172, 
            118, 231, 115, 184, 159, 198, 253, 50
        }, {
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
            0, 128, 130, 69, 69, 66, 66, 65, 65, 128, 
            0, 62, 89, 180, 60, 152, 128, 193, 255, 124, 
            1, 131, 127, 13, 201, 57, 204, 206
        }, {
            0, 0, 0, 0, 0, 0, 0, 128, 128, 64, 
            65, 66, 66, 65, 65, 65, 65, 129, 130, 4, 
            9, 18, 164, 104, 175, 109, 170, 105, 168, 84, 
            178, 89, 44, 86, 43, 128, 12, 153
        }, {
            0, 0, 0, 0, 0, 30, 49, 12, 6, 2, 
            3, 6, 7, 6, 13, 14, 29, 58, 52, 41, 
            49, 41, 48, 41, 48, 41, 52, 40, 52, 40, 
            52, 56, 52, 26, 28, 26, 53, 58
        }
    };
    private final short bitm_boss08c[][] = {
        {
            21, 14, 27, 29, 29, 29, 14
        }
    };
    private final short bitm_ene10a[][] = {
        {
            8, 20, 28, 42, 85, 42
        }
    };
    private final short bitm_ene10b[][] = {
        {
            8, 28, 28, 42, 42, 85
        }
    };
    private final short bitm_ene11a[][] = {
        {
            4, 10, 21, 31, 14, 27, 21, 0
        }
    };
    private final short bitm_ene11b[][] = {
        {
            4, 10, 21, 31, 31, 10, 21, 21
        }
    };
    private final short bitm_ene12a[][] = {
        {
            17, 10, 14, 10, 14, 10, 31, 27, 14, 4
        }
    };
    private final short bitm_ene12b[][] = {
        {
            17, 10, 14, 27, 31, 10, 31, 27, 14, 4
        }
    };
    private final short bitm_ene13a[][] = {
        {
            17, 14, 21, 27, 14
        }
    };
    private final Sprite playerInvSpr;
    private final Sprite playerSpr[];
    private final Sprite enemySpr;
    private final Sprite rocket[];
    private final Sprite enemy1[];
    private final Sprite enemy2[];
    private final Sprite homer[];
    private final Sprite Lhomer[];
    private final Sprite beam[];
    private final Sprite bullet[];
    private final Sprite crasch[];
    private final Sprite subBoss[];
    private final Sprite level1Boss[];
    private final Sprite level2Boss[];
    private final Sprite level3Boss[];
    private final Sprite level4Boss[];
    private final Sprite level6Boss[];
    private final Sprite level7Boss[];
    private final Sprite level8Boss[];
    private final Sprite level8BossPod[];
    private final Sprite shield[];
    private final Sprite bonus[];
    private final Sprite enemy3[];
    private final Sprite enemy4[];
    private final Sprite enemy5[];
    private final Sprite enemy6[];
    private final Sprite enemy7[];
    private final Sprite enemy8[];
    private final Sprite enemy10[];
    private final Sprite enemy11[];
    private final Sprite enemy12[];
    private final Sprite enemy13[];
    private final Sprite linked1[];
    private final Sprite linked2[];
    private final Sprite linked3[];
    private final Sprite status_heart;
    private final Sprite status_ammo;
    private final Sprite status_homer;
    private final Sprite status_beam;
    private final Sprite status_smart;
    final short approachingCity_tiles[][] = new short[4][];
    final short city_tiles[][] = new short[4][];
    final short aboveThePlanet_tiles[][] = new short[3][];
    final short atmos_tiles[][] = new short[4][];
    final short subway_tiles[][] = new short[4][];
    final short approachingPalace_tiles[][] = new short[6][];
    final short alienBase_tiles[][] = new short[5][];
    final short tileImages[][][] = new short[8][][];
    final short levelMaps[][] = new short[8][];
    final short aboveThePlanet[] = new short[32];
    final short cityAndDesert[] = {
        0, 0, 4, 4, 0, 0, 4, 0, 0, 4, 
        0, 0, 4, 0, 4, 0, 1, 2, 3, 3, 
        2, 1, 3, 1, 2, 3, 2, 1, 3, 1, 
        3, 2
    };
    final short atmosphere[] = {
        2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
        0, 0, 0, 2, 0, 0, 1, 3, 4, 3, 
        3, 4, 4, 3, 4, 3, 3, 3, 4, 1, 
        3, 4
    };
    final short intoSubway[] = {
        3, 2, 1, 1, 3, 1, 2, 2, 3, 2, 
        3, 3, 2, 2, 1, 2, 4, 0, 0, 0, 
        4, 0, 0, 0, 4, 0, 4, 4, 0, 0, 
        0, 0
    };
    final short outOfSubway[] = {
        1, 1, 2, 2, 3, 3, 2, 2, 3, 3, 
        3, 3, 2, 2, 1, 2, 0, 0, 0, 0, 
        4, 4, 0, 0, 4, 4, 4, 4, 0, 0, 
        0, 0
    };
    final short approachingPalace[] = {
        0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 
        0, 0, 0, 5, 5, 0, 1, 1, 2, 2, 
        3, 3, 4, 4, 3, 2, 1, 2, 3, 4, 
        4, 3
    };
    final short alienBase[] = {
        0, 0, 4, 4, 0, 0, 4, 0, 0, 0, 
        0, 0, 0, 4, 0, 0, 1, 2, 3, 3, 
        2, 1, 3, 2, 1, 2, 1, 2, 1, 3, 
        2, 1
    };
    AttackWave level1_waves[] = {
        new AttackWave(3, 5, 18, 2, 6, 35, 8, 2, 0, 1), new AttackWave(2, 5, 18, 2, 6, 35, 17, 2, 0, 1), new AttackWave(2, 5, 18, 1, 6, 35, 17, 2, 0, 1), new AttackWave(3, 5, 18, 2, 6, 19, 29, 2, 0, 1), new AttackWave(1, 5, 18, 2, 6, 5, 9, 2, 0, 4), new AttackWave(1, 17, 18, 2, 6, 9, 9, 2, 0, 1), new AttackWave(1, 5, 18, 2, 6, 60, 9, 2, 0, 4), new AttackWave(4, 29, 18, 1, 2, 10, 0, 0, 0, 2), new AttackWave(4, 29, 18, 1, 1, 140, 0, 0, 20, 2), new AttackWave(1, 27, 15, 2, 6, 60, 24, 2, 5, 1), 
        new AttackWave(2, 27, 15, 2, 6, 30, 12, 2, 5, 1), new AttackWave(5, 27, 15, 1, 1, 80, 5, 2, 5, 1), new AttackWave(4, 27, 19, 1, 7, 100, 12, 2, 5, 1), new AttackWave(1, 17, 15, 1, 6, 80, 24, 0, 0, 1), new AttackWave(1, 3, 0, 2, 6, 10, 5, 3, 12, 4), new AttackWave(1, 3, 0, 1, 6, 7, 14, 3, 12, 4), new AttackWave(1, 3, 0, 1, 6, 10, 8, 3, 12, 4), new AttackWave(1, 3, 0, 2, 6, 4, 38, 3, 12, 4), new AttackWave(1, 3, 0, 2, 6, 10, 100, 3, 12, 4), new AttackWave(1, 19, 15, 1, 23, 0, 12, 40, 50, 25)
    };
    AttackWave level2_waves[] = {
        new AttackWave(3, 29, 15, 1, 15, 0, 0, 60, 20, 2), new AttackWave(3, 29, 15, 1, 16, 60, 0, 60, 20, 2), new AttackWave(3, 15, 15, 1, 10, 0, 0, 60, 20, 1), new AttackWave(3, 15, 15, 1, 11, 20, 0, 60, 20, 1), new AttackWave(5, 3, 15, 3, 6, 23, 24, 60, 20, 3), new AttackWave(1, 17, 15, 3, 6, 40, 24, 127, 0, 0), new AttackWave(1, 30, 0, 1, 15, 32, 12, 60, 5, 2), new AttackWave(1, 30, 0, 2, 12, 12, 12, 60, 5, 2), new AttackWave(1, 30, 0, 1, 10, 22, 12, 60, 5, 2), new AttackWave(1, 30, 0, 2, 6, 16, 24, 60, 5, 2), 
        new AttackWave(1, 30, 0, 2, 6, 12, 18, 60, 5, 2), new AttackWave(1, 30, 0, 2, 6, 5, 23, 45, 45, 1), new AttackWave(1, 30, 0, 2, 6, 0, 17, 45, 45, 1), new AttackWave(1, 30, 0, 2, 6, 5, 29, 45, 45, 1), new AttackWave(1, 30, 0, 2, 6, 0, 11, 45, 45, 1), new AttackWave(1, 30, 0, 2, 6, 20, 35, 45, 45, 1), new AttackWave(1, 30, 0, 2, 6, 5, 19, 45, 45, 1), new AttackWave(1, 30, 0, 2, 6, 0, 13, 45, 45, 1), new AttackWave(1, 30, 0, 2, 6, 5, 25, 45, 45, 1), new AttackWave(1, 30, 0, 2, 6, 0, 7, 45, 45, 1), 
        new AttackWave(1, 30, 0, 2, 6, 20, 31, 45, 45, 1), new AttackWave(5, 3, 15, 3, 6, 23, 24, 60, 20, 3), new AttackWave(6, 3, 25, 2, 6, 80, 63, 127, 0, 2), new AttackWave(1, 20, 0, 3, 23, 0, 12, 20, 40, 40)
    };
    AttackWave level3_waves[] = {
        new AttackWave(3, 14, 20, 1, 15, 50, 0, 90, 90, 2), new AttackWave(3, 14, 20, 1, 15, 50, 0, 90, 90, 2), new AttackWave(3, 14, 20, 1, 15, 50, 0, 90, 90, 2), new AttackWave(3, 15, 20, 3, 18, 16, 29, 90, 45, 2), new AttackWave(1, 17, 0, 3, 18, 60, 29, 0, 0, 1), new AttackWave(1, 30, 0, 3, 6, 5, 18, 45, 45, 3), new AttackWave(1, 30, 0, 3, 6, 0, 12, 45, 45, 3), new AttackWave(1, 30, 0, 3, 6, 5, 24, 45, 45, 3), new AttackWave(1, 30, 0, 3, 6, 0, 6, 45, 45, 3), new AttackWave(1, 30, 0, 3, 6, 20, 30, 45, 45, 3), 
        new AttackWave(1, 30, 0, 3, 6, 5, 18, 45, 45, 3), new AttackWave(1, 30, 0, 3, 6, 0, 12, 45, 45, 3), new AttackWave(1, 30, 0, 3, 6, 5, 24, 45, 45, 3), new AttackWave(1, 30, 0, 3, 6, 0, 6, 45, 45, 3), new AttackWave(1, 30, 0, 3, 6, 20, 30, 45, 45, 3), new AttackWave(1, 11, 0, 2, 11, 3, 6, 10, 5, 4), new AttackWave(1, 12, 0, 2, 11, 3, 6, 127, 0, 1), new AttackWave(1, 13, 0, 2, 11, 0, 6, 127, 0, 1), new AttackWave(1, 11, 0, 2, 13, 3, 6, 10, 5, 4), new AttackWave(1, 12, 0, 2, 13, 3, 6, 127, 0, 1), 
        new AttackWave(1, 13, 0, 2, 13, 10, 6, 127, 0, 1), new AttackWave(1, 26, 0, 3, 24, 200, 12, 20, 45, 25), new AttackWave(1, 18, 0, 2, 23, 0, 12, 30, 45, 60)
    };
    AttackWave level4_waves[] = {
        new AttackWave(5, 16, 15, 2, 17, 40, 10, 0, 66, 2), new AttackWave(5, 16, 15, 2, 2, 40, 16, 0, 66, 2), new AttackWave(5, 16, 15, 2, 4, 50, 12, 0, 66, 2), new AttackWave(1, 3, 15, 2, 6, 30, 22, 0, 66, 2), new AttackWave(3, 3, 15, 2, 6, 30, 12, 0, 66, 2), new AttackWave(2, 3, 15, 2, 6, 40, 26, 0, 66, 2), new AttackWave(3, 3, 15, 3, 6, 60, 18, 0, 66, 4), new AttackWave(1, 17, 0, 1, 1, 60, 24, 0, 0, 2), new AttackWave(1, 28, 0, 1, 6, 22, 12, 130, 20, 10), new AttackWave(1, 28, 0, 1, 6, 20, 18, 130, 20, 10), 
        new AttackWave(1, 28, 0, 1, 6, 22, 22, 130, 20, 10), new AttackWave(1, 28, 0, 1, 6, 20, 9, 130, 20, 10), new AttackWave(1, 28, 0, 1, 6, 66, 24, 130, 20, 10), new AttackWave(3, 16, 15, 2, 1, 20, 12, 20, 66, 2), new AttackWave(3, 16, 15, 2, 1, 30, 30, 20, 66, 2), new AttackWave(3, 16, 15, 2, 1, 30, 22, 20, 66, 2), new AttackWave(2, 29, 20, 3, 7, 30, 12, 10, 20, 2), new AttackWave(2, 29, 20, 3, 7, 30, 32, 10, 20, 2), new AttackWave(2, 29, 20, 3, 7, 30, 24, 10, 20, 2), new AttackWave(1, 23, 0, 4, 23, 0, 12, 10, 90, 50)
    };
    AttackWave level5_waves[] = {
        new AttackWave(5, 13, 15, 1, 4, 25, 5, 60, 45, 3), new AttackWave(5, 13, 15, 2, 6, 45, 34, 12, 45, 3), new AttackWave(1, 26, 0, 1, 7, 60, 12, 1, 100, 10), new AttackWave(1, 17, 0, 1, 1, 40, 24, 0, 0, 1), new AttackWave(3, 14, 23, 2, 1, 20, 41, 3, 10, 2), new AttackWave(3, 14, 23, 2, 1, 20, 8, 3, 10, 2), new AttackWave(3, 14, 23, 2, 1, 45, 10, 3, 10, 2), new AttackWave(1, 30, 0, 3, 6, 5, 24, 127, 45, 3), new AttackWave(1, 30, 0, 3, 6, 0, 16, 127, 45, 3), new AttackWave(1, 30, 0, 3, 6, 10, 32, 127, 45, 3), 
        new AttackWave(1, 30, 0, 3, 6, 5, 24, 127, 45, 3), new AttackWave(1, 30, 0, 3, 6, 0, 16, 127, 45, 3), new AttackWave(1, 30, 0, 3, 6, 20, 32, 127, 45, 3), new AttackWave(5, 29, 15, 1, 2, 0, 0, 60, 20, 6), new AttackWave(5, 29, 15, 1, 4, 110, 0, 60, 20, 6), new AttackWave(6, 30, 15, 1, 7, 90, 24, 1, 34, 2), new AttackWave(5, 30, 25, 2, 4, 75, 36, 12, 45, 2), new AttackWave(1, 30, 0, 3, 24, 200, 12, 10, 45, 25), new AttackWave(1, 7, 0, 1, 23, 90, 12, 20, 23, 80)
    };
    AttackWave level6_waves[] = {
        new AttackWave(1, 29, 0, 3, 6, 5, 25, 12, 12, 3), new AttackWave(1, 29, 0, 3, 6, 5, 20, 12, 12, 3), new AttackWave(1, 29, 0, 3, 6, 5, 15, 12, 12, 3), new AttackWave(1, 29, 0, 3, 6, 5, 10, 12, 12, 3), new AttackWave(4, 30, 10, 3, 7, 20, 10, 1, 50, 3), new AttackWave(1, 29, 0, 3, 6, 5, 35, 12, 12, 3), new AttackWave(1, 29, 0, 3, 6, 5, 30, 12, 12, 3), new AttackWave(1, 29, 0, 3, 6, 5, 25, 12, 12, 3), new AttackWave(1, 29, 0, 3, 6, 5, 20, 12, 12, 3), new AttackWave(1, 17, 10, 2, 6, 40, 20, 127, 0, 1), 
        new AttackWave(4, 16, 11, 2, 10, 35, 10, 100, 6, 2), new AttackWave(3, 15, 15, 3, 11, 0, 0, 127, 0, 3), new AttackWave(1, 17, 0, 3, 6, 0, 24, 0, 0, 2), new AttackWave(3, 15, 15, 3, 10, 50, 0, 3, 45, 2), new AttackWave(1, 29, 0, 3, 2, 0, 10, 10, 50, 3), new AttackWave(1, 29, 0, 3, 4, 5, 30, 10, 50, 3), new AttackWave(1, 29, 0, 3, 2, 0, 10, 10, 50, 3), new AttackWave(1, 29, 0, 3, 4, 5, 30, 10, 50, 3), new AttackWave(1, 29, 0, 3, 2, 0, 10, 10, 50, 3), new AttackWave(1, 29, 0, 3, 4, 5, 30, 10, 50, 3), 
        new AttackWave(1, 16, 11, 2, 6, 35, 36, 100, 6, 4), new AttackWave(1, 11, 0, 3, 1, 3, 0, 2, 40, 3), new AttackWave(1, 12, 0, 3, 1, 3, 0, 2, 40, 3), new AttackWave(1, 12, 0, 3, 1, 3, 0, 2, 40, 3), new AttackWave(1, 12, 0, 3, 1, 3, 0, 2, 40, 3), new AttackWave(1, 12, 0, 3, 1, 3, 0, 2, 40, 3), new AttackWave(1, 12, 0, 3, 1, 18, 0, 2, 40, 3), new AttackWave(4, 6, 11, 2, 1, 40, 0, 50, 6, 3), new AttackWave(3, 31, 11, 2, 2, 0, 0, 50, 6, 2), new AttackWave(3, 31, 11, 2, 4, 45, 15, 50, 6, 2), 
        new AttackWave(1, 17, 10, 3, 6, 40, 20, 127, 0, 1), new AttackWave(1, 16, 11, 2, 14, 25, 10, 50, 6, 2), new AttackWave(2, 30, 20, 2, 7, 50, 6, 50, 20, 3), new AttackWave(4, 6, 11, 3, 1, 30, 0, 50, 26, 3), new AttackWave(3, 31, 11, 2, 2, 0, 0, 47, 26, 2), new AttackWave(3, 31, 11, 2, 4, 45, 15, 47, 26, 2), new AttackWave(10, 27, 15, 3, 1, 55, 63, 40, 20, 3), new AttackWave(1, 24, 11, 1, 23, 60, 8, 15, 0, 60)
    };
    AttackWave level7_waves[] = {
        new AttackWave(2, 26, 15, 3, 10, 0, 0, 23, 23, 4), new AttackWave(2, 26, 15, 2, 11, 28, 0, 23, 23, 4), new AttackWave(2, 26, 15, 3, 14, 0, 0, 23, 23, 4), new AttackWave(2, 26, 15, 2, 10, 28, 0, 23, 23, 4), new AttackWave(2, 26, 15, 3, 11, 0, 0, 23, 23, 4), new AttackWave(2, 26, 15, 2, 4, 45, 0, 23, 23, 4), new AttackWave(4, 16, 15, 4, 6, 12, 16, 14, 20, 2), new AttackWave(4, 16, 15, 4, 6, 12, 32, 14, 20, 2), new AttackWave(5, 16, 15, 3, 2, 18, 40, 5, 30, 2), new AttackWave(4, 16, 15, 4, 6, 23, 18, 14, 20, 2), 
        new AttackWave(6, 29, 15, 1, 7, 20, 24, 1, 34, 2), new AttackWave(5, 29, 15, 2, 4, 45, 36, 12, 45, 2), new AttackWave(1, 17, 0, 3, 8, 45, 18, 0, 0, 1), new AttackWave(1, 3, 0, 3, 6, 5, 18, 12, 45, 3), new AttackWave(1, 3, 0, 3, 6, 0, 12, 12, 45, 3), new AttackWave(1, 3, 0, 3, 6, 5, 24, 12, 45, 3), new AttackWave(1, 3, 0, 3, 6, 0, 6, 12, 45, 3), new AttackWave(1, 3, 0, 3, 6, 40, 30, 12, 45, 3), new AttackWave(1, 3, 0, 3, 6, 5, 18, 12, 45, 3), new AttackWave(1, 3, 0, 3, 6, 0, 12, 12, 45, 3), 
        new AttackWave(1, 3, 0, 3, 6, 5, 24, 12, 45, 3), new AttackWave(1, 3, 0, 3, 6, 0, 6, 12, 45, 3), new AttackWave(1, 3, 0, 3, 6, 40, 30, 12, 45, 3), new AttackWave(5, 16, 20, 2, 11, 0, 10, 50, 6, 2), new AttackWave(5, 16, 20, 2, 14, 55, 10, 50, 6, 2), new AttackWave(5, 16, 16, 2, 13, 0, 10, 50, 6, 2), new AttackWave(5, 16, 16, 2, 14, 84, 10, 50, 6, 2), new AttackWave(1, 25, 0, 4, 23, 0, 12, 15, 34, 45)
    };
    AttackWave level8_waves[] = {
        new AttackWave(1, 30, 0, 2, 6, 0, 7, 60, 5, 8), new AttackWave(1, 30, 0, 2, 6, 0, 16, 60, 5, 8), new AttackWave(1, 30, 0, 2, 6, 20, 28, 60, 5, 2), new AttackWave(4, 31, 18, 1, 2, 10, 0, 10, 20, 4), new AttackWave(4, 31, 18, 1, 1, 60, 0, 10, 20, 4), new AttackWave(1, 34, 11, 1, 23, 60, 14, 20, 0, 50)
    };
    int x[] = {
        4, 0, 0, 0
    };
    LevelStruct level1;
    LevelStruct level2;
    LevelStruct level3;
    LevelStruct level4;
    LevelStruct level5;
    LevelStruct level6;
    LevelStruct level7;
    LevelStruct level8;
    LevelStruct levelData[];
    final int sinWavePatternHigh[] = {
        19, 18, 17, 16, 15, 13, 12, 11, 11, 10, 
        10, 9, 9, 10, 10, 11, 12, 13, 14, 15, 
        16, 18, 18, 19, 21, 22, 23, 24, 25, 26, 
        26, 27, 27, 26, 26, 26, 25, 24, 23, 22, 
        20, 19, 18, 17, 16, 15, 13, 12, 11, 11, 
        10, 10, 9, 9, 10, 10, 11, 12, 13, 14, 
        15, 16, 18, 18, 20, 21, 22, 23, 24, 25, 
        26, 26, 27, 27, 26, 26, 26, 25, 24, 23, 
        22, 20, 19, 19
    };
    final int miniSinWaveVectored[] = {
        0, 0, 0, 1, 2, 2, 3, 3, 3, 4, 
        4, 4, 4, 4, 3, 3, 3, 2, 1, 1, 
        0, 0, 0, -1, -1, -2, -2, -3, -3, -4, 
        -4, -4, -4, -4, -3, -3, -3, -2, -2, -1, 
        -1, 0, 0, 0, 1, 2, 2, 3, 3, 3, 
        4, 4, 4, 4, 4, 3, 3, 3, 2, 1, 
        1, 0, 0, 0, -1, -1, -2, -2, -3, -3, 
        -4, -4, -4, -4, -4, -3, -3, -3, -2, -2, 
        -1, 0, 0, 0
    };
    final int diagonalBRTL[] = {
        6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 
        9, 10, 10, 10, 11, 11, 11, 11, 12, 12, 
        12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 
        16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 
        19, 19, 20, 20, 20, 20, 21, 21, 21, 22, 
        22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 
        25, 26, 26, 26, 27, 27, 27, 28, 28, 28, 
        29, 29, 29, 29, 30, 30, 30, 31, 31, 31, 
        32, 32, 32, 33
    };
    final int diagonalTRBL[] = {
        33, 32, 32, 32, 30, 30, 30, 29, 29, 29, 
        29, 28, 28, 28, 27, 27, 27, 26, 26, 26, 
        25, 25, 25, 24, 24, 24, 24, 23, 23, 23, 
        22, 22, 22, 22, 21, 21, 21, 20, 20, 20, 
        20, 20, 19, 19, 19, 18, 18, 18, 17, 17, 
        17, 16, 16, 16, 15, 15, 15, 14, 14, 14, 
        13, 13, 13, 12, 12, 12, 12, 11, 11, 10, 
        10, 10, 9, 9, 9, 8, 8, 8, 7, 7, 
        6
    };
    int pattern[];
    final Sprite spritesByType[][];
    final SpaceObject objectsByType[] = {
        new SpaceObject(1, 0, 0, 1, 45, 0, 1, 127), new SpaceObject(1, 0, 1, 1, 0, 5, 2, 127), new SpaceObject(5, 0, 2, 0, 0, 0, 0, 127), new SpaceObject(1, 0, 3, 1, 1, 1, 1, 127), new SpaceObject(1, 0, 4, 1, 0, 6, 3, 127), new SpaceObject(2, 0, 5, 2, 5, 6, 1, 127), new SpaceObject(2, 0, 6, 1, 2, 14, 2, 127), new SpaceObject(4, 0, 7, 10, 0, 0, 1, 127), new SpaceObject(2, 0, 8, 32, 0, 0, 0, 127), new SpaceObject(7, 0, 9, 32, 0, 0, 0, 127), 
        new SpaceObject(1, 0, 10, 10, 0, 9, 1, 127), new SpaceObject(1, 0, 11, 1, 0, 1, 2, 127), new SpaceObject(1, 0, 12, 1, 0, 1, 1, 127), new SpaceObject(1, 0, 13, 1, 0, 1, 1, 127), new SpaceObject(2, 0, 14, 1, 0, 6, 2, 127), new SpaceObject(2, 0, 15, 1, 0, 6, 2, 127), new SpaceObject(2, 0, 16, 1, 0, 6, 2, 127), new SpaceObject(2, 0, 17, 1, 0, 6, 1, 127), new SpaceObject(4, 0, 18, 10, 0, 0, 1, 127), new SpaceObject(4, 0, 19, 10, 0, 0, 1, 127), 
        new SpaceObject(4, 0, 20, 10, 0, 0, 1, 127), new SpaceObject(1, 0, 21, 2, 0, 3, 3, 127), new SpaceObject(1, 0, 22, 30, 0, 5, 1, 127), new SpaceObject(4, 0, 23, 10, 0, 0, 1, 127), new SpaceObject(4, 0, 24, 10, 0, 0, 1, 127), new SpaceObject(4, 0, 25, 10, 0, 0, 1, 127), new SpaceObject(1, 0, 26, 1, 0, 6, 1, 127), new SpaceObject(1, 0, 27, 1, 0, 6, 1, 127), new SpaceObject(1, 0, 28, 1, 0, 6, 1, 127), new SpaceObject(2, 0, 29, 4, 2, 3, 2, 10), 
        new SpaceObject(2, 0, 30, 1, 0, 6, 2, 127), new SpaceObject(2, 0, 31, 1, 0, 6, 2, 127), new SpaceObject(1, 0, 32, 1, 0, 6, 1, 127), new SpaceObject(2, 0, 33, 1, 0, 6, 1, 127), new SpaceObject(4, 0, 34, 10, 0, 23, 1, 127), new SpaceObject(1, 0, 35, 30, 0, 22, 1, 127), new SpaceObject(5, 0, 36, 0, 0, 0, 0, 127)
    };
    static int scrollLeft;
    static int direction = -1;
    static Index flashCheck = null;
    static int spawnCount = 0;
    static int ticker = 0;

}