www.pudn.com > BlackCross.rar > gameObjects.java


import java.io.InputStream; 
import javax.microedition.lcdui.Graphics; 
 
class gameObjects 
{ 
    boolean SCREENSHOT_MODE; 
    int lasthit_counter; 
    int lasthit_obj; 
    boolean latestFailed; 
    int latestType; 
    int latestNumber; 
    int latestSize[]; 
    sinCosTab gradTab; 
    objectScripts script[]; 
    imageObjects images; 
    gameObjectInits inits; 
    final int NO_OBJ = 15; 
    gameObject objects[][]; 
    int levelEndCounter; 
    int main_x; 
    int main_y; 
    int mainEnterX; 
    int mainEnterY; 
    int mainEnterMode; 
    int memc; 
    int memTime; 
    int main_lives; 
    int main_score; 
    int main_exp; 
    int main_level; 
    boolean main_levelup; 
    int main_levelup_counter; 
    boolean main_gameover; 
    boolean main_levelend; 
    int gameOverCounter; 
    int idCounter; 
     
    public gameObjects(boolean flag) 
    { 
        SCREENSHOT_MODE = false; 
        lasthit_counter = 50; 
        lasthit_obj = -1; 
        latestFailed = false; 
        latestSize = new int[2]; 
        gradTab = new sinCosTab(); 
        script = new objectScripts[25]; 
        images = new imageObjects(); 
        inits = new gameObjectInits(); 
        objects = new gameObject[5][15]; 
        levelEndCounter = -1; 
        mainEnterMode = 0; 
        memc = 0; 
        memTime = 35; 
        main_exp = 0; 
        main_level = 1; 
        main_levelup = false; 
        main_levelup_counter = 0; 
        gameOverCounter = 0; 
        idCounter = 0; 
        SCREENSHOT_MODE = flag; 
        for(int i = 0; i < 15; i++) 
        { 
            objects[0][i] = new gameObject(); 
            objects[1][i] = new gameObject(); 
            objects[2][i] = new gameObject(); 
            objects[3][i] = new gameObject(); 
            objects[4][i] = new gameObject(); 
        } 
 
        for(int j = 0; j < 25; j++) 
            script[j] = new objectScripts(); 
 
        gameOverCounter = 0; 
    } 
 
    public int playerState() 
    { 
        if(main_gameover) 
        { 
            gameOverCounter++; 
            if(gameOverCounter == 1) 
                return 1; 
        } 
        return 0; 
    } 
 
    public void makeMainEnter() 
    { 
        memc = 0; 
        mainEnterMode = memTime; 
        main_x = mainEnterX; 
        main_y = mainEnterY; 
        add(0, -1, main_x, main_y, -1, -1); 
        objects[4][0].animationCurrent = 1; 
    } 
 
    public void loadAndInit(int i, int j) 
    { 
        levelEndCounter = -1; 
        for(int k = 0; k < 15; k++) 
        { 
            objects[0][k].status = 0; 
            objects[1][k].status = 0; 
            objects[2][k].status = 0; 
            objects[3][k].status = 0; 
            objects[4][k].status = 0; 
        } 
 
        inits.load(i, j); 
        for(int l = 0; l < 40; l++) 
            if(inits.inits[l].imageNumber != -1) 
                images.load(inits.inits[l].imageNumber, inits.inits[l].imageFileNumber, inits.inits[l].numberOfAnimations); 
 
        try 
        { 
            byte abyte0[] = new byte[90]; 
            InputStream inputstream = getClass().getResourceAsStream("/sets/script" + i + ".set"); 
            inputstream.read(abyte0, 0, 2); 
            int i1 = (abyte0[0] * abyte0[1]) / 83; 
            for(int k1 = 0; k1 < i1; k1++) 
            { 
                inputstream.read(abyte0, 0, 83); 
                byte byte0 = abyte0[0]; 
                script[byte0].initSpeed = abyte0[1]; 
                script[byte0].initDir = abyte0[2]; 
                for(int j1 = 0; j1 < 5; j1++) 
                { 
                    script[byte0].sub[j1].time = abyte0[j1 * 16 + 3]; 
                    script[byte0].sub[j1].speedChange = abyte0[j1 * 16 + 4]; 
                    script[byte0].sub[j1].dirChange = abyte0[j1 * 16 + 5]; 
                    script[byte0].sub[j1].startCreation = abyte0[j1 * 16 + 6]; 
                    script[byte0].sub[j1].stopCreation = abyte0[j1 * 16 + 7]; 
                    script[byte0].sub[j1].aiming = abyte0[j1 * 16 + 8]; 
                    script[byte0].sub[j1].jumpTo = abyte0[j1 * 16 + 9]; 
                    script[byte0].sub[j1].facChange = abyte0[j1 * 16 + 10]; 
                    script[byte0].sub[j1].kill = abyte0[j1 * 16 + 11]; 
                    script[byte0].sub[j1].posXChange = abyte0[j1 * 16 + 12]; 
                    script[byte0].sub[j1].posYChange = abyte0[j1 * 16 + 13]; 
                } 
 
            } 
 
            inputstream.close(); 
            gameOverCounter = 0; 
        } 
        catch(Exception exception) { } 
    } 
 
