Beispiel #1
0
/*! Add new fire */
static void ws2812_anim_fire_update_burn(tu_ws2812_anim * pThis) {

    size_t lCountX;
    uint8_t lHeat;
    uint8_t lRandom;

    uint8_t lHeatBackup[3];

    /* only on first row */
    for(lCountX = 0; lCountX < WS2812_NR_COLUMNS; lCountX++) {

        lHeat = pThis->mFire.mHeat[lCountX];
        lRandom = xorshift8_range(MIN_HEAT_UP, MAX_HEAT_UP);

        if(xorshift8() < xorshift8()) {

            /* heat up */
            lHeat = add8_cl(lHeat, lRandom, MAX_HEAT);

        } else {

            /* cool down */
            lHeat = sub8_f(lHeat, lRandom);
        }
        pThis->mFire.mHeat[lCountX] = lHeat;
    }

    /* blurr the first line to limit high variation */
    lHeatBackup[0] = 0;
    lHeatBackup[1] = pThis->mFire.mHeat[0];
    lHeatBackup[2] = pThis->mFire.mHeat[1];

    for(lCountX = 0; lCountX < WS2812_NR_COLUMNS; lCountX++) {

        lHeat = (uint8_t)(((uint32_t)lHeatBackup[0] + ((uint32_t)lHeatBackup[1] << 1) + (uint32_t)lHeatBackup[2]) >> 2);

        lHeatBackup[0] = lHeatBackup[1];
        lHeatBackup[1] = lHeatBackup[2];
        if(lCountX < WS2812_NR_COLUMNS-1) {
            lHeatBackup[2] = pThis->mFire.mHeat[lCountX + 1];
        } else {
            lHeatBackup[2] = 0;
        }

        pThis->mFire.mHeat[lCountX] = lHeat;
    }
}
Beispiel #2
0
void do_key(char key)
{
    short i, j;
    while (ANYKEY())
    {
        readkeyboard();
        do_halt();
    }

    if (minefield[key])
    {
        // boom
        drawstring("Oops, you appear to have stepped", 0, 176);
        drawstring("on a rotten egg and died.       ", 0, 184);
        for (j = 0; j < 20; j++)
        {
            playfx(1);
            for (i = 0; i < 32*21; i++)
            {
                if (xorshift8() > 220)
                    *((char*)0x4000+192*32+i) = xorshift8() & 7;
            }
            for (i = 0; i < 51; i++) xorshift8();
            do_halt();
        }        
        reset_game();    
    }
    else
    {
        drawval(key, count_mines(key));
        if (minefound[key] == 0)
        {
            minefound[key] = 1;
            found++;
            if (found == total)
            {
                framecounter = 0;
                drawstring("Congratulations!! You did it!   ", 0, 176);
                drawstring("Step on a mine for a new game.  ", 0, 184);
            }
        }
        playfx(0);
    }    
}
Beispiel #3
0
void setup_mines()
{
    unsigned char i;
    total = 0;
    for (i = 0; i < 40; i++)
    {
        if (xorshift8() > 200)
        {
            minefield[i] = 1;            
        }
        else
        {
            minefield[i] = 0;
            total++;
        }
        minefound[i] = 0;
    }
}