// Fountain test script

#pragma version(1)
#pragma stateVertex(orthoWindow)
#pragma stateRaster(flat)
#pragma stateFragment(PgmFragBackground)
#pragma stateStore(MyBlend)


int main(void* con, int ft, int launchID) {
    int count, touch, x, y, rate, maxLife, lifeShift;
    int life;
    int ct, ct2;
    int newPart;
    int drawCount;
    int dx, dy, idx;
    int posx,posy;
    int c;
    int srcIdx;
    int dstIdx;

    count = loadI32(con, 0, 1);
    touch = loadI32(con, 0, 2);
    x = loadI32(con, 0, 3);
    y = loadI32(con, 0, 4);

    rate = 4;
    maxLife = (count / rate) - 1;
    lifeShift = 0;
    {
        life = maxLife;
        while (life > 255) {
            life = life >> 1;
            lifeShift ++;
        }
    }

    drawRect(con, 0, 256, 0, 512);
    contextBindProgramFragment(con, NAMED_PgmFragParts);

    if (touch) {
        newPart = loadI32(con, 2, 0);
        for (ct2=0; ct2<rate; ct2++) {
            dx = scriptRand(con, 0x10000) - 0x8000;
            dy = scriptRand(con, 0x10000) - 0x8000;

            idx = newPart * 5 + 1;
            storeI32(con, 2, idx, dx);
            storeI32(con, 2, idx + 1, dy);
            storeI32(con, 2, idx + 2, maxLife);
            storeI32(con, 2, idx + 3, x << 16);
            storeI32(con, 2, idx + 4, y << 16);

            newPart++;
            if (newPart >= count) {
                newPart = 0;
            }
        }
        storeI32(con, 2, 0, newPart);
    }

    drawCount = 0;
    for (ct=0; ct < count; ct++) {
        srcIdx = ct * 5 + 1;

        dx = loadI32(con, 2, srcIdx);
        dy = loadI32(con, 2, srcIdx + 1);
        life = loadI32(con, 2, srcIdx + 2);
        posx = loadI32(con, 2, srcIdx + 3);
        posy = loadI32(con, 2, srcIdx + 4);

        if (life) {
            if (posy < (480 << 16)) {
                dstIdx = drawCount * 9;
                c = 0xffafcf | ((life >> lifeShift) << 24);

                storeU32(con, 1, dstIdx, c);
                storeI32(con, 1, dstIdx + 1, posx);
                storeI32(con, 1, dstIdx + 2, posy);

                storeU32(con, 1, dstIdx + 3, c);
                storeI32(con, 1, dstIdx + 4, posx + 0x10000);
                storeI32(con, 1, dstIdx + 5, posy + dy * 4);

                storeU32(con, 1, dstIdx + 6, c);
                storeI32(con, 1, dstIdx + 7, posx - 0x10000);
                storeI32(con, 1, dstIdx + 8, posy + dy * 4);
                drawCount ++;
            } else {
                if (dy > 0) {
                    dy = (-dy) >> 1;
                }
            }

            posx = posx + dx;
            posy = posy + dy;
            dy = dy + 0x400;
            life --;

            //storeI32(con, 2, srcIdx, dx);
            storeI32(con, 2, srcIdx + 1, dy);
            storeI32(con, 2, srcIdx + 2, life);
            storeI32(con, 2, srcIdx + 3, posx);
            storeI32(con, 2, srcIdx + 4, posy);
        }
    }

    drawTriangleArray(con, NAMED_PartBuffer, drawCount);
    return 1;
}