    public void processAll() 
    { 
        processArray(0); 
        processArray(1); 
        processArray(4); 
        processArray(3); 
        processArray(2); 
    } 
 
    public void processArray(int i) 
    { 
        int k = i; 
        for(int j = 0; j < 15; j++) 
        { 
            if(objects[k][j].status == 0) 
                continue; 
            if(k == 4 && j == 0) 
            { 
                objects[k][j].position[0] = main_x * 64; 
                objects[k][j].position[1] = main_y * 64; 
                if(mainEnterMode > 0) 
                { 
                    memc++; 
                    if(memc == 2) 
                        memc = 0; 
                    if(mainEnterMode > memTime - 10) 
                        main_y -= 5; 
                    mainEnterMode--; 
                } 
                process(k, j); 
            } else 
            { 
                runScript(k, j); 
                process(k, j); 
            } 
        } 
 
    } 
 
    private void process(int i, int j) 
    { 
        int k = objects[i][j].speed / 30; 
        int l = objects[i][j].direction; 
        int i1 = objects[i][j].facing; 
        if(l >= 1350) 
            l -= 1350; 
        if(l < 0) 
            l += 1350; 
        if(i1 >= 1350) 
            i1 -= 1350; 
        if(i1 < 0) 
            i1 += 1350; 
        objects[i][j].facing = i1; 
        objects[i][j].direction = l; 
        l /= 15; 
        objects[i][j].position[0] += sinCosTab.gradTab[l][0] * k; 
        objects[i][j].position[1] += sinCosTab.gradTab[l][1] * k; 
        if(objects[i][j].animationType != 0) 
        { 
            objects[i][j].animationCounter++; 
            if(objects[i][j].animationCounter >= objects[i][j].animationSpeed) 
            { 
                objects[i][j].animationCounter = 0; 
                objects[i][j].animationCurrent++; 
                if(objects[i][j].animationCurrent == objects[i][j].animationMax) 
                { 
                    if(objects[i][j].animationType == 1) 
                        objects[i][j].animationCurrent = 0; 
                    if(objects[i][j].animationType == 3) 
                    { 
                        objects[i][j].status = 0; 
                        return; 
                    } 
                } 
            } 
        } 
        if(objects[i][j].hierarchyType == 1) 
        { 
            int j1 = objects[i][j].motherTyp; 
            int l1 = objects[i][j].motherNo; 
            if(objects[i][j].motherID != objects[j1][l1].ID || objects[j1][l1].status == 0) 
            { 
                objects[i][j].status = 0; 
                return; 
            } 
            objects[i][j].position[0] -= objects[i][j].motherPosition[0]; 
            objects[i][j].position[1] -= objects[i][j].motherPosition[1]; 
            objects[i][j].position[0] += objects[j1][l1].position[0]; 
            objects[i][j].position[1] += objects[j1][l1].position[1]; 
            objects[i][j].motherPosition[0] = objects[j1][l1].position[0]; 
            objects[i][j].motherPosition[1] = objects[j1][l1].position[1]; 
        } 
        objects[i][j].screenPos[0] = objects[i][j].position[0] / 64; 
        objects[i][j].screenPos[1] = objects[i][j].position[1] / 64; 
        if(objects[i][j].clip == 1) 
        { 
            if(objects[i][j].screenPos[0] + objects[i][j].size[0] < 0 || objects[i][j].screenPos[0] - objects[i][j].size[0] > 128 || objects[i][j].screenPos[1] + objects[i][j].size[1] < 0 || objects[i][j].screenPos[1] - objects[i][j].size[1] > 128) 
            { 
                objects[i][j].status = 0; 
                return; 
            } 
        } else 
        if(objects[i][j].clip == 2 && (objects[i][j].screenPos[0] + objects[i][j].size[0] + 8 < 0 || objects[i][j].screenPos[0] - objects[i][j].size[0] - 8 > 128 || objects[i][j].screenPos[1] + objects[i][j].size[1] + 8 < 0 || objects[i][j].screenPos[1] - objects[i][j].size[1] - 8 > 128)) 
        { 
            objects[i][j].status = 0; 
            return; 
        } 
        if(i != 0 && i != 4) 
            return; 
        for(int k1 = 0; k1 < 5; k1++) 
        { 
            int l2 = objects[i][j].creations[k1].type; 
            int i3 = l2; 
            l2 &= 7; 
            if(!objects[i][j].creations[k1].active || l2 != 1 && l2 != 4 || objects[i][j].creations[k1].init == -1) 
                continue; 
            if(l2 == 4) 
                objects[i][j].creations[k1].active = false; 
            objects[i][j].creations[k1].counter++; 
            if(l2 != 4 && objects[i][j].creations[k1].counter < objects[i][j].creations[k1].timer) 
                continue; 
            i3 &= 0x38; 
            objects[i][j].creations[k1].counter = 0; 
            int i2 = objects[i][j].creations[k1].init; 
            int j2 = objects[i][j].creations[k1].offset[0] + objects[i][j].screenPos[0]; 
            int k2 = objects[i][j].creations[k1].offset[1] + objects[i][j].screenPos[1]; 
            add(i2, -1, j2, k2, i, j); 
            if(latestFailed) 
                continue; 
            if(i3 == 8) 
            { 
                int i4 = objects[latestType][latestNumber].position[0] - objects[4][0].position[0]; 
                int k4 = objects[latestType][latestNumber].position[1] - objects[4][0].position[1]; 
                System.out.println(i4+","+k4); 
                int j3 = gradTab.getRotationFor(i4, k4); 
                System.out.println(j3); 
                objects[latestType][latestNumber].direction = j3 * 15; 
            } else 
            if(i3 == 16) 
            { 
                int k3 = objects[i][j].facing + objects[latestType][latestNumber].facing; 
                objects[latestType][latestNumber].direction = k3; 
                objects[latestType][latestNumber].facing = k3; 
                if(objects[latestType][latestNumber].facing < 0) 
                    objects[latestType][latestNumber].facing += 1350; 
                if(objects[latestType][latestNumber].facing >= 1350) 
                    objects[latestType][latestNumber].facing -= 1350; 
                if(objects[latestType][latestNumber].direction < 0) 
                    objects[latestType][latestNumber].direction += 1350; 
                if(objects[latestType][latestNumber].direction >= 1350) 
                    objects[latestType][latestNumber].direction -= 1350; 
            } 
            if(objects[i][j].creations[k1].offsetRotation != -99) 
            { 
                int l3 = objects[latestType][latestNumber].direction; 
                l3 += objects[i][j].creations[k1].offsetRotation * 15; 
                objects[latestType][latestNumber].direction = l3; 
            } 
        } 
 
    } 
 
    private void runScript(int i, int j) 
    { 
        int k = objects[i][j].script; 
        if(k == -1) 
            return; 
        int l = objects[i][j].scriptPos; 
        if(script[k].sub[l].time != 0) 
        { 
            if(objects[i][j].scriptCounter == 0) 
            { 
                if(script[k].sub[l].startCreation != -1) 
                { 
                    int i1 = script[k].sub[l].startCreation; 
                    int k1 = i1 & 1; 
                    int i2 = i1 & 2; 
                    int k2 = i1 & 4; 
                    int i3 = i1 & 8; 
                    int k3 = i1 & 0x10; 
                    if(k1 == 1) 
                        objects[i][j].creations[0].active = true; 
                    if(i2 == 2) 
                        objects[i][j].creations[1].active = true; 
                    if(k2 == 4) 
                        objects[i][j].creations[2].active = true; 
                    if(i3 == 8) 
                        objects[i][j].creations[3].active = true; 
                    if(k3 == 16) 
                        objects[i][j].creations[4].active = true; 
                } 
                if(script[k].sub[l].stopCreation != -1) 
                { 
                    int j1 = script[k].sub[l].stopCreation; 
                    int l1 = j1 & 1; 
                    int j2 = j1 & 2; 
                    int l2 = j1 & 4; 
                    int j3 = j1 & 8; 
                    int l3 = j1 & 0x10; 
                    if(l1 == 1) 
                        objects[i][j].creations[0].active = false; 
                    if(j2 == 2) 
                        objects[i][j].creations[1].active = false; 
                    if(l2 == 4) 
                        objects[i][j].creations[2].active = false; 
                    if(j3 == 8) 
                        objects[i][j].creations[3].active = false; 
                    if(l3 == 16) 
                        objects[i][j].creations[4].active = false; 
                } 
                if(script[k].sub[l].kill != 0) 
                { 
                    objects[i][j].status = 0; 
                    return; 
                } 
            } 
            objects[i][j].facing += script[k].sub[l].facChange; 
            objects[i][j].direction += script[k].sub[l].dirChange; 
            objects[i][j].speed += script[k].sub[l].speedChange; 
            objects[i][j].position[0] += script[k].sub[l].posXChange * 64; 
            objects[i][j].position[1] += script[k].sub[l].posYChange * 64; 
            objects[i][j].scriptCounter++; 
            if(objects[i][j].scriptCounter == script[k].sub[l].time) 
            { 
                objects[i][j].scriptCounter = 0; 
                if(script[k].sub[l].jumpTo != -1) 
                { 
                    objects[i][j].scriptCounter = 0; 
                    objects[i][j].scriptPos = script[k].sub[l].jumpTo; 
                    l = objects[i][j].scriptPos; 
                } else 
                { 
                    objects[i][j].scriptPos++; 
                    if(objects[i][j].scriptPos == 5) 
                        objects[i][j].script = -1; 
                } 
            } 
        } else 
        { 
            objects[i][j].script = -1; 
        } 
    } 
 
    public void doCreation(int i, int j, int k) 
    { 
        for(int l = 0; l < 5; l++) 
            if(objects[i][j].creations[l].type == k) 
            { 
                int i1 = objects[i][j].creations[l].init; 
                int j1 = objects[i][j].creations[l].offset[0] + objects[i][j].screenPos[0]; 
                int k1 = objects[i][j].creations[l].offset[1] + objects[i][j].screenPos[1]; 
                add(i1, -1, j1, k1, i, j); 
            } 
 
    } 
 
    private boolean obj2obj(int i, int j, int k, int l) 
    { 
        boolean flag = false; 
        int i2 = objects[i][j].colSize[0] * 64; 
        int j2 = objects[k][l].colSize[0] * 64; 
        int i1 = objects[i][j].position[0] - i2; 
        int k1 = objects[k][l].position[0] - j2; 
        int j1 = objects[i][j].position[0] + i2; 
        int l1 = objects[k][l].position[0] + j2; 
        if(i1 >= k1 && i1 <= l1 || j1 >= k1 && j1 <= l1) 
            flag = true; 
        else 
        if(k1 >= i1 && k1 <= j1 || l1 >= i1 && l1 <= j1) 
            flag = true; 
        if(!flag) 
            return false; 
        i2 = objects[i][j].colSize[1] * 64; 
        j2 = objects[k][l].colSize[1] * 64; 
        i1 = objects[i][j].position[1] - i2; 
        k1 = objects[k][l].position[1] - j2; 
        j1 = objects[i][j].position[1] + i2; 
        l1 = objects[k][l].position[1] + j2; 
        flag = false; 
        if(i1 >= k1 && i1 <= l1 || j1 >= k1 && j1 <= l1) 
            flag = true; 
        else 
        if(k1 >= i1 && k1 <= j1 || l1 >= i1 && l1 <= j1) 
            flag = true; 
        return flag; 
    } 
 
    private void checkCol(int i, int j) 
    { 
        for(int k = 0; k < 15; k++) 
        { 
            if(objects[i][k].status == 0) 
                continue; 
            for(int l = 0; l < 15; l++) 
            { 
                if(objects[j][l].status != 0 && obj2obj(i, k, j, l)) 
                    if(j == 1) 
                    { 
                        main_exp++; 
                        if(main_exp >= 63 * main_level) 
                        { 
                            main_exp = 0; 
                            main_level++; 
                            main_levelup = true; 
                        } 
                        doCreation(j, l, 2); 
                        if(objects[i][k].hitsNum != -99) 
                        { 
                            objects[i][k].hitsNum -= objects[j][l].hitsNum; 
                            if(objects[i][k].hitsNum <= 0) 
                            { 
                                doCreation(i, k, 2); 
                                objects[i][k].status = 0; 
                                main_score += objects[i][k].score * 3; 
                            } else 
                            { 
                                lasthit_counter = 0; 
                                lasthit_obj = k; 
                            } 
                        } 
                        objects[j][l].status = 0; 
                    } else 
                    { 
                        doCreation(j, l, 2); 
                        if(objects[i][k].hitsNum != -99) 
                        { 
                            objects[i][k].hitsNum--; 
                            if(objects[i][k].hitsNum <= 0) 
                            { 
                                doCreation(i, k, 2); 
                                objects[i][k].status = 0; 
                            } 
                        } 
                        objects[j][l].status = 0; 
                        main_lives--; 
                        if(main_lives >= 0) 
                            makeMainEnter(); 
                        else 
                            main_gameover = true; 
                    } 
                if(j == 4) 
                    l = 20; 
            } 
 
        } 
 
    } 
 
    public void collisionDetection() 
    { 
        checkCol(0, 1); 
        if(mainEnterMode == 0 && !main_levelend && !SCREENSHOT_MODE) 
        { 
            checkCol(0, 4); 
            checkCol(2, 4); 
        } 
    } 
 
    public void add(int i, int j, int k, int l, int i1, int j1) 
    { 
        int k1 = inits.inits[i].type; 
        int l1 = i; 
        if(l1 == 39) 
        { 
            levelEndCounter = 0; 
            return; 
        } 
        int i2 = 0; 
        if(j1 != -1 && i1 == k1) 
            i2 = j1; 
        for(int j2 = i2; j2 < 15; j2++) 
            if(objects[k1][j2].status == 0) 
            { 
                objects[k1][j2].ID = idCounter; 
                idCounter++; 
                objects[k1][j2].status = 1; 
                objects[k1][j2].imageNumber = inits.inits[l1].imageNumber; 
                objects[k1][j2].screenPos[0] = k; 
                objects[k1][j2].screenPos[1] = l; 
                objects[k1][j2].position[0] = k * 64; 
                objects[k1][j2].position[1] = l * 64; 
                objects[k1][j2].clip = inits.inits[l1].clip; 
                objects[k1][j2].hierarchyType = inits.inits[l1].hierarchy; 
                if(inits.inits[l1].hierarchy != 0) 
                { 
                    objects[k1][j2].hierarchyType = inits.inits[l1].hierarchy; 
                    objects[k1][j2].motherTyp = i1; 
                    objects[k1][j2].motherNo = j1; 
                    objects[k1][j2].motherID = objects[i1][j1].ID; 
                    objects[k1][j2].motherPosition[0] = objects[i1][j1].position[0]; 
                    objects[k1][j2].motherPosition[1] = objects[i1][j1].position[1]; 
                } 
                if(objects[k1][j2].imageNumber == -1) 
                { 
                    objects[k1][j2].size[0] = 0; 
                    objects[k1][j2].size[1] = 0; 
                } else 
                { 
                    objects[k1][j2].size[0] = images.images[objects[k1][j2].imageNumber].size[0]; 
                    objects[k1][j2].size[1] = images.images[objects[k1][j2].imageNumber].size[1]; 
                } 
                objects[k1][j2].script = j; 
                objects[k1][j2].scriptPos = 0; 
                objects[k1][j2].scriptCounter = 0; 
                if(j != -1) 
                { 
                    objects[k1][j2].direction = script[j].initDir * 15; 
                    objects[k1][j2].facing = script[j].initDir * 15; 
                    objects[k1][j2].speed = script[j].initSpeed * 30; 
                } else 
                { 
                    int k2 = inits.inits[l1].script; 
                    if(k2 != -1) 
                    { 
                        objects[k1][j2].script = k2; 
                        objects[k1][j2].direction = script[k2].initDir * 15; 
                        objects[k1][j2].facing = script[k2].initDir * 15; 
                        objects[k1][j2].speed = script[k2].initSpeed * 30; 
                    } else 
                    { 
                        objects[k1][j2].facing = 0; 
                        objects[k1][j2].direction = 0; 
                        objects[k1][j2].speed = 0; 
                    } 
                } 
                if(inits.inits[l1].speed != -99) 
                    objects[k1][j2].speed = inits.inits[l1].speed * 30; 
                objects[k1][j2].colSize[0] = inits.inits[l1].colSize[0]; 
                objects[k1][j2].colSize[1] = inits.inits[l1].colSize[1]; 
                objects[k1][j2].hitsNum = inits.inits[l1].hits; 
                objects[k1][j2].hitsTotal = inits.inits[l1].hits; 
                objects[k1][j2].animationType = inits.inits[l1].animType; 
                objects[k1][j2].animationSpeed = inits.inits[l1].animSpeed; 
                objects[k1][j2].animationMax = inits.inits[l1].numberOfAnimations; 
                objects[k1][j2].animationCurrent = 0; 
                objects[k1][j2].animationCounter = -1; 
                for(int l2 = 0; l2 < 5; l2++) 
                { 
                    objects[k1][j2].creations[l2].type = inits.inits[l1].creations[l2].type; 
                    objects[k1][j2].creations[l2].init = inits.inits[l1].creations[l2].init; 
                    objects[k1][j2].creations[l2].offset[0] = inits.inits[l1].creations[l2].offset[0]; 
                    objects[k1][j2].creations[l2].offset[1] = inits.inits[l1].creations[l2].offset[1]; 
                    objects[k1][j2].creations[l2].timer = inits.inits[l1].creations[l2].timer; 
                    objects[k1][j2].creations[l2].counter = 0; 
                    objects[k1][j2].creations[l2].active = false; 
                    objects[k1][j2].creations[l2].offsetRotation = inits.inits[l1].creations[l2].offsetRotation; 
                    if(objects[k1][j2].creations[l2].type == 3) 
                    { 
                        objects[k1][j2].creations[l2].type = 4; 
                        objects[k1][j2].creations[l2].active = true; 
                    } 
                } 
 
                objects[k1][j2].score = inits.inits[l1].score; 
                latestType = k1; 
                latestNumber = j2; 
                latestSize[0] = objects[k1][j2].size[0]; 
                latestSize[1] = objects[k1][j2].size[1]; 
                latestFailed = false; 
                return; 
            } 
 
        latestFailed = true; 
    } 
 
    public void drawArray(Graphics g, int i) 
    { 
        for(int j = 0; j < 15; j++) 
            if(objects[i][j].status != 0) 
                images.draw(g, objects[i][j].imageNumber, objects[i][j].animationCurrent, objects[i][j].screenPos[0], objects[i][j].screenPos[1]); 
 
    } 
 
    public void draw(Graphics g) 
    { 
        drawArray(g, 0); 
        drawArray(g, 1); 
        if(mainEnterMode <= 0 || memc != 0) 
            drawArray(g, 4); 
        drawArray(g, 3); 
        drawArray(g, 2); 
    } 
